Autor Beitrag
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 27.10.08 19:44 
Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TFrmMain.BtnDestroyHouseClick(Sender: TObject);
begin
  try
    Haus.Destroy;
    Haus := nil;
    FrmHouse.Hide;
  except
    ShowMessage('Haus kann nicht entfernt werden, da nicht mehr da.');
  end;
end;


Destroy sollte niemals direkt aufgerufen werden.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TFrmMain.BtnDestroyHouseClick(Sender: TObject);
begin
  try
    FreeAndNil(Haus);
    FrmHouse.Hide;
  except
    ShowMessage('Haus kann nicht entfernt werden, da nicht mehr da.'); //sollte eigentlich nie eintreten
  end;
end;
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Mo 27.10.08 20:09 
Jupp, so wirds dann was.

Noch etwas:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TFrmMain.Change(Sender: TObject);
var
  x, y, w: integer;
  rc, wc: TColor;
begin
  try
    GetParameter(x,y,w,rc,wc);
    if Assigned(Haus) then       //  <--<<
      Haus.DrawNew(x,y,w,rc,wc);
  except
    ShowMessage('Haus wurde noch nicht erstellt.');
  end;
end;


Du solltest prüfen ob das Haus da ist bevor du es zeichnest. ;)

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
IHops Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Vista
Delphi 7, Delphi 2007
BeitragVerfasst: Di 28.10.08 00:53 
Hm, das FreeAndNil ist mir neu, funktioniert aber und scheint wirklich die Lösung zu sein. Hab grad nochmal in einigen (2) Büchern nachgesehen ... dort wird das Destroy immer aufgerufen - nunja, man lernt nie aus.

Die Überprüfung, ob das Objekt Haus noch da ist möglich. Genügt aber nicht die Absicherung mit try..except. Das hat auch funktioniert. Den Test mit Assigned(Haus) müsste ich doch dann immer einsetzen, oder macht er an dieser Stelle besonders Sinn?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 28.10.08 01:07 
user profile iconIHops hat folgendes geschrieben Zum zitierten Posting springen:
Die Überprüfung, ob das Objekt Haus noch da ist möglich. Genügt aber nicht die Absicherung mit try..except.

try ... except ist nur für einen einzigen Zweck gedacht: Das Umformen von Fehlern in passendere Fehlermeldungen. Du solltest nie den Except-Teil leer lassen. Das ist so, als ob du dein Auto gegen die Wand fahren lässt, nur um zu testen, ob da eine Wand ist. Genauso gut könntest du die Augen aufmachen und nach vorne schauen.

user profile iconIHops hat folgendes geschrieben Zum zitierten Posting springen:
Das hat auch funktioniert.

Tut es. Ist aber sehr unsauber.

user profile iconIHops hat folgendes geschrieben Zum zitierten Posting springen:
Den Test mit Assigned(Haus) müsste ich doch dann immer einsetzen, oder macht er an dieser Stelle besonders Sinn?

Wenn dein Haus tatsächlich manchmal da ist und manchmal nicht - es macht eigentlich immer Sinn, wenn das Haus auch mal weg sein könnte.

Zum Testen kannst du auch mal alle diese Abfragen weglassen, und viel rumspielen. Dann fügst du überall dort Abfragen ein, bei denen Fehler auftreten. Oder du schaust dir einfach den Quelltext an, und überlegst selbst ;)
IHops Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Vista
Delphi 7, Delphi 2007
BeitragVerfasst: Mi 29.10.08 23:44 
Vielen Dank für die Hilfe ... hat geholfen.