C++ Builder
Разработка приложений в среде C++Builder
пятница, 28 ноября 2014 г.
четверг, 13 ноября 2014 г.
Получение списка дисков ->Мой компьютер
Вариант №1
Вариант № 2
LPITEMIDLIST pidlMyComp; if (::SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, &pidlMyComp) != NOERROR) return; LPSHELLFOLDER test; ::SHGetDesktopFolder(&test); LPSHELLFOLDER psfParent; test->BindToObject(pidlMyComp, NULL, IID_IShellFolder, (void**) &psfParent); LPENUMIDLIST pEnum; psfParent->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &pEnum); LPITEMIDLIST pidlTemp; ULONG dwFetched; STRRET ret; while (pEnum->Next(1, &pidlTemp, &dwFetched) == NOERROR) { if (psfParent->GetDisplayNameOf(pidlTemp, SHGDN_NORMAL, &ret) == NOERROR) ShowMessage(ret.pOleStr); }
Вариант № 2
int n; bool Flag; DWORD dr = GetLogicalDrives(); for(int x=0;x<26;x++) { n = ((dr>>x)&1); if(n) { String dl = String((char)(65+x)); bool ready = DirectoryExists(dl+":\\"); if (ready) { Memo1->Lines->Add(dl); } } }
четверг, 23 октября 2014 г.
Сохранение свойств контролов aka SaveState
В ХЕ7 добавили SaveState - пародию на SharedPreferences , подробнее тут и тут .
Но в отличии от андроида, если используете Android Studio, где достаточно реализовать только фейс - то в ХЕ7 необходимо помудохаться, особенно на С++Билдере .
Для делфи реализован класс для авто сохранения свойств , но он точно не сохраняет состояние TComboBox.
Вообще в Рад Студии со свойствами намутили , слов нет.
К примеру :
TCheckBox = class(TTextControl, IIsChecked)
То есть к свойству IsChecked можно добраться через интерфейс IIsChecked
А вот для RadioButton к IsChecked через интерфейс IIsChecked не доберешься.
Короче приходится изобретать свой трахтер.
Итак:
Для записи/восстановления будем использовать JSON и XML - кому что больше нравиться. Преимущество XML в том, что можно сохранить состояние нескольких форм,с JSON у меня не получилось записать состояние нескольких форм - файл перезаписывается. При записи текстовых полей будем кодировать в Бейс 64 - так как теоретически могут храниться любые символы, а JSON и XML файлы имеют определенную структуру и есть возможность не прочитать состояние.
С вступлением закончили - идем по коду
Но в отличии от андроида, если используете Android Studio, где достаточно реализовать только фейс - то в ХЕ7 необходимо помудохаться, особенно на С++Билдере .
Для делфи реализован класс для авто сохранения свойств , но он точно не сохраняет состояние TComboBox.
Вообще в Рад Студии со свойствами намутили , слов нет.
К примеру :
TCheckBox = class(TTextControl, IIsChecked)
То есть к свойству IsChecked можно добраться через интерфейс IIsChecked
А вот для RadioButton к IsChecked через интерфейс IIsChecked не доберешься.
Короче приходится изобретать свой трахтер.
Итак:
Для записи/восстановления будем использовать JSON и XML - кому что больше нравиться. Преимущество XML в том, что можно сохранить состояние нескольких форм,с JSON у меня не получилось записать состояние нескольких форм - файл перезаписывается. При записи текстовых полей будем кодировать в Бейс 64 - так как теоретически могут храниться любые символы, а JSON и XML файлы имеют определенную структуру и есть возможность не прочитать состояние.
С вступлением закончили - идем по коду
Получение списка свойств компонента
*.h
public: // User declarations TStrings* GetPropertyList(TFmxObject *Component,bool includePropType);*.cpp
// --------------------------------------------------------------------------- TStrings* TfrmMain::GetPropertyList(TFmxObject *Component,bool includePropType) { Typinfo::TTypeKinds SupportKinds; SupportKinds << tkUnknown << tkInteger << tkChar << tkEnumeration << tkFloat << tkString << tkSet << tkClass << tkMethod << tkWChar << tkLString << tkWString << tkVariant << tkArray << tkRecord << tkInterface << tkInt64 << tkDynArray; Typinfo::TPropList pList; TStrings *propList = new TStringList(); AnsiString propName,propType; //получаем список свойств int nPropCount = GetPropList((Typinfo::PTypeInfo)(Component->ClassInfo()), SupportKinds, ((Typinfo::PPropList)(&pList))); for( int j = 0; j < nPropCount; j++) { propName=pList[j]->Name; propType=(*(pList[j]->PropType))->Name; if (includePropType)propList->Add(propName + " : "+ propType); else propList->Add(propName); } return propList; } // ---------------------------------------------------------------------------
вторник, 8 июля 2014 г.
Использование своего Ява кода в C++Builder XE6
Итак, накурившись , до синеватого оттенка формы лица , разных мануалов, в частности Launching activities and handling results in Delphi XE5 Android apps и поморочив голову представителям ембарсадеро Brovin Yaroslav и самое главное используя метод научного втыка начинаем использовать самописный ява код в билдере.
пятница, 4 июля 2014 г.
Обертки Андроид АПИ для Delphi/C++Builder
Если надо обертки андроид АПИ - Full Android SDK Interface Files In Object Pascal For Firemonkey можно скачать тут
Или же можно самому сгенерить утилитой java2pas - качаем
Или же можно самому сгенерить утилитой java2pas - качаем
четверг, 12 июня 2014 г.
Несколько вариантов шифрования
№1 Примитивное шифрование встроенными средствами
№2 Немного модифицированный Магический квадрат
согласно правил
Сгенерить квадрат можно тут
№1 Примитивное шифрование встроенными средствами
№2 Немного модифицированный Магический квадрат
согласно правил
Сгенерить квадрат можно тут
вторник, 4 марта 2014 г.
Изменение параметров шрифта для всех компонентов на форме VCL/Firemonkey/Android
Рассмотрим изменение параметров шрифта
пятница, 28 февраля 2014 г.
Запуск внешних программ из приложения
1.ShellExecute(NULL,"open",fn.c_str(),NULL,NULL,SW_SHOWNORMAL); 2.#include <process.h> if(0==spawnlp(P_WAIT,otkyda.c_str(),NULL)){} 3. new_fn=fn.SubString(1,fn.Length()-4); unpack_cmd=ExtractFilePath(Application->ExeName)+"\\unzip.exe "+fn+" -d "+CurDir+"\\Tmp"; //spawnl(P_WAIT,"c:\\Windows\\unzip.exe", unpack_cmd.c_str(), NULL); PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; siStartInfo.cb = sizeof(STARTUPINFO); GetStartupInfo(&siStartInfo); siStartInfo.wShowWindow=SW_HIDE; if (!CreateProcess(NULL,unpack_cmd.c_bstr(),NULL,NULL,0,0,NULL,NULL,&siStartInfo,&piProcInfo)) { ShowMessage("Not run"); return; }; DWORD rc = WaitForSingleObject(piProcInfo.hProcess,INFINITE);
Полное имя пользователя Windows
#define SECURITY_WIN32 #include <security.h> #pragma comment(lib, "secur32.lib") DWORD size=1024; wchar_t buf[1024]; GetUserNameEx(3,buf,&size); ShowMessage(AnsiString(buf));
Имя пользователя в Windows
DWORD size=1024; wchar_t buf[1024]; GetUserName(buf, &size); ShowMessage(AnsiString(buf));
Показать PopUpMenu
TPointF FP; // Initialize the coordinates to the origin of the button control. FP.X = 0; FP.Y = 0; // Transposes the coordinates in the context of the form. FP = SpeedButton2->LocalToAbsolute(FP); // Transposes the coordinates in the context of the screen. FP = ClientToScreen(FP); // Display the popup menu at the computed coordinates. MainPopupMenu->Popup(FP.X-MainPopupMenu->Items[0]->Width-50, FP.Y+ToolBar1->Height);На андроиде глючит
:) Динамическое создание формы
Form2 = new TForm2( this ); try { Form2->ShowModal(); } __finally { Form2->Free(); }
Подписаться на:
Сообщения (Atom)