четверг, 13 ноября 2014 г.

Получение списка дисков ->Мой компьютер

Вариант №1
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 файлы имеют определенную структуру и есть возможность не прочитать состояние.

С вступлением закончили - идем по коду

Получение списка свойств компонента

*.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  и самое главное используя метод научного втыка начинаем использовать самописный ява код в билдере.

четверг, 12 июня 2014 г.

Несколько вариантов шифрования

№1 Примитивное шифрование встроенными средствами

№2 Немного модифицированный Магический квадрат
согласно правил
Сгенерить квадрат можно тут


пятница, 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);

Создание каталога с подкаталогом

ForceDirectories("C:\\NonExistantDir\\TestDir");

Полное имя пользователя 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));


Получение IP

Показать 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();  
      }