Autor Beitrag
M. Raab
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Sa 25.02.06 14:41 
Hallo NG,

folgendes Problem:

Ich erzeuge zur Laufeit einige Labels um damit Beschriftungen auszugeben. Der Nutzer kann so viele Labels auf die Canvas machen, wie er will. Problem nun dabei: löscht er die Zeichnugn wieder und ruft das Form erneut auf, sind die bereits erzeugten Labels auch wieder sichtbar. Irgendwie werden sie nicht aus dem Speicher gelöscht. Nun habe ich versucht, mit folgendem Code die Labels sicher zu zerstören:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
      for lauf:=1 to labelcount do
        begin
          if BPLabel[lauf]<>nil then
            begin
              BPLabel[lauf].destroy;
              BPLabel[lauf]:=nil;
            end;
        end;


Problem nun: angenommen der Nutzer hat keine Labels erzeugt, führt der o.g. Code zur Exception, weil die Abfrage nach Label - nil nicht möglich ist. Klar: es existiert ja kein Label.

Hat da jemand ne Lösung parat wie ich überprüfen kann, ob zur Laufzeit labels erzeugt wurden und wie man die dann sicher aus dem Speicher entfernt ?


Grus


Markus

_________________
Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
afk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102

Win 2K, Win XP
Delphi 2006 Arch., Delphi 6 Ent., MS-SQL 2005 & 2000
BeitragVerfasst: Sa 25.02.06 17:16 
Ist labelcount die Anzahl der erzeugten Labels oder die maximale Anzahl an Labels ?

Wenn es die Anzahl der erzeugten Labels ist, dann frag doch einfach ab, ob labelcount > 0.

Wenn nicht, dann kann ich mir eine Exception eigentlich nur vorstellen, wenn Du das Array nicht entsprechend initialisiert hast.

Ich würde den Code aber so schreiben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
For lauf:=1 to labelcount do
begin
  If Assigned(BPLabel[lauf]) then FreeAndNil(BPLabel[lauf]);
end;

Auf gar keinen Fall soltest Du .Destroy verwenden, sondern immer .Free, da dann erst überprüft wird, ob überhaupt etwas freigegeben werden muß.


Gruß Axel

_________________
Man muß sparn wo mn knn !
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: So 26.02.06 10:29 
Hallo,


Dein Tipp war super - jetzt funzt es prima. :D :D


Gruss und Vielen Dank.


Markus

_________________
Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!