Guten Morgen Community!
Ich habe hier ein Interessantes Phänomen:
Ich öffne eine
Query in einem Thread. Dann versuche ich im Synchronize auf diese
Query zuzugreifen und die Daten zu verwenden:
Delphi-Quellcode:
procedure TLoadingThread.Sync;
Begin
FrmKundenwahl.L_Treffer.Text := IntToStr(ThreadQuery.RecordCount) + ' Treffer';
ThreadQuery.AfterScroll := FrmKundenwahl.QueryAfterScroll;
FrmKundenwahl.BS_Vorschau.DataSet := ThreadQuery;
FrmKundenwahl.BS_Vorschau.DataSet.Open;
End;
Das ganze funktioniert auch bei einem ersten Durchlauf wunderbar. Die Anzahl der Datensätze wird mir korrekt angezeigt und die Daten auch in dem Entsprechenden Grid.
Rufe ich das Ganze aber ein zweites mal auf (im Thread selber wird die
Query komplett neu erstellt), Tritt beim Debuggen folgender Fehler auf:
Code:
Projekt hat die
Exception-Klasse trace/breakpoint trap (5) ausgelöst.
Der Fehler tritt an folgender Stelle auf:
Delphi-Quellcode:
FrmKundenwahl.L_Treffer.Text := IntToStr(ThreadQuery.RecordCount) + ' Treffer';
Wenn ich die Anwendung ohne zu Debuggen durchlaufen lasse, werden auf Android keine Daten angezeigt, und die App läuft weiter. Auf iOS hingegen stürzt die App in diesem Fall mit einer Zugriffsverletzung ab.
So sieht der Thread aus:
Delphi-Quellcode:
type TLoadingThread =
class(TThread)
private
ThreadQuery:TUniQuery;
ThreadFilter, ThreadStation:
String;
ThreadConn:TUniConnection;
protected
procedure Execute;
override;
public
property Filter :
String read ThreadFilter
write ThreadFilter;
property Station :
String read ThreadStation
write ThreadStation;
procedure Sync;
end;
procedure TLoadingThread.Execute;
begin
Try
if ThreadQuery <>
nil then
Begin
ThreadQuery.Free;
ThreadQuery :=
nil;
End;
if ThreadConn <>
nil then
Begin
ThreadConn.Free;
ThreadConn :=
nil;
End;
ThreadConn := TUniConnection.Create(
nil);
ThreadConn.ProviderName := '
SQL Server';
ThreadConn.Server := MSSQLHost;
ThreadConn.Username := MSSQLUser;
ThreadConn.Password := MSSQLPass;
ThreadConn.Database := MSSQLDB;
SQLExec(ThreadConn, '
if Object_ID(''
MOBILE_Kunden_'+ThreadStation+#39+'
) is not null Drop Table MOBILE_Kunden_'+ThreadStation);
SQLExec(ThreadConn, '
Select distinct Kunden_Nr as kdn, Sortierfeld as Sortierfeld_Vorschau, Name1 as Name1_Vorschau, Strasse as Strasse_Vorschau, PLZ as PLZ_Vorschau, Ort as Ort_Vorschau, 1 as Selected into MOBILE_Kunden_'+ThreadStation+'
from Kundenst where '+ThreadFilter);
ThreadQuery := GetQuery(ThreadConn, '
Select name1_Vorschau as Name1, kdn, Sortierfeld_Vorschau as sortierfeld, Strasse_Vorschau as strasse, PLZ_Vorschau as plz, Ort_Vorschau as ort, selected from Mobile_Kunden_'+ThreadStation+'
order by Sortierfeld');
except
on E :
Exception do ShowMessage(E.ClassName+'
error raised, with message : '+E.
Message);
end;
Synchronize(Sync);
end;