Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi onCreate für eigene Klasse? (https://www.delphipraxis.net/89458-oncreate-fuer-eigene-klasse.html)

.chicken 31. Mär 2007 12:17


onCreate für eigene Klasse?
 
Also ich programmier grad ein Kartenspiel und ich hab für das Kartendeck eine eigene Klasse geschrieben!
Jetzt möchte ich, dass beim onCreate der Klasse direkt die 52verschiedenen Karten in das dafür angelegte Array gepackt werden!

Wie kann ich das realisieren?

Neutral General 31. Mär 2007 12:23

Re: onCreate für eigene Klasse?
 
Hi,

Du kannst deiner Klasse einen eigenen Konstruktor geben:

Delphi-Quellcode:
TKlasse = class
private

public
  constructor Create;
end;

constructor TKlasse.Create;
begin
  inherited Create;
  // Dein Code
end;
Willst du ein OnCreate Ereignis, kannst du es so machen:

Delphi-Quellcode:
TKlasse = class
private
  FOnCreate: TNotifyEvent;
public
  property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  constructor Create;
end;

constructor TKlasse.Create;
begin
  inherited Create;
  if Assigned(FOnCreate) then
    FOnCreate(Self);
end;
Gruß
Neutral General

.chicken 31. Mär 2007 12:28

Re: onCreate für eigene Klasse?
 
Ok, super danke ich werds mal mit dem Konstruktor versuchen denk ich ;-)

Der_Unwissende 31. Mär 2007 13:24

Re: onCreate für eigene Klasse?
 
HI,
was der Neutral General vergessen hat zu sagen ist, dass es auch immer einen Destruktor gibt. Deine Frage ist zwar schon beantwortet und Du wirst mit dem Konstruktor ohne Probleme arbeiten können (wichtig ist, dass Du die erste Zeile inherited Create immer übernimmst).

Ein Konstruktor sorgt dafür, dass Dein Objekt erzeugt wird. Das Gegenstück ist dann der Destruktor, der sorgt dafür, dass der dein Objekt wieder frei gegeben wird. So kann es sein, dass ein Bild das Du betrachtest > 100 MByte Speicher belegt. Du schaust es Dir an und schließt es (irgendwann). Jetzt wäre es sicher in Deinem Interesse das die > 100 MByte auch wieder frei gemacht werden. Ansonsten kannst Du Dir kurz überlegen ab wann Dein Speicher voll ist.

Genau für dieses Aufräumen ist dann der Destruktor zuständig. Wird kein Destruktor aufgerufen, wird der Speicher erst mit dem Ende des gesamten Programms frei gegeben (dort dann aber unter Garantie). Hast Du jetzt aber einen Bildbetrachter und schaust Dir 10 Bilder an, wäre es schlecht wenn 900 MByte einfach mal unnütz mit Müll belegt werden.

Lange Rede, kurzer Sinn, alles wofür Du im Konstruktor speicher allozierst (also Objekte die Du mit Create erzeugst, dyn. Arrays deren Länge Du setzt, Speicher den Du mittels GetMem oder New reservierst) solltest Du auch wieder im Destruktor frei geben.

Delphi-Quellcode:
TKlasse = class
private
  FObject: TXyz;
public
  constructor Create;
  destructor Destroy; override;
end;

constructor TKlasse.Create;
begin
  inherited Create;
  // Dein Code

  // neues Object erzeugt
  self.FObject := TXyz.Create;
end;

destructor TKlasse.Destroy;
begin
  // freigeben von erzeugten Objekten
  self.FObject.Free;

  inherited Destroy;
end;
Destruktoren haben immer diese Form und sollten immer mit override überschrieben werden (bei Konstruktoren ist das nicht nötig/möglich). Wichtig beim Destruktor ist auch, dass Du wirklich Destroy überschreibst. Willst Du ein Objekt frei geben, solltest Du zwar immer die Methode Free verwenden, diese ruft aber für Dich schon Destroy auf. Free stellt nur sicher, dass der Objekt-Verweis nicht nil ist, bevor dessen Destruktor aufgerufen wird.

Gruß Der Unwissende

.chicken 31. Mär 2007 13:47

Re: onCreate für eigene Klasse?
 
ok, super danke :dp:

Noobinator 31. Mär 2007 14:00

Re: onCreate für eigene Klasse?
 
ich würde das lieber mit FreeAndNil realisiern, da er sonst einfach nur das object weghaut, und bei einem erneuten falschzugriff fliegt dir sofort er compiler um die ohren.
mit freeAndNil passiert das nicht.

Delphi-Quellcode:
destructor TKlasse.Destroy;
begin
  // freigeben von erzeugten Objekten
  FreeAndNil(Fobject);

  inherited Destroy;
end;

Luckie 31. Mär 2007 14:03

Re: onCreate für eigene Klasse?
 
An dieser Stelle ist das unerheblich, da ihm zu erst seine Klasse um die Ohren fliegen wird.

3_of_8 31. Mär 2007 14:16

Re: onCreate für eigene Klasse?
 
Zitat:

Zitat von Der_Unwissende
(bei Konstruktoren ist das nicht nötig/möglich)

Wenn man einen bereits überschriebenen Konstuktor nochmals überschreiben will, muss man ihn sogar overriden.

Muetze1 31. Mär 2007 18:53

Re: onCreate für eigene Klasse?
 
@Neutral General:

Zitat:

Zitat von Neutral General
Delphi-Quellcode:
TKlasse = class
private
  FOnCreate: TNotifyEvent;
public
  property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  constructor Create;
end;

constructor TKlasse.Create;
begin
  inherited Create;
  if Assigned(FOnCreate) then
    FOnCreate(Self);
end;

Bitte denk nochmal tief darüber nach, warum dieser Vorschlag niemals funktioniert...

Neutral General 31. Mär 2007 19:09

Re: onCreate für eigene Klasse?
 
Ups :oops:

Du hast ja recht :wall:

Ich habe halt das übliche Event-Schema angewendet und runtergetippt.. Natürlich is das Schwachsinn weil man der Instanz schon vor der Erstellung ein Notify Event zugeordnet haben müsste was aber logischerweise nicht geht...
:wall: :angel:

Gruß
Neutral General


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 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