![]() |
Delphi-Version: XE
Gelöst: Objectlist nach Exception gelöscht
Hallo,
ich rufe eine procedure auf mit Werkzeugliste(Objectlist) als Parameter. In der procedure fange ich einen Fehler mit try-except ab und will den Fehler behandeln. Nachdem die Exception aber verarbeitet ist, ist meine Werkzeugliste leer, FList ist nil, count und capacity 0. Die Schleife läuft durch einige Werkzeuge korrekt durch, bis sie auf ein ungültiges Grafikformat trifft und die Exception ausgelöst wird. In der Exception selbst ist die Werkzeugliste auch noch korrekt, aber sobald ich aus dem Exception-Block steppe, geht die Liste auf null.
Code:
procedure TdmWerkzeugBasis.LoadWerkzeugliste(Werkzeugliste: TWerkzeugliste);
var aWerkzeug: TWerkzeug; converter: TObjectListXMLKonverter; resourcestring strInvalidGraphic = 'Grafik für Werkzeug %s kann nicht gelesen werden und wird gelöscht. Grafik neu einfügen'; begin converter:=TObjectListXMLKonverter.Create; try IBQWerkzeugliste.sql.text := 'select * from tools order by name'; IBQWerkzeugliste.Open; while not IBQWerkzeugliste.EOF do begin aWerkzeug := TWerkzeug(converter.XMLToVirtualPersistent(IBQWerkzeugliste.FieldByName('DATA').AsString));; aWerkzeug.Name := IBQWerkzeugliste.FieldByName('NAME').AsString; aWerkzeug.OID := IBQWerkzeugliste.FieldByName('OID').AsInteger; try LoadWMFFromDatabase(IBQWerkzeugliste.FieldByName('WMF_GRAFIK'), aWerkzeug.WmfGrafik); except On EInvalidGraphic do begin DeleteWerkzeugGrafikWMF(aWerkzeug.OID); MessageDlg(Format(strInvalidGraphic,[aWerkzeug.Name]), mtError, [mbOK], 0); end else raise; end; Werkzeugliste.Add(aWerkzeug); IBQWerkzeugliste.next; end; IBQWerkzeugliste.Close; finally converter.free; end; end; procedure TdmWerkzeugBasis.DeleteWerkzeugGrafikWMF(const WerkzeugId: Integer); begin SQLQuery.SQL.Text:='Update tools set wmf_grafik=null where oid=:werkzeugid'; SQLQuery.Params.ParamByName('werkzeugid').AsInteger:=WerkzeugId; SQLQuery.ExecSQL(); end; |
AW: Objectlist nach Exception gelöscht
Entweder zeigt der Debugger einfach nur Mist an.
Ja, das tut er gerne mal. Im Zweifelsfall die gewünschten Werte irgendwo loggen/speichern oder anzeigen (die gute alte ShowMessage-Methode). Und wenn es wirklich "defekt" ist, dann wird es wohl durch irgendwas überschrieben worden sein. Eventuell ein Buffer-Overrun in LoadWMFFromDatabase oder DeleteWerkzeugGrafikWMF? |
AW: Objectlist nach Exception gelöscht
Nur Mist anzeigen ist es nicht, denn beim
Werkzeugliste.Add(aWerkzeug); knallt es dann. Die LoadWMF-Funktion müsste ich noch genauer ansehen, aber direkt nach der Exception, während DeleteWerkzeugGrafikWMF und Message ist die Werkzeugliste ja noch vorhanden (meint zumindest der Debugger) |
AW: Gelöst: Objectlist nach Exception gelöscht
Ich hab mich selbst verarscht, ich habe einen Trigger in der Datenbank, der bei Tabellenänderung die Werkzeugliste löscht und neu einliest.
|
AW: Gelöst: Objectlist nach Exception gelöscht
Hallo,
Zitat:
Delphi-Quellcode:
ist bestimmt eine Klasse. Und das
TWerkzeug
Delphi-Quellcode:
liefert eine String. Da fehlt glaube ich ein
AsString
Delphi-Quellcode:
.
.Create
[edit]Habe mich durch die zwei Semikolons in der Eile verwirren lassen und gedanklich die zweite Klammer entfernt. Und dir rote Box hatte auch Urlaub.[/edit] einbeliebigername. |
AW: Gelöst: Objectlist nach Exception gelöscht
[OT]
Zitat:
Du gehst zwar vollkommen richtig von der Syntax
Delphi-Quellcode:
aus, der also ein neues Objekt vom Typ TWerkzeug erzeugt und die Referenz darauf in aWerkzeug ablegt. In diesem Falle würde wirklich ein .Create fehlen.
aWerkzeug := TWerkzeug.Create(Parameter);
In diesem Fall dürfte es sich aber eher um einen "harten Cast" handeln, d.h. das, was
Delphi-Quellcode:
zurückliefert soll so interpretiert werden, als ob es vom Typ TWerkzeug ist. Mit anderen Worten also eine "harte" Umwandlung von einem Typ in einen anderen.
converter.[...].AsString)
![]() [/OT] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 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-2025 by Thomas Breitkreuz