Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Borland Pascal 7: Freigeben von Objekten (https://www.delphipraxis.net/659-borland-pascal-7-freigeben-von-objekten.html)

d3g 19. Aug 2002 15:17


Borland Pascal 7: Freigeben von Objekten
 
Hi Leute,

kann mir jemand von euch Nachhilfeunterricht in OOP mit Turbo Pascal geben (als ich mit TP programmiert habe, war OOP für mich noch ein Fremdwort...).

Ich habe folgenden Code:

Code:
[b]type[/b]
  TWareListItem = [b]object[/b]
    [b]public[/b]
      [b]constructor[/b] Create(next: ^TWareListItem);
      [b]destructor[/b] Destroy;
      [b]procedure[/b] SetNext(next: ^TWareListItem);
      [b]function[/b] GetWare: TWare;
    [b]private[/b]
      nextItem: ^TWareListItem;
      ware: TWare;
  [b]end[/b];
Ich kann kein Objekt von TObject ableiten (weil es kein TObject gibt), nun weiß ich aber nicht, wie ich im Destruktor dn Speicher für mein Objekt freigeben soll... Kann mir jemand helfen?

Danke im Voraus,
d3g

jbg 19. Aug 2002 15:54

Dein ^TWareListItem solltest du umstellen.
Code:
[b]type[/b]
  PWareListItem = ^TWareListItem;
  TWareListItem = [b]object[/b]
    [b]constructor[/b] Create(next: [u]PWareListItem[/u]);
    ...
In Turbo/Borland Pascal gibt es noch die statischen Objekte, die keine Zeiger sind. Du kannst z.B. ein Objekt so nutzen:
Code:
[b]var[/b]
  MyObj: TWareListItem;
[b]begin[/b]
  MyObj.Create(nil);
  ...
  MyObj.Destroy;
[b]end[/b];
Mit dieser Weise fällt man aber schnell auf die Nase, wenn es um die Übergabe an Funktionen geht, da man es von Delphi gewohnt ist, dass ein Zeiger auf das Objekt übergeben wird, wobei hier eben kein Zeiger, sondern eine Kopie des gesamten Objekts übergeben wird.


Wenn du es aber so wie Delphi es macht haben willst dann geht das so:
Code:
[b]var[/b] MyObj: PWareListItem;
[b]begin[/b]
  MyObj := New(TWareListItem, Create(nil) );
  ...
  Dispose(MyObj, Destroy);
[b]end[/b];
Wenn du eine Free-Methode habe möchtest dann ist es notwendig, den Destruktor virtuell zu machen. Die Free-Methode darf auch nicht auf statische Objekt angewand werden, da diese nicht mit New() erzeugt wurden.
Code:
PObject = ^TObject;
TObject = [b]object[/b]
  [b]destructor[/b] Destroy; [b]virtual[/b];
  [b]procedure[/b] Free;
[b]end[/b];

[b]destructor[/b] TObject.Destroy;
[b]begin[/b]
[b]end[/b];

[b]procedure[/b] TObject.Free;
[b]var[/b] p: PObject;
[b]begin[/b]
  p := PObject(Self);
  Dispose(p, Destroy);
[b]end[/b];

d3g 19. Aug 2002 15:59

Hi jbg,

d.h. ich brauche keinen Code in der Destroy-Routine? :) Das wollte ich nämlich wissen :mrgreen:. Danke.

MfG,
d3g

jbg 19. Aug 2002 16:06

Zitat:

Zitat von d3g
ich brauche keinen Code in der Destroy-Routine?

Wenn du in Create keinen Speicher reservierst, oder andere Objekte mit ihrem Konstruktor erzeugst, dann brauchst du nichts in Destroy schreiben.


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