antarey
-
Постов
284 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Сообщения, опубликованные antarey
-
-
Прикольно. Если на андроиде формы поддерживают прозрачность - проще кинуть на форму панель, а саму форму сделать полностью прозрачной
-
Получить модальную форму особого размера
-
Как изменить размеры формы для андроид?
FormRactor->Windth/Height = ..... ничего не дают
-
Вот
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); } // ---------------------------------------------------------------------------
-
Та же фигня и с
[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' -
Да что-то они последнее время молчат
-
[bccaarm Error] SaveStateIni.cpp(97): cannot cast 'System::OleVariant' to its protected base class 'System::Variant'sysvari.h(2920): declared protected here
-
Подскажите как в билдере для андроида правильно преобразовать 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'
-
по предыдущему вопросу - билдер так и пишет
Народ, помогите победить в 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"} - тоесть данные есть - но какого они не читаютсяЗабодался уже, толи лижи не едут, толи я ..., толи ембарседеро что-то нафигачело в билдереВсем заранее спасибо -
Один нюанс-
в делфи
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":"{}"}
тоесть добавляется "\" - как правильно перевести с делфи на с++??
-
ну почему access violation - разобрался - вызов SaveState производится без объекта
если frmMain->SaveState -то все нормально.
Но связать вызывающую форму с кодом не привязываясь к конкретному имени формы?
-
Пытаюсь переделать под билдер Automate Save State Feature in Firemonkey
Как говорят вроде все просто, но толи лижи не едут ну и т.д.
делфи код
unit SaveStateHelper; interface uses FMX.Forms; type TSaveStateHelper = class helper for TCustomForm public const DATA_FIELD = 'data'; procedure SaveFormState; procedure LoadFormState; end; implementation uses System.JSON, FMX.Types, System.Classes, System.SysUtils; { TSaveStateHelper } procedure TSaveStateHelper.LoadFormState; var R: TBinaryReader; FormJSONObject: TJSONObject; I: Integer; FMXObj: TFmxObject; FMXJObj: TJSONObject; begin try if not(SaveState.Stream.Size > 0) then exit; // Recover previously typed values in all control. R := TBinaryReader.Create(SaveState.Stream); try FormJSONObject := TJSONObject.ParseJSONValue(R.ReadString) as TJSONObject; try for I := 0 to Self.ComponentCount - 1 do begin if not(Self.Components[I] is TFmxObject) then continue; FMXObj := Self.Components[I] as TFmxObject; FMXJObj := FormJSONObject.Values[FMXObj.Name] as TJSONObject; case FMXObj.Data.Kind of tkUnknown: ; tkInteger: FMXObj.Data := (FMXJObj.GetValue(DATA_FIELD) as TJSONNumber).AsInt; tkChar: ; tkEnumeration: if FMXJObj.GetValue(DATA_FIELD) is TJSONTrue then FMXObj.Data := true else FMXObj.Data := false; tkFloat: FMXObj.Data := (FMXJObj.GetValue(DATA_FIELD) as TJSONNumber).AsDouble; tkString, tkUString, tkLString, tkWString: FMXObj.Data := (FMXJObj.GetValue(DATA_FIELD) as TJSONString).Value; tkSet: ; tkClass: ; tkMethod: ; tkWChar: ; tkVariant: ; tkArray: ; tkRecord: ; tkInterface: ; tkInt64: FMXObj.Data := (FMXJObj.GetValue(DATA_FIELD) as TJSONNumber).AsInt64; tkDynArray: ; tkClassRef: ; tkPointer: ; tkProcedure: ; end; end; finally FormJSONObject.Free; end; finally R.Free; end; except on e: Exception do Log.d('SaveStateHelper', Self, e.Message); end; end; procedure TSaveStateHelper.SaveFormState; var FormJSONObject: TJSONObject; I: Integer; FMXObj: TFmxObject; FMXJObj: TJSONObject; W: TBinaryWriter; begin try FormJSONObject := TJSONObject.Create; try for I := 0 to Self.ComponentCount - 1 do begin if not(Self.Components[I] is TFmxObject) then continue; FMXObj := Self.Components[I] as TFmxObject; FMXJObj := TJSONObject.Create; case FMXObj.Data.Kind of tkUnknown: ; tkInteger: FMXJObj.AddPair(DATA_FIELD, TJSONNumber.Create(FMXObj.Data.AsInteger)); tkChar: ; tkEnumeration: if FMXObj.Data.AsBoolean then FMXJObj.AddPair(DATA_FIELD, TJSONTrue.Create) else FMXJObj.AddPair(DATA_FIELD, TJSONFalse.Create); tkFloat: FMXJObj.AddPair(DATA_FIELD, TJSONNumber.Create(FMXObj.Data.AsExtended)); tkString, tkUString, tkLString, tkWString: FMXJObj.AddPair(DATA_FIELD, FMXObj.Data.AsString); tkSet: ; tkClass: ; tkMethod: ; tkWChar: ; tkVariant: ; tkArray: ; tkRecord: ; tkInterface: ; tkInt64: FMXJObj.AddPair(DATA_FIELD, TJSONNumber.Create(FMXObj.Data.AsInt64)); tkDynArray: ; tkClassRef: ; tkPointer: ; tkProcedure: ; end; FormJSONObject.AddPair(FMXObj.Name, FMXJObj) end; SaveState.Stream.Clear; W := TBinaryWriter.Create(SaveState.Stream); try W.Write(FormJSONObject.ToJSON); finally W.Free; end; finally FormJSONObject.Free; end; except on e: Exception do Log.d('SaveStateHelper', Self, e.Message); end; end; end.
Что наваял:
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
Что не так
-
-
Необходимо реализовать диалог выбора каталога компьютера с андроид устройства.
Подскажите хоть в какую сторону копать, если в обратном порядке есть идеи Диалог выбора каталога с компьютера на андроиде
то тут вообще темень. На маркете есть куча самба клиентов - но это реализовать на обезьяне???
-
Необходимо реализовать диалог просмотра каталогов андроид устройства с виндовс платформы.
Что я смог придумать - это использовать Аднроид СДК.
На устройстве, если подключение по WiFi, запускаем ADB Wireless.
На десктопе используем adb.exe , можно вместе AdbWinApi.dll закинуть в каталог с программой.
Дальше конектимся к андроиду, скидываем список каталогов в текстовый файл, ну и читаем.
В принципе ничего сложного, но может у кого-то есть описание функций AdbWinApi.dll или есть другой способ?
Если использовать adb.exe - какой компонент лучше использовать для построения списка каталогов/файлов с иконками, хотя бы примитивными,
а в идеале как прочитать иконку файла, если такова имеется?
-
Ярослав - закройте тему
-
Я в самом начале написал, что если будет необходимость - разобью на две темы - не проблема
За ресурс Ефимова я знаю, читаю.
По гуглу пока толком ничего не нашел.
Разобью на две темы, а дальше будем общаться - если у кого-то будет желание
-
Вообще-то андроид должен понимать самба путь,возможно с манипуляциями, на маркете полно самба клиентов
-
Ну по логике сама ИДЕ должна перестроить на нужный путь - возможно нужен обратный слеш, дойдут руки в приложении до етого пункта - надо будет попробовать
-
У меня база SQLite - достаточно будет прописать для мобильного клиента путь к базе типа \\192.168.1.8\d\DataBase\database.3db ?
-
ИМНО проще на уровне столбцов, если на уровне таблиц - надо в динамике корректировать квери
а на уровне столбцов - добавляем одну табличку с идентификатором языка а дальше все просто
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
Но за ответ спасибо
-
Хм. Походу не в тот раздел ты отписался, надо было в консультации.
В целом тут скорее всего надо решить доступности файлов по локальной сети для начала.
Порывшись в сети вижу что без стороннего приложения это не решаемо, хотя могу и ошибаться.
Мне кажется что ваш путь лежит через AppTethering. И написании промежуточного ПО для синхронизации которые будет стоять на ПК.
А пересылка осуществляться обычным методом, т.е. приложение на ПК спрашивает сколько вообще записей в базе у андроид приложения, а потом начинает выгребает по частям, точнее андроид приложение берет часть строк из базы и передает их текстом в приложение на десктоп.
В теории, конечно, может быть AppTethering позволит вам и сразу базу перекинуть с андроид на комп и там уже синхронизировать всё и быстро.
Но наверняка не знаю.
Если найдешь то решение которые хочешь ты в чистом виде, то выложи пожалуйста потом сюда. Я думаю многим рано или поздно в их бизнес моделях пригодится эта информация.
Ну в локальной сети папку то я розшарю - не проблема
А вот как достучаться к базе на мобильном приложении,там приколы с разрешениями да и надо как-то получить путь к базе
Если что-то найду - выложу ну и к тебе аналогичная просьба
-
ruslan, а я и не прошу написать мне программу, я пока в этом вопросе пока вообще ничего не знаю
Для начала мне надо знать хотя-бы с чего начать ,в какую сторону смотреть, а уже потом будут конкретные вопросы
-
Есть таблицы справочников.
Как лучше организовать мультиязычность - на уровне столбцов или таблиц?
Спасибо
Можно ли изменить настройки шрифта для одного элемента TComboBox?
в Настройки внешнего вида
Опубликовано
Есть возможность изменить шрифт для итемов TComboBox, желательно в динамике, хотя и в дизайнере не помешало - до итемов добрался - но изменения TextSettings ничего не дают