Ну
Вы не должны сохранять свои данные внутри события, потому что вы нарушаете поток выполнения компонента, когда делаете это. Вместо этого:
1 - Вы можете буферизовать все данные, которые вы хотите сохранить, и время от времени вы сохраняете их (не очень хорошо, вы можете потерять много данных, если что-то случится с вашим приложением).
2 - Внутри события создайте поток, который будет получать данные и сохранять их в базе данных. Таким образом, вы не прерываете выполнение потока событий, и все данные будут сохранены на лету. Также вы будете использовать еще одно ядро вашего процессора, если вы это сделаете. Вот что я бы сделал.
Код для решения 2 (не проверено):
TOnError = procedure(aError : string) of object;
TSaveDataThread = class(TThread)
private
oError : string;
oOnError : TOnError;
oDataToSave : string;
procedure SaveDataToDataBase;
procedure CallOnError;
protected
procedure Execute; override;
constructor Create(aDataToSave : string); reintroduce;
public
property OnError : TOnError read oOnError write oOnError;
end;
procedure TSaveDataThread.CallOnError;
begin
oOnError(oError);
end;
constructor TSaveDataThread.Create(aDataToSave: string);
begin
inherited Create(True);
FreeOnTerminate := True;
oDataToSave := aDataToSave;
end;
procedure TSaveDataThread.Execute;
begin
inherited;
Self.SaveDataToDataBase;
end;
procedure TSaveDataThread.SaveDataToDataBase;
begin
//put here your code to save aDataToSave to the database
//set error on oError
oError := 'error';
Synchronize(CallOnError);
end;
procedure TForm5.OnError(aError: string);
begin
ShowMessage(aError);
end;
procedure TForm5.Button1Click(Sender: TObject);
var
vSaveDataThread : TSaveDataThread;
vDataToSave : string;
begin
//change this method fot the event you want to use
vDataToSave := 'this is the data that will be saved to the database';
vSaveDataThread := TSaveDataThread.Create(vDataToSave);
vSaveDataThread.OnError := Self.OnError;
vSaveDataThread.Start;
end;
Проверьте это, если вы не знаете темы: Многопоточность - The Delphi Way