Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gelöst: Objectlist nach Exception gelöscht (https://www.delphipraxis.net/166820-geloest-objectlist-nach-exception-geloescht.html)

Rainer Wolff 1. Mär 2012 13:36

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;

himitsu 1. Mär 2012 13:40

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?

Rainer Wolff 1. Mär 2012 13:53

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)

Rainer Wolff 1. Mär 2012 14:05

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.

einbeliebigername 1. Mär 2012 14:09

AW: Gelöst: Objectlist nach Exception gelöscht
 
Hallo,

Zitat:

Zitat von Rainer Wolff (Beitrag 1153831)
Code:
      aWerkzeug     := TWerkzeug(converter.XMLToVirtualPersistent(IBQWerkzeugliste.FieldByName('DATA').AsString));;

Also die Zeile sieht in meinen Augen nicht richtig aus.
Delphi-Quellcode:
TWerkzeug
ist bestimmt eine Klasse. Und das
Delphi-Quellcode:
AsString
liefert eine String. Da fehlt glaube ich ein
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.

silver-moon-2000 1. Mär 2012 16:43

AW: Gelöst: Objectlist nach Exception gelöscht
 
[OT]

Zitat:

Zitat von einbeliebigername (Beitrag 1153851)
Zitat:

Zitat von Rainer Wolff (Beitrag 1153831)
Code:
      aWerkzeug     := TWerkzeug(converter.XMLToVirtualPersistent(IBQWerkzeugliste.FieldByName('DATA').AsString));;

Also die Zeile sieht in meinen Augen nicht richtig aus.
Delphi-Quellcode:
TWerkzeug
ist bestimmt eine Klasse. Und das
Delphi-Quellcode:
AsString
liefert eine String. Da fehlt glaube ich ein
Delphi-Quellcode:
.Create
.

Ohne jetzt den Code durchgeschaut zu haben, das kann durchaus so passen, wie es ursprünglich geschrieben wurde.

Du gehst zwar vollkommen richtig von der Syntax
Delphi-Quellcode:
aWerkzeug := TWerkzeug.Create(Parameter);
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.

In diesem Fall dürfte es sich aber eher um einen "harten Cast" handeln, d.h. das, was
Delphi-Quellcode:
converter.[...].AsString)
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. DP: Typecast or not?
[/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz