AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

onCreate für eigene Klasse?

Ein Thema von .chicken · begonnen am 31. Mär 2007 · letzter Beitrag vom 31. Mär 2007
Antwort Antwort
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#1

onCreate für eigene Klasse?

  Alt 31. Mär 2007, 13:17
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?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 13:23
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#3

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 13:28
Ok, super danke ich werds mal mit dem Konstruktor versuchen denk ich
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 14:24
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
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#5

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 14:47
ok, super danke
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#6

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 15:00
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 15:03
An dieser Stelle ist das unerheblich, da ihm zu erst seine Klasse um die Ohren fliegen wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 15:16
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 19:53
@Neutral General:

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...
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 20:09
Ups

Du hast ja recht

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...


Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 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