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)
