Autor Beitrag
_janosch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mo 10.05.04 17:25 
Hallo,

wie gebe ich ein TBitmap-Objekt richtig frei?
Beim beliebigen Drücken (1xButton1, 3xButton2) der beiden Buttons (siehe Source) wird immer eine EAccessViolation ausgelöst, aber eigentlich muss das doch abgefangen werden :(

Weiß jemand, wie ich das abfangen bzw. umgehen kann :?: :?:

Danke.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Var   ABitmap:TBitmap;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ABitmap=nil
    then ABitmap:=TBitmap.Create
    else showmessage('No');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    if ABitmap<>nil
      then ABitmap.Free;
  except
    on EAccessViolation do showmessage('Autsch');
  end;
end;
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 10.05.04 17:28 
Free gibt das Objekt nur Frei, setzt den Pointer aber nicht auf nil..! Deswegen ergibt dein Vergleich immer Falsch.. verwende stattdessen FreeAndNil...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
_janosch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mo 10.05.04 18:30 
Das klappt. Danke :lol:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 10.05.04 19:00 
Der Test auf nil ist übrigens überflüssig. Da Free den Destruktor (Destroy) nur aufruft, wenn das Objekt existiert. Der Test auf nil ist nur dann sinnvoll, wenn man den Destruktor (Destroy) direkt aufruft, was man aber tunlichst vermeiden soll. Ich habe mir übrigens angewöhnt Objekte mit FreeAndNIl freizugeben, da wird auch gleich der Zeiger genillt.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mo 10.05.04 22:48 
Luckie hat folgendes geschrieben:
Der Test auf nil ist übrigens überflüssig. Da Free den Destruktor (Destroy) nur aufruft, wenn das Objekt existiert. Der Test auf nil ist nur dann sinnvoll, wenn man den Destruktor (Destroy) direkt aufruft, was man aber tunlichst vermeiden soll. Ich habe mir übrigens angewöhnt Objekte mit FreeAndNIl freizugeben, da wird auch gleich der Zeiger genillt.


Wieso sollte man das tunlichst vermeiden? Wenn man sich seiner sache sicher ist und selbst auf NIL prüft, dann ist da gegen nix einzuwenden! Aber für den alltags gebrauch is das sicher richtig :wink:

_________________
mfg.
mâximôv
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 10.05.04 23:09 
Man sollte es vermeiden um sich es gar nicht erst anzugewöhnen. Und warum selber sich mehr Arbeit machen, wenn das die Borländer schon für einen gemacht haben? ;)
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 11.05.04 10:18 
Es gibt situaltionen da prüft man sowieso schon auf NIL, zB. um noch daten abzurufen, und dann kann man sich das free getrost sparen :wink: ...Noobs sollten selbstverständlich immer free benutzen.

_________________
mfg.
mâximôv