![]() |
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? |
Re: onCreate für eigene Klasse?
Hi,
Du kannst deiner Klasse einen eigenen Konstruktor geben:
Delphi-Quellcode:
Willst du ein OnCreate Ereignis, kannst du es so machen:
TKlasse = class
private public constructor Create; end; constructor TKlasse.Create; begin inherited Create; // Dein Code end;
Delphi-Quellcode:
Gruß
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; Neutral General |
Re: onCreate für eigene Klasse?
Ok, super danke ich werds mal mit dem Konstruktor versuchen denk ich ;-)
|
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:
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.
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; Gruß Der Unwissende |
Re: onCreate für eigene Klasse?
ok, super danke :dp:
|
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; |
Re: onCreate für eigene Klasse?
An dieser Stelle ist das unerheblich, da ihm zu erst seine Klasse um die Ohren fliegen wird.
|
Re: onCreate für eigene Klasse?
Zitat:
|
Re: onCreate für eigene Klasse?
@Neutral General:
Zitat:
|
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 04:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz