unit fAutoActions; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox, FMX.Edit, StrUtils, FMX.Controls.Presentation, uMyTimer, uRecords, System.Generics.Collections; type TfrAutoActions = class(TFrame) GroupBox20: TGroupBox; edtMessage: TEdit; edtInterval: TEdit; btnAddMessage: TButton; btnRmMessage: TButton; btnEditMessage: TButton; btnNotifyTest: TButton; sgTimers: TStringGrid; ccTimerEnable: TCheckColumn; scTimerMessage: TStringColumn; icTimerInterval: TIntegerColumn; ccTimerO: TCheckColumn; GroupBox23: TGroupBox; edtBanWords: TEdit; btnBanWordsAdd: TButton; btnBanWordsEdt: TButton; btnBanWordsDel: TButton; sgBanWords: TStringGrid; scRegEx: TStringColumn; btnBanWordsCheck: TButton; Label6: TLabel; edtBanWordsCheck: TEdit; Label7: TLabel; lBanWordsCheck: TLabel; GroupBox17: TGroupBox; edtCounterName: TEdit; edtCounterTrigger: TEdit; edtCounterCount: TEdit; btnCounterAdd: TButton; btnCounterDelete: TButton; btnCounterP: TButton; btnCounterM: TButton; btnCounterEdit: TButton; sgCounter: TStringGrid; scCounterName: TStringColumn; scCounterTrigger: TStringColumn; icCounterCount: TIntegerColumn; ccCounterAuto: TCheckColumn; procedure btnAddMessageClick(Sender: TObject); procedure btnEditMessageClick(Sender: TObject); procedure btnRmMessageClick(Sender: TObject); procedure btnNotifyTestClick(Sender: TObject); procedure sgTimersEditingDone(Sender: TObject; const ACol, ARow: Integer); private { Private declarations } procedure OnMyTimerExec(Sender: TObject; const txt: string; o: Boolean); public { Public declarations } FTimerList: TObjectList; listTimer: TArray; procedure UpdateGridFromArray; procedure initTimers; end; implementation {$R *.fmx} uses uGeneral; procedure TfrAutoActions.btnAddMessageClick(Sender: TObject); var TimerThread: TMyTimerThread; NewRec: TListTimer; begin if (edtMessage.text = '') or (edtInterval.text = '') then exit; TimerThread := TMyTimerThread.Create(edtInterval.text.ToInteger, edtMessage.text, false); TimerThread.OnTimerExec := OnMyTimerExec; FTimerList.Add(TimerThread); NewRec.Enable := 1; NewRec.interval := edtInterval.text.ToInteger; NewRec.o := 0; NewRec.mess := edtMessage.text; SetLength(listTimer, Length(listTimer) + 1); listTimer[High(listTimer)] := NewRec; UpdateGridFromArray; DB.SaveRecordArray('listTimer', listTimer); edtMessage.text := ''; edtInterval.text := '10'; end; procedure TfrAutoActions.btnEditMessageClick(Sender: TObject); var SelectedRow: Integer; NewText: string; NewInterval: Integer; RowIndex: Integer; begin SelectedRow := sgTimers.Row; if (edtMessage.text = '') or (edtInterval.text = '') or (SelectedRow <= 0) or (SelectedRow >= sgTimers.RowCount) then exit; NewText := edtMessage.text; NewInterval := StrToIntDef(edtInterval.text, 0); RowIndex := sgTimers.Row; if (RowIndex < 0) or (RowIndex > High(listTimer)) then exit; if NewInterval <= 0 then exit; // Обновляем настройки таймера FTimerList[SelectedRow].Update(sgTimers.Cells[2, SelectedRow].ToInteger, sgTimers.Cells[1, SelectedRow], (sgTimers.Cells[3, SelectedRow] = 'True')); listTimer[RowIndex].interval := NewInterval; listTimer[RowIndex].mess := NewText; UpdateGridFromArray; DB.SaveRecordArray('listTimer', listTimer); edtMessage.text := ''; edtInterval.text := ''; end; procedure TfrAutoActions.btnNotifyTestClick(Sender: TObject); var s: string; B: Boolean; begin s := sgTimers.Cells[1, sgTimers.Row]; B := sgTimers.Cells[3, sgTimers.Row] = 'True'; { if B then ttw_API.sendNotify(s) else ttw_IRS.sendMessage(s); } end; procedure TfrAutoActions.btnRmMessageClick(Sender: TObject); var SelectedRow: Integer; i, RowIndex: Integer; begin SelectedRow := sgTimers.Row; // Проверяем валидность выбранной строки if (SelectedRow < 0) or (SelectedRow >= sgTimers.RowCount) then exit; // Проверяем наличие таймера в списке if (SelectedRow < FTimerList.Count) then begin // Останавливаем и уничтожаем таймер if Assigned(FTimerList[SelectedRow]) then begin FTimerList[SelectedRow].StopT; FTimerList[SelectedRow].TerminateAndDestroy; // Метод для остановки потока FTimerList.Delete(SelectedRow); // Удаляем из списка с автоуничтожением end; end; // Удаляем строку из сетки RowIndex := sgTimers.Row; if (RowIndex < 0) or (RowIndex > High(listTimer)) then exit; // Сдвигаем элементы массива for i := RowIndex to High(listTimer) do listTimer[i] := listTimer[i + 1]; SetLength(listTimer, Length(listTimer) - 1); UpdateGridFromArray; DB.SaveRecordArray('listTimer', listTimer); end; procedure TfrAutoActions.initTimers; var i: Integer; TimerThread: TMyTimerThread; begin for i := 0 to High(listTimer) do begin TimerThread := TMyTimerThread.Create(listTimer[i].interval, listTimer[i].mess, listTimer[i].o = 1); TimerThread.OnTimerExec := OnMyTimerExec; FTimerList.Add(TimerThread); end; end; procedure TfrAutoActions.OnMyTimerExec(Sender: TObject; const txt: string; o: Boolean); begin { if o then ttw_API.sendNotify(txt) else ttw_IRS.sendMessage(txt); } end; procedure TfrAutoActions.sgTimersEditingDone(Sender: TObject; const ACol, ARow: Integer); var NewRec: TListTimer; begin NewRec.Enable := strtoint(ifthen(sgTimers.Cells[0, ARow] = 'True', '1', '0')); NewRec.o := strtoint(ifthen(sgTimers.Cells[3, ARow] = 'True', '1', '0')); NewRec.interval := strtoint(sgTimers.Cells[2, ARow]); NewRec.mess := sgTimers.Cells[1, ARow]; if ACol = 0 then // Колонка enabled begin if NewRec.Enable = 1 then FTimerList[ARow].StartT else FTimerList[ARow].StopT; end; if ACol = 3 then // Колонка o begin // Обновляем настройки таймера FTimerList[ARow].Update(NewRec.interval, NewRec.mess, (NewRec.o = 1)); end; listTimer[ARow] := NewRec; UpdateGridFromArray; DB.SaveRecordArray('listTimer', listTimer); end; procedure TfrAutoActions.UpdateGridFromArray; var i: Integer; begin sgTimers.BeginUpdate; try sgTimers.RowCount := 0; // Сбрасываем строки (оставляем только заголовки) for i := 0 to High(listTimer) do begin sgTimers.RowCount := i + 1; sgTimers.Cells[0, i] := ifthen(listTimer[i].Enable = 1, 'True', 'False'); sgTimers.Cells[1, i] := listTimer[i].mess; sgTimers.Cells[2, i] := IntToStr(listTimer[i].interval); sgTimers.Cells[3, i] := ifthen(listTimer[i].o = 1, 'True', 'False'); end; finally sgTimers.EndUpdate; end; end; end.