![]() |
Re: Methode "Free" selbst implementieren (Assemble
dann halt so:
Delphi-Quellcode:
procedure dosomething;
begin mydestroyvariable := true; end; procedure TObject.Free(myparam:boolean); stdcall; asm pop edx cmp edx, 1 jne @@weiter call dosomething @@weiter: TEST EAX,EAX JE @@exit MOV ECX,[EAX] CALL dword ptr [ECX].vmtDestroy @@exit: end; |
Re: Methode "Free" selbst implementieren (Assemble
Folgendes "einfaches" Beispiel sollte Dein Problem lösen:
Unit1.pas
Delphi-Quellcode:
Hier werden 3 wichtige Dinge implementiert:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TMyObject = class; TMyObject = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } MyRefCount: Integer; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; function GetMyObject: TMyObject; procedure FreeMyObject; end; var MyObject: TMyObject; implementation {$R *.dfm} { TMyObject} // Hier wird nur MyRefCount hochgezählt (auf 1 gesetzt) constructor TMyObject.Create(AOwner: TComponent); begin inherited; Inc(MyRefCount); end; // hiermit werden die Objekte freigegeben procedure TMyObject.FreeMyObject; begin if Self <> nil then begin Dec(MyRefCount); if MyRefCount < 1 then Self.Free; end; end; // hiermit wird eine Objektreferenz geholt function TMyObject.GetMyObject: TMyObject; begin if Self <> nil then begin Inc(MyRefCount); Result := Self; end else begin Result := nil; end; end; // Der Timer ist nur auf dem Form, damit man sieht wie viele Refs es gibt procedure TMyObject.Timer1Timer(Sender: TObject); begin Caption := IntToStr(MyRefCount); end; end.
Delphi-Quellcode:
Die Unit 2 ist ein leeres TForm mit 7 TButtons
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation uses Unit1; {$R *.dfm} var a, b : TMyObject; procedure TForm2.Button1Click(Sender: TObject); begin MyObject := TMyObject.Create(self); MyObject.Show; end; procedure TForm2.Button2Click(Sender: TObject); begin a := MyObject.GetMyObject; end; procedure TForm2.Button3Click(Sender: TObject); begin b := MyObject.GetMyObject; end; procedure TForm2.Button4Click(Sender: TObject); begin a.FreeMyObject; a := nil; end; procedure TForm2.Button5Click(Sender: TObject); begin b.FreeMyObject; b := nil; end; procedure TForm2.Button6Click(Sender: TObject); begin MyObject.FreeMyObject; MyObject := nil end; procedure TForm2.Button7Click(Sender: TObject); begin Close; end; end.
Das Ganze wird in die Project1.dpr eingebunden:
Delphi-Quellcode:
Viel Spaß
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {MyObject}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm2, Form2); Application.Run; end. [edit] wichtig: Es muß natürlich erst der Button1 gedrückt werden, damit TMyObject.Create aufgerufen wird. ;-) [/edit] |
Re: Methode "Free" selbst implementieren (Assemble
Zitat:
|
Re: Methode "Free" selbst implementieren (Assemble
Zitat:
Bei .net gibt’s den GarbageCollector, der macht so was Ähnliches. (Nur viel komplizierter :mrgreen:) Wenn es auf ein Objekt keine Referenz mehr gibt, dann wird es in die "Müllsammlung" gegeben und irgendwann später aus dem Speicher entfernt. Aber solange es mindestens eine Referenz gibt, bleibt es im Speicher. |
Re: Methode "Free" selbst implementieren (Assemble
Zitat:
|
Re: Methode "Free" selbst implementieren (Assemble
Zitat:
Geht man davon aus, daß jemand das von Hand macht dann sollte man ja OOP vollständig vermeiden. Derjenige der sowas manuell macht sollte sich auch schlau machen welche Auswirkungen das hat, oder? Wie würdest du denn das lösen? |
Re: Methode "Free" selbst implementieren (Assemble
Wenn dies alles dafür gedacht ist, objekte am leben zu erhalten, die noch referenziert werden, warum verwendest du dann nicht die automatisch COM-refCount geschichte? Du müsstest dann nur leider mit interface-refenren arbeiten.
|
Re: Methode "Free" selbst implementieren (Assemble
Zitat:
|
Re: Methode "Free" selbst implementieren (Assemble
Zitat:
|
Re: Methode "Free" selbst implementieren (Assemble
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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