![]() |
[FMX] trace/breakpoint trap (5)
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:
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.
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; 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:
Der Fehler tritt an folgender Stelle auf:
Projekt hat die Exception-Klasse trace/breakpoint trap (5) ausgelöst.
Delphi-Quellcode:
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.FrmKundenwahl.L_Treffer.Text := IntToStr(ThreadQuery.RecordCount) + ' Treffer'; 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; |
AW: [FMX] trace/breakpoint trap (5)
Wie ist es denn so?
Delphi-Quellcode:
TLoadingThread = class(TThread)
private FQueryCallback: TProc<TUniQuery>; FThreadQuery: TUniQuery; FThreadFilter, FThreadStation: String; FThreadConn: TUniConnection; procedure Reset; protected procedure Execute; override; public constructor Create(const AQueryCallback: TProc<TUniQuery>); property Filter: String read FThreadFilter write FThreadFilter; property Station: String read FThreadStation write FThreadStation; procedure DoSync; end; implementation procedure TLoadingThread.Execute; var SQLFormula: string; begin inherited; Reset; FThreadConn := TUniConnection.Create(nil); try FThreadConn.ProviderName := 'SQL Server'; FThreadConn.Server := MSSQLHost; FThreadConn.Username := MSSQLUser; FThreadConn.Password := MSSQLPass; FThreadConn.Database := MSSQLDB; try SQLFormula := 'if Object_ID(''MOBILE_Kunden_' + FThreadStation + #39 + ') is not null Drop Table MOBILE_Kunden_' + FThreadStation; SQLExec(FThreadConn, SQLFormula); SQLFormula := '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_' + FThreadStation + ' from Kundenst where ' + FThreadFilter; SQLExec(FThreadConn, SQLFormula); SQLFormula := '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_' + FThreadStation + ' order by Sortierfeld'; FThreadQuery := GetQuery(FThreadConn, SQLFormula); DoSync; except on E: Exception do begin // das ist eigentlich nicht so schön, zum Entwicklen reicht's aber! ShowMessage(E.ClassName + ' error raised, with message : ' + E.Message); end; end; finally Reset; end; end; constructor TLoadingThread.Create(const AQueryCallback: TProc<TUniQuery>); begin inherited Create(False); FQueryCallback := AQueryCallback; end; procedure TLoadingThread.DoSync; begin if Assigned(FQueryCallback) then Synchronize(FQueryCallback(FThreadQuery)); end; procedure TLoadingThread.Reset; begin if Assigned(FThreadQuery) then begin FThreadQuery.Free; FThreadQuery := nil; end; if Assigned(FThreadConn) then begin FThreadConn.Free; FThreadConn := nil; end; end; procedure TFrmKundenwahl.OnQueryCallback(AQuery: TUniQuery); begin // Diese Callback hier musste dann per TLoadingThread.Create(Self.OnQueryCallback); übergeben Self.L_Treffer.Text := IntToStr(AQuery.RecordCount) + ' Treffer'; AQuery.AfterScroll := Self.QueryAfterScroll; Self.BS_Vorschau.DataSet.Assign(AQuery); Self.BS_Vorschau.DataSet.Open; end; |
AW: [FMX] trace/breakpoint trap (5)
Jetzt bekomme ich den Fehler
Code:
Mein Wissens stand besagt mir, dass man synchronize nur eine Methode ohne Parameter übergeben kann... kann aber auch sein dass ich mich irre.
E2250 Es gibt keine überladene Version von 'Synchronize', die man mit diesen Argumenten aufrufen kann
|
AW: [FMX] trace/breakpoint trap (5)
Zitat:
Delphi-Quellcode:
procedure TLoadingThread.DoSync;
begin if Assigned(FQueryCallback) then Synchronize( procedure begin FQueryCallback(FThreadQuery) end); end; |
AW: [FMX] trace/breakpoint trap (5)
Entschuldigung, da stand ich etwas auf dem Schlauch (war wohl definitiv Zeit für die Mittagspause).
Vielen Dank, dass du mir trotzdem geantwortet hast.jetzt funktioniert es! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz