AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Gelöst: Objectlist nach Exception gelöscht
Thema durchsuchen
Ansicht
Themen-Optionen

Gelöst: Objectlist nach Exception gelöscht

Ein Thema von Rainer Wolff · begonnen am 1. Mär 2012 · letzter Beitrag vom 1. Mär 2012
Antwort Antwort
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#1

Gelöst: Objectlist nach Exception gelöscht

  Alt 1. Mär 2012, 14:36
Delphi-Version: XE
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;

Geändert von Rainer Wolff ( 1. Mär 2012 um 15:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Objectlist nach Exception gelöscht

  Alt 1. Mär 2012, 14:40
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?
$2B or not $2B
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Objectlist nach Exception gelöscht

  Alt 1. Mär 2012, 14:53
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)
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 1. Mär 2012, 15:05
Ich hab mich selbst verarscht, ich habe einen Trigger in der Datenbank, der bei Tabellenänderung die Werkzeugliste löscht und neu einliest.
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#5

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

  Alt 1. Mär 2012, 15:09
Hallo,

Code:
      aWerkzeug     := TWerkzeug(converter.XMLToVirtualPersistent(IBQWerkzeugliste.FieldByName('DATA').AsString));;
Also die Zeile sieht in meinen Augen nicht richtig aus. TWerkzeug ist bestimmt eine Klasse. Und das AsString liefert eine String. Da fehlt glaube ich ein .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.

Geändert von einbeliebigername ( 1. Mär 2012 um 19:32 Uhr)
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#6

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

  Alt 1. Mär 2012, 17:43
[OT]

Code:
      aWerkzeug     := TWerkzeug(converter.XMLToVirtualPersistent(IBQWerkzeugliste.FieldByName('DATA').AsString));;
Also die Zeile sieht in meinen Augen nicht richtig aus. TWerkzeug ist bestimmt eine Klasse. Und das AsString liefert eine String. Da fehlt glaube ich ein .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
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 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]
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 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