Перейти к содержанию
Fire Monkey от А до Я

antarey

Пользователи
  • Постов

    284
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Весь контент antarey

  1. Есть возможность изменить шрифт для итемов TComboBox, желательно в динамике, хотя и в дизайнере не помешало - до итемов добрался - но изменения TextSettings ничего не дают
  2. Прикольно. Если на андроиде формы поддерживают прозрачность - проще кинуть на форму панель, а саму форму сделать полностью прозрачной
  3. Получить модальную форму особого размера
  4. Как изменить размеры формы для андроид? FormRactor->Windth/Height = ..... ничего не дают
  5. Вот SaveStateIni.h // --------------------------------------------------------------------------- #ifndef SaveStateIniH #define SaveStateIniH // --------------------------------------------------------------------------- #include <FMX.Forms.hpp> #include <System.Classes.hpp> #include <System.SysUtils.hpp> #include <System.IOUtils.hpp> #include <Xml.XMLIntf.hpp> #include <Xml.XMLDoc.hpp> #include <FMX.Calendar.hpp> #include <FMX.NumberBox.hpp> #include <FMX.SpinBox.hpp> #include <FMX.ComboEdit.hpp> #include <FMX.ComboTrackBar.hpp> #include <sysvari.h> // --------------------------------------------------------------------------- class TSavaStateIni { public: void SaveFormState(TForm *forma); void LoadFormState(TForm *forma); }; #endif SaveStateIni.cpp // --------------------------------------------------------------------------- #include <fmx.h> #pragma hdrstop #include "SaveStateIni.h" // --------------------------------------------------------------------------- #pragma package(smart_init) const System::String SavePath = System::Ioutils::TPath::Combine (System::Ioutils::TPath::GetDocumentsPath(), System::Ioutils::TPath::GetFileNameWithoutExtension(ParamStr(0)) + ".xml"); TFmxObject *FMXObj; void TSavaStateIni::SaveFormState(TForm *forma) { TXMLDocument *XMLDocument = new TXMLDocument(Application); XMLDocument->Active = true; XMLDocument->Encoding = "UTF-8"; XMLDocument->Options = XMLDocument->Options << doNodeAutoIndent; _di_IXMLNode parentNode, formaNode; if (FileExists(SavePath)) { XMLDocument->LoadFromFile(SavePath); parentNode = XMLDocument->DocumentElement; } else { parentNode = XMLDocument->AddChild("xml"); } if (XMLDocument->DocumentElement->ChildNodes->FindNode(forma->Name)) formaNode = XMLDocument->DocumentElement->ChildNodes->FindNode (forma->Name); else formaNode = parentNode->AddChild(forma->Name); try { for (int i = 0; i < forma->ComponentCount; i++) { if (dynamic_cast<TFmxObject*>(forma->Components[i])) { FMXObj = dynamic_cast<TFmxObject*>(forma->Components[i]); _di_IXMLNode nodNew = formaNode->ChildNodes->FindNode(FMXObj->Name); if (!nodNew) nodNew = formaNode->AddChild(FMXObj->Name); if (dynamic_cast<TCheckBox*>(FMXObj)) nodNew->SetAttribute("data", ((TCheckBox*)FMXObj)->IsChecked); if (dynamic_cast<TRadioButton*>(FMXObj)) nodNew->SetAttribute("data", ((TRadioButton*)FMXObj)->IsChecked); if (dynamic_cast<TSwitch*>(FMXObj)) nodNew->SetAttribute("data", ((TSwitch*)FMXObj)->IsChecked); if (dynamic_cast<TComboBox*>(FMXObj)) nodNew->SetAttribute("data", ((TComboBox*)FMXObj)->ItemIndex); if (dynamic_cast<TMemo*>(FMXObj)) nodNew->SetAttribute("data", ((TMemo*)FMXObj)->Lines->Text); if (dynamic_cast<TEdit*>(FMXObj)) nodNew->SetAttribute("data", ((TEdit*)FMXObj)->Text); if (dynamic_cast<TCalendar*>(FMXObj)) nodNew->SetAttribute("data", ((TCalendar*)FMXObj)->Date); if (dynamic_cast<TDateEdit*>(FMXObj)) nodNew->SetAttribute("data", ((TDateEdit*)FMXObj)->Date); if (dynamic_cast<TTimeEdit*>(FMXObj)) nodNew->SetAttribute("data", ((TTimeEdit*)FMXObj)->Time); if (dynamic_cast<TNumberBox*>(FMXObj)) nodNew->SetAttribute("data", ((TNumberBox*)FMXObj)->Value); if (dynamic_cast<TSpinBox*>(FMXObj)) nodNew->SetAttribute("data", ((TSpinBox*)FMXObj)->Value); if (dynamic_cast<TComboEdit*>(FMXObj)) { nodNew->SetAttribute("data", ((TComboEdit*)FMXObj)->Text); nodNew->SetAttribute("list", ((TComboEdit*)FMXObj)->Items->Text); } if (dynamic_cast<TComboTrackBar*>(FMXObj)) nodNew->SetAttribute("data", ((TComboTrackBar*)FMXObj)->Value); if (dynamic_cast<TTrackBar*>(FMXObj)) nodNew->SetAttribute("data", ((TTrackBar*)FMXObj)->Value); } } XMLDocument->SaveToFile(SavePath); } __finally { XMLDocument->Free(); } } // --------------------------------------------------------------------------- void TSavaStateIni::LoadFormState(TForm *forma) { if (FileExists(SavePath)) { TXMLDocument *XMLDocument = new TXMLDocument(Application); try { XMLDocument->Active = true; XMLDocument->Encoding = "UTF-8"; XMLDocument->Options = XMLDocument->Options << doNodeAutoIndent; XMLDocument->LoadFromFile(SavePath); _di_IXMLNode formaNode = XMLDocument->DocumentElement->ChildNodes->FindNode(forma->Name); if (formaNode) { for (int i = 0; i < forma->ComponentCount; i++) { if (dynamic_cast<TFmxObject*>(forma->Components[i])) { FMXObj = dynamic_cast<TFmxObject*>(forma->Components[i]); _di_IXMLNode nodNew = formaNode->ChildNodes->FindNode(FMXObj->Name); if (nodNew) { if (dynamic_cast<TCheckBox*>(FMXObj)) ((TCheckBox*)FMXObj)->IsChecked = BOOL(nodNew->GetAttribute("data")); if (dynamic_cast<TRadioButton*>(FMXObj)) ((TRadioButton*)FMXObj)->IsChecked = BOOL(nodNew->GetAttribute("data")); if (dynamic_cast<TSwitch*>(FMXObj)) ((TSwitch*)FMXObj)->IsChecked = BOOL(nodNew->GetAttribute("data")); if (dynamic_cast<TComboBox*>(FMXObj)) ((TComboBox*)FMXObj)->ItemIndex = nodNew->GetAttribute("data"); if (dynamic_cast<TMemo*>(FMXObj)) ((TMemo*)FMXObj)->Lines->Text = nodNew->GetAttribute("data"); if (dynamic_cast<TEdit*>(FMXObj)) ((TEdit*)FMXObj)->Text = nodNew->GetAttribute("data"); if (dynamic_cast<TCalendar*>(FMXObj)) ((TCalendar*)FMXObj)->Date = Date(nodNew->GetAttribute("data").AsType (0x0007)); if (dynamic_cast<TDateEdit*>(FMXObj)) ((TDateEdit*)FMXObj)->Date = nodNew->GetAttribute("data"); if (dynamic_cast<TTimeEdit*>(FMXObj)) ((TTimeEdit*)FMXObj)->Time = nodNew->GetAttribute("data"); if (dynamic_cast<TNumberBox*>(FMXObj)) ((TNumberBox*)FMXObj)->Value = nodNew->GetAttribute("data"); if (dynamic_cast<TSpinBox*>(FMXObj)) ((TSpinBox*)FMXObj)->Value = nodNew->GetAttribute("data"); if (dynamic_cast<TComboEdit*>(FMXObj)) { ((TComboEdit*)FMXObj)->Text = nodNew->GetAttribute("data"); ((TComboEdit*)FMXObj)->Items->Text = nodNew->GetAttribute("list"); } if (dynamic_cast<TComboTrackBar*>(FMXObj)) ((TComboTrackBar*)FMXObj)->Value = nodNew->GetAttribute("data"); if (dynamic_cast<TTrackBar*>(FMXObj)) ((TTrackBar*)FMXObj)->Value = nodNew->GetAttribute("data"); } } } } } __finally { XMLDocument->Free(); } } } // --------------------------------------------------------------------------- _frmMain.cpp // --------------------------------------------------------------------------- #include <fmx.h> #pragma hdrstop #include "_frmMain.h" #include "SaveStateIni.h" // --------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TfrmMain *frmMain; // --------------------------------------------------------------------------- __fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) { } // --------------------------------------------------------------------------- void __fastcall TfrmMain::Button1Click(TObject *Sender) { TSavaStateIni *st; st->LoadFormState(frmMain); } // --------------------------------------------------------------------------- void __fastcall TfrmMain::Button2Click(TObject *Sender) { TSavaStateIni *st; st->SaveFormState(frmMain); } // ---------------------------------------------------------------------------
  6. Та же фигня и с [bccaarm Error] SaveStateIni.cpp(102): no viable conversion from 'System::OleVariant' to 'System::TDate' [bccaarm Error] SaveStateIni.cpp(103): no viable conversion from 'System::OleVariant' to 'System::TTime'
  7. Да что-то они последнее время молчат
  8. estra [bccaarm Error] SaveStateIni.cpp(97): cannot cast 'System::OleVariant' to its protected base class 'System::Variant' sysvari.h(2920): declared protected here
  9. Подскажите как в билдере для андроида правильно преобразовать OleVariant в bool? if(dynamic_cast<TCheckBox*>(FMXObj)) ((TCheckBox*)FMXObj)->IsChecked= bool(nodNew->GetAttribute("data")); на вин платформе все нормально, а на андроиде [bccaarm Error] SaveStateIni.cpp(97): ambiguous conversion for functional-style cast from 'System::OleVariant' to 'bool'
  10. по предыдущему вопросу - билдер так и пишет Народ, помогите победить в C++ BuilderXE7 вот что записано {"Edit1":"{\"data\":\"test\"}"} код для записи void __fastcall TfrmMain::FormSaveState(TObject *Sender) { const System::String DATA_FIELD = "data"; SaveState->Name=System::Ioutils::TPath::GetFileNameWithoutExtension(ParamStr(0)); SaveState->StoragePath = System::Ioutils::TPath::GetHomePath(); TJSONObject *FormJSONObject; TFmxObject *FMXObj; TJSONObject *FMXJObj; TBinaryWriter *W; SaveState->Stream->Clear(); W = new TBinaryWriter(SaveState->Stream, TEncoding::UTF8, false); FormJSONObject = new TJSONObject(); for (int i = 0; i < ComponentCount; i++) { if (dynamic_cast<TFmxObject*>(Components[i])) { FMXObj=dynamic_cast<TFmxObject*>(Components[i]); FMXJObj = new TJSONObject(); switch (FMXObj->Data.Kind) { case tkUnknown: break; case tkInteger: FMXJObj->AddPair(DATA_FIELD, new TJSONNumber(FMXObj->Data.AsInteger()));break; case tkChar: break; case tkEnumeration: if (FMXObj->Data.AsBoolean())FMXJObj->AddPair(DATA_FIELD, new TJSONTrue()); else FMXJObj->AddPair(DATA_FIELD, new TJSONFalse());break; case tkFloat: FMXJObj->AddPair(DATA_FIELD,FMXObj->Data.AsVariant());break; case tkString: FMXJObj->AddPair(DATA_FIELD, FMXObj->Data.AsString());break; case tkUString: FMXJObj->AddPair( DATA_FIELD,FMXObj->Data.AsString());break; case tkLString: FMXJObj->AddPair(DATA_FIELD, FMXObj->Data.AsString());break; case tkWString: FMXJObj->AddPair(DATA_FIELD, FMXObj->Data.AsString());break; case tkSet: break; case tkClass: break; case tkMethod: break; case tkWChar: break; case tkVariant: break; case tkArray: break; case tkRecord: break; case tkInterface: break; case tkInt64: break; case tkDynArray: break; case tkClassRef: break; case tkPointer: break; case tkProcedure: break; } FormJSONObject->AddPair(FMXObj->Name, FMXJObj->ToJSON()); } } try { W->Write(FormJSONObject->ToJSON()); } __finally { W->Free(); FormJSONObject->Free(); FMXJObj->Free(); } } //--------------------------------------------------------------------------- вот так пытаюсь читать void __fastcall TfrmMain::FormCreate(TObject *Sender) { SaveState->Name=System::Ioutils::TPath::GetFileNameWithoutExtension(ParamStr(0)); SaveState->StoragePath = System::Ioutils::TPath::GetHomePath(); TBinaryReader *R = new TBinaryReader(SaveState->Stream, TEncoding::UTF8, false); if (SaveState->Stream->Size >0) { TJSONObject *jObj = static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(R->ReadString())); TJSONObject *jItem = static_cast<TJSONObject*>(jObj->Get("Edit1")->JsonValue); Edit1->Text = jItem->Get("data")->JsonValue->Value(); } R->Free(); } //--------------------------------------------------------------------------- на Edit1->Text = jItem->Get("data")->JsonValue->Value(); выдает access violation уже перепробовал все возможные варианты чтения Edit1->Text = jItem->Values[0]->ToString(); Edit1->Text = jItem->Values["data"]->ToString(); Edit1->Text = jItem->Values["data"]->Value(); Edit1->Text = jItem->GetValue("data")->Value(); хотя Edit1->Text = jItem->Value(); выдает {"data":"test"} - тоесть данные есть - но какого они не читаются Забодался уже, толи лижи не едут, толи я ..., толи ембарседеро что-то нафигачело в билдере Всем заранее спасибо
  11. Один нюанс- в делфи FormJSONObject.AddPair(FMXObj.Name, FMXJObj) в файле ‘{"Edit1":{"data":"qwerty"},"Edit2":{"data":"adfsdaf"},"GroupBox1":{"data":"Your Preferred OS"},"RadioButton1":{"data":false},"RadioButton2":{"data":true},"RadioButton3":{"data":false},"RadioButton4":{"data":false},"Label1":{"data":"Firstname"},"Label2":{"data":"Lastname"}} В билдере FormJSONObject.AddPair(FMXObj.Name, FMXJObj) выдает ошибку неверный указатель если FormJSONObject->AddPair(FMXObj->Name, FMXJObj->ToJSON()); то записывается как Б{"Switch1":"{\"data\":\"Switch1\"}","Edit1":"{\"data\":\"ADS\"}","Memo1":"{\"data\":\"Switch1\\r\\nADS\\r\\nSwitch1\\r\\nADS\\r\\nComboBox1\\r\\n{\\\"Switch1\\\":\\\"{\\\\\\\"data\\\\\\\":\\\\\\\"Switch1\\\\\\\"}\\\",\\\"Edit1\\\":\\\"{\\\\\\\"data\\\\\\\":\\\\\\\"ADS\\\\\\\"}\\\",\\\"Memo1\\\":\\\"{\\\\\\\"data\\\\\\\":\\\\\\\"Switch1\\\\\\\\r\\\\\\\\nADS\\\\\\\"}\\\",\\\"CheckBox1\\\":\\\"{}\\\",\\\"RadioButton1\\\":\\\"{}\\\",\\\"RadioButton2\\\":\\\"{}\\\",\\\"ComboBox1\\\":\\\"{\\\\\\\"data\\\\\\\":\\\\\\\"ComboBox1\\\\\\\"}\\\",\\\"Button1\\\":\\\"{}\\\"}\\r\\nSwitch1\\r\\nADS\"}","CheckBox1":"{}","RadioButton1":"{}","RadioButton2":"{}","ComboBox1":"{\"data\":\"ComboBox1\"}","Button1":"{}"} тоесть добавляется "\" - как правильно перевести с делфи на с++??
  12. ну почему access violation - разобрался - вызов SaveState производится без объекта если frmMain->SaveState -то все нормально. Но связать вызывающую форму с кодом не привязываясь к конкретному имени формы?
  13. antarey

    C++Builder & SaveState

    Пытаюсь переделать под билдер Automate Save State Feature in Firemonkey Как говорят вроде все просто, но толи лижи не едут ну и т.д. делфи код Что наваял: SaveStateHelper.h #ifndef SaveStateHelperH #define SaveStateHelperH //--------------------------------------------------------------------------- #include <FMX.Forms.hpp> #include <System.Classes.hpp> #include <System.SysUtils.hpp> #include <FMX.Types.hpp> #include <System.JSON.hpp> //--------------------------------------------------------------------------- class TSaveStateHelper : public TCustomForm { __published: private: // User declarations public: // User declarations void SaveFormState(); void LoadFormState(); void Init(); }; #endif SaveStateHelper.cpp //--------------------------------------------------------------------------- #pragma hdrstop #include "SaveStateHelper.h" #include <System.IOUtils.hpp> //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- void TSaveStateHelper::Init() { SaveState->Name=System::Ioutils::TPath::GetFileNameWithoutExtension(ParamStr(0)); SaveState->StoragePath = System::Ioutils::TPath::GetHomePath(); } //--------------------------------------------------------------------------- void TSaveStateHelper::LoadFormState() { TBinaryReader *R; TJSONObject *FormJSONObject; TFmxObject *FMXObj; TJSONObject *FMXJObj; if (SaveState->Stream->Size >0) { } } //--------------------------------------------------------------------------- и при вызове LoadFormState получаю access violation Что не так
  14. Необходимо реализовать диалог выбора каталога компьютера с андроид устройства. Подскажите хоть в какую сторону копать, если в обратном порядке есть идеи Диалог выбора каталога с компьютера на андроиде то тут вообще темень. На маркете есть куча самба клиентов - но это реализовать на обезьяне???
  15. Необходимо реализовать диалог просмотра каталогов андроид устройства с виндовс платформы. Что я смог придумать - это использовать Аднроид СДК. На устройстве, если подключение по WiFi, запускаем ADB Wireless. На десктопе используем adb.exe , можно вместе AdbWinApi.dll закинуть в каталог с программой. Дальше конектимся к андроиду, скидываем список каталогов в текстовый файл, ну и читаем. В принципе ничего сложного, но может у кого-то есть описание функций AdbWinApi.dll или есть другой способ? Если использовать adb.exe - какой компонент лучше использовать для построения списка каталогов/файлов с иконками, хотя бы примитивными, а в идеале как прочитать иконку файла, если такова имеется?
  16. Я в самом начале написал, что если будет необходимость - разобью на две темы - не проблема За ресурс Ефимова я знаю, читаю. По гуглу пока толком ничего не нашел. Разобью на две темы, а дальше будем общаться - если у кого-то будет желание
  17. Вообще-то андроид должен понимать самба путь,возможно с манипуляциями, на маркете полно самба клиентов
  18. Ну по логике сама ИДЕ должна перестроить на нужный путь - возможно нужен обратный слеш, дойдут руки в приложении до етого пункта - надо будет попробовать
  19. У меня база SQLite - достаточно будет прописать для мобильного клиента путь к базе типа \\192.168.1.8\d\DataBase\database.3db ?
  20. ИМНО проще на уровне столбцов, если на уровне таблиц - надо в динамике корректировать квери а на уровне столбцов - добавляем одну табличку с идентификатором языка а дальше все просто select case when (select LangName from userLang where userLangID=1)='UA' then TypeNameUA when (select LangName from userLang where userLangID=1)='RU' then TypeNameRU end as TypeName from sprOperType Но за ответ спасибо
  21. Ну в локальной сети папку то я розшарю - не проблема А вот как достучаться к базе на мобильном приложении,там приколы с разрешениями да и надо как-то получить путь к базе Если что-то найду - выложу ну и к тебе аналогичная просьба
  22. ruslan, а я и не прошу написать мне программу, я пока в этом вопросе пока вообще ничего не знаю Для начала мне надо знать хотя-бы с чего начать ,в какую сторону смотреть, а уже потом будут конкретные вопросы
  23. Есть таблицы справочников. Как лучше организовать мультиязычность - на уровне столбцов или таблиц? Спасибо
×
×
  • Создать...