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

Aleks133

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

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

  • Посещение

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения Aleks133

  1. Боюсь обновлять версию,хоть и хотелось бы. Т.к не знаю как ее нормально удалить. Деинсталятора нет. А обычно когда такие большие программы удаляешь вручную, ни к чему хорошему это не приводит.Я имею ввиду конфликты новой версии с остатками старой.Поэтому пока работает пусть работает)) Спасибо за ответ.
  2. Всем привет, 1.Создаю новый проект и сохраняю. 2.Жму на view source этого проекта. 3.Закрываю открывшуюся вкладку с ресурсами. 4.А при попытки добавления в проект нового(чистого) юнита выскакивает access violation. После этого чтобы создать юнит без ошибки нужно перезапустить проект не нажимая перед этим view source. Подскажите, это такой прикол среды или я что-то натворил в ней. RadStudio 10.1 upd 2 berlin Спасибо.
  3. Огромное спасибо за советы и за то что Вы всегда на связи.Буду разбираться дальше.
  4. т.е. создаю новый unit->описываю в нем Tdatamodule и создаю все компоненты динамически.верно? Я еще нашел на другом форуме Вы предлагали использовать TObjectList, он подойдет?(Вроде не сложен в использовании)
  5. Спасибо большое за оперативный ответ и за отклик в принципе!!! Правильно ли я понимаю: 1.Создаем datamodule(Tdm)->кидаем на него нужные компоненты 1.1. Или Создаем datamodule(Tdm)->создаем в нем constructor create для создания нужных компонентов динамически? 2.В своих классах используем этот дата-модуль так? uses UnitDM type TMyclass=class(TObject) private ... public function getdata:string end; type TNewDM = class(Tdm) implementation ... function TMyclass.getdata:string; var NewDM1:TNewDM; begin NewDM1:=TNewDM.Create; Connection.params.value['base']:='путь к бд'; Query.sql.text:='запрос'; result:=Query.fields[1].asstring; NewDM1.free; end; ... А в основном юните использовать так: ... implementation uses MyClass; .... var s:string; MyClass1:TMyclass; begin MyClass1:=TMyclass.create; s:=MyClass1.getdata; MyClass1.free; end; Это я вообще не понял как реализовать. Т.е нужно в TMyClass создать массив что-то вроде того? ... type TMyclass=class(TObject) private ArrDm: array [0 .. 2] of TDm; public function getdata:string end; implementation ... constructor TMyClass.create; var i:integer; begin for i:=0 to 2 do ArrDm[i]:=TDm.create; end; а потом для в реализации класса чередовать их или для каждой таблицы использовать свой элемент массива?
  6. Aleks133

    Работа с БД в класс

    Здравствуйте, Подскажите как правильно организовать работу с БД в классах.Есть БД(Sqlite), для работы использую FireDac. Например структура БД состоит из 3-х таблиц.Сейчас у меня для каждой таблицы свой(боюсь конфликтов в программе) FDQuery. Основной Unit разросся, поэтому хочу весь функционал перевести в отдельный класс.С классами только начал знакомиться. Начал писать так: unit WorkBase; interface uses classes, Sysutils, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.FMXUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, system.Variants; type TDBWork = class private Bcon: TFDConnection; BQ: TFDQuery; procedure beforeconnection(sender: TObject); function GetCountExe: integer; public procedure SetAccaunts(fname, token: string); function GetAccauntsList: TStringList; constructor create; destructor free; // override; property Count: integer read GetCountExe; end; implementation { TDBWork } procedure TDBWork.beforeconnection(sender: TObject); begin Bcon.Params.Values['Database'] := ExtractFilePath(ParamStr(0)) + 'base.db'; end; constructor TDBWork.create; begin Bcon := TFDConnection.create(nil); Bcon.BeforeConnect := beforeconnection; Bcon.Connected; Bcon.LoginPrompt := false; Bcon.Params.Values['LockingMode'] := 'Normal'; Bcon.Params.Values['DriverID'] := 'SQlite'; BQ := TFDQuery.create(nil); BQ.Connection := Bcon; end; destructor TDBWork.free; begin Bcon.free; BQ.free; // inherited; end; function TDBWork.GetCountExe: integer; begin BQ.Close; BQ.SQL.Text := 'select max(id) from exe'; BQ.OpenOrExecute; result := BQ.RowsAffected; end; function TDBWork.GetAccauntsList: TStringList; begin result := TStringList.create; with BQ do begin Close; Open('select * from accaunt'); First; while not BQ.Eof do begin result.Add(BQ.FieldByName('name').AsString); next; end; end; end; // добавление аккаунта procedure TDBWork.SetAccaunts(fname: string; fFirstname: string); var rez: variant; begin try with BQ do begin Open('select * from accaunt'); rez := Lookup('name', fname, 'name'); if vartype(rez) = varnull then begin Close; SQL.Text := 'insert into accaunt(name,Firstname) values(:n,:t)'; ParamByName('n').AsString := fname; ParamByName('t').AsString := fFirstname; ExecSQL; end; end; except end; end; end. Дальше мне нужно добавить новую функцию для работы со второй таблицей.Вот только теперь думаю, добавлять в constructor еще один query или можно с одим работать.Например для записи в лог.Вдруг гдето в программе обе функции будут использовать этот один query одновременно, например в основном потоке и дополнительном.Или этого быть не может из-за того что компоненты FDConnection и FDQuery создаются динамически и при использовании класса я каждый раз создаю новый экземпляр? procedure TForm1.Button35Click(Sender: TObject); var wb1:TDBWork; list:TStringList; s:string; begin wb1:=TDBWork.create; list:=TStringList.Create; list:=wb1.GetAccauntsList; showmessage(list.Text); wb1.free; list.Free; end; ps Сильно не ругайте, только учусь.
  7. Классная штука, но в Berlin 10.1 up2 тоже не работает цвет.И при очистке вылетает ошибка "Invalid pointer operation". Если кто-нибудь знает как исправить, буду очень благодарен.
  8. Здавствуйте, кто-нибудь знает, а будет ли данный пример работать на community edition?Ведь там вроде нельзя исходники менять. Да и вообще интересно, будут ли работать в CE такие вещи как например ModernLV или vkbdhelper.pas(авто прокрутка к полю ввода), если подкинуть их к проекту?
  9. 10.1 upd2 Berlin Указанный способ не сработал. Вышел из положения так: procedure TForm1.Edit6Click(Sender: TObject); var selcol, selst: Integer; begin selst := Edit6.SelStart; //запонинаем куда кликнули курсором if Edit6.Text <> '' then begin Edit6.SelectAll; //выделяем всю строку selcol := Edit6.SelLength;//узнаем сколько символов в строке Edit6.SelStart := selcol - 1; //ставим курсор в любое место чтобы снять выделение и в помощьнике клавиатуры появились подсказки Edit6.SelStart := selst; //и возвращаем каретку на место куда изначально было кликнуто end; end; Только есть минус:по удержанию пальца текст не получиться выделить.
  10. Для stringgrid разобрался procedure TForm1.StringGrid1EditingDone(Sender: TObject; const ACol, ARow: Integer); begin StringGrid1.Cells[1, ARow] := StringGrid1.Cells[ACol, ARow]; end; а вот для грида не работает(( procedure TForm1.Grid1EditingDone(Sender: TObject; const ACol, ARow: Integer); begin Grid1.Columns[1].Controls.items[ARow].data := Grid1.Columns[ACol] .Controls.items[ARow].data; end;
  11. В общем весь день убил на поиски, так ничего и не нашел.Нашел все что хотел,но только все старое что уже не работает. 1.Как обращаться к ячейке, для чтения и записи?не через Grid1GetValue а с кнопки например так : procedure TForm1.Button4Click(Sender: TObject); val: TValue; str: string; begin val := Grid1.Columns[1].Controls.items[1].Data; //не работает так showmessage(val.tostring); end; 2. Как ячейке в столбце TProgressColumn присвоить значение(тоже с кнопки)? Пока все что у меня получилось сделать (по справке) это: private a, b, c: array of TValue; { Private declarations } public constructor Create(AOwner: TComponent); override; { Public declarations } end; const kat: array [0 .. 5] of string = ('Доходы', 'Расходы', 'Магазин', 'Продукты', 'Работа', 'Заправка'); sym_kat: array [0 .. 5] of Integer = (1000, 2000, 2500, 355, 1500, 1700); var Form1: TForm1; implementation constructor TForm1.Create(AOwner: TComponent); begin inherited; SetLength(a, Grid1.RowCount); SetLength(b, Grid1.RowCount); SetLength(c, Grid1.RowCount); end; procedure TForm1.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); var i: Integer; begin if ACol = 0 then Value := a[ARow]; if ACol = 1 then Value := b[ARow]; if ACol = 2 then Value := c[ARow]; end; procedure TForm1.Grid1SetValue(Sender: TObject; const ACol, ARow: Integer; const Value: TValue); var i: Integer; begin if ACol = 0 then a[ARow] := Value; if ACol = 1 then b[ARow] := Value; if ACol = 2 then c[ARow] := Value; end; //так заполняю данными procedure TForm1.Button3Click(Sender: TObject); var i: Integer; begin for i := 0 to Grid1.RowCount - 1 do begin a[i] := kat[i]; c[i] := sym_kat[i]; b[i] := sym_kat[i]; StringColumn3.UpdateCell(i); ProgressColumn2.UpdateCell(i); StringColumn4.UpdateCell(i); end; end; //так получу значение из третьего столбца третьей строки procedure TForm1.Button2Click(Sender: TObject); begin showmessage(c[2].ToString); //2500 end; Но при редактировании суммы, прогресс не меняется.Как это сделать, для меня пока загадка. Буду признателен за любую помощь. P.s.Не обязательно TGrid, можно и TStringGrid
  12. Я в шоке, нашел))Как все было просто.а вот как в stringgrid? И как сделать чтобы значение value бралось из другой колонки тойже сточки? procedure TForm1.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); begin if aCol = 1 then Value := 50; end;
  13. Aleks133

    TProgressColumn на сетке

    Вечер добрый, Сдаюсь,уже устал искать . Подскажите,кто знает, ну вот как они создали прогресс в TGrid и TStringGrid на демке? Спасибо.
  14. Сам не знаю как, но получилось)))пол дня читал форумы чтобы хоть что-то понять из этого. И методом "научного тыка" вот: uses androidapi.helpers, Androidapi.JNI.app,FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText; var FMessageSubscriptionID:integer; procedure tform1.Scan1; var intent: JIntent; begin FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage); intent := TJIntent.Create; intent.setAction(StringToJString('com.google.zxing.client.android.SCAN')); SharedActivity.startActivityForResult(intent, 0); end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M:TMessage); var RequestCode, ResultCode: Integer; Intent: JIntent; s:string; begin if not(M is TMessageResultNotification) then exit; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; RequestCode:=TMessageResultNotification(M).RequestCode; ResultCode:=TMessageResultNotification(M).ResultCode; Intent:=TMessageResultNotification(M).Value; if ResultCode = TJActivity.JavaClass.RESULT_OK then begin if Assigned(Intent) then begin s:=JStringToString(intent.getStringExtra(StringToJString('SCAN_RESULT'))); //получил результат со сканера convert(s); //использовал результат со сканера в своей процедуре end; end else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then begin //Memo1.Lines.Append('RESULT_CANCELED'); end; end; procedure TForm1.Button2Click(Sender: TObject); begin scan1; //запуск сканеровки; end; Не знаю правильно ли это все будет работать, но во всяком случае приложение не виснит(пока) и что хотел получил. Slym'у большое спасибо за наводку. Если кто знает что нужно добавить\исправить для гарантированно стабильной(без сюрпризов в дальнейшем) работы кода, буду благодарен.
  15. Спасибо за ответ.Вот только знать бы как это все работает и где это применить((Буду изучать...еще раз спасибо.
×
×
  • Создать...