Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Unsterbliche" Klassen (https://www.delphipraxis.net/58928-unsterbliche-klassen.html)

Neutral General 14. Dez 2005 17:49


"Unsterbliche" Klassen
 
Hi,

Also das hier ist keine Frage die Lebensnotwendig ist, aber da mir grad langweilig ist würde ich gerne mal wissen ob man eine Klasse irgendwie "unsterblich" machen kann habs mal so versucht aber das geht nicht so richtig^^

Delphi-Quellcode:
TUnvKlasse = class(TObject)
   public
    S: String;
    destructor Destroy; override;
  end;

var Klasse: TUnvKlasse;

destructor TUnvKlasse.Destroy;
var Seele: TUnvKlasse;
begin
   Seele := Self;
   inherited Destroy;
   Self := Seele;
   Self.S := 'Hallo';
end;
dann hab ich halt zwei Buttons:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Klasse := TUnvKlasse.Create;
 Klasse.S := 'Test';
 Caption := TUnvKlasse.S; // Caption wird 'Test' ... logischerweise^^
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Klasse.Destroy;
 Caption :=Klasse.S; // es gibt keine AV aber es steht auch nix da bzw es steht '' da
                            // wenn ich nochmal drücke gibts ne AV^^
end;
Geht das irgendwie ? :mrgreen:
Ich glaube das hier gehört schon fast in Klatsch und Tratsch^^..

Gruß
Michael

DGL-luke 14. Dez 2005 17:53

Re: "Unsterbliche" Klassen
 
durch das seele := self lenkst du nur die referenz um. wenn dann müsstest du den konstruktor einfach leer lassen...

Neutral General 14. Dez 2005 17:55

Re: "Unsterbliche" Klassen
 
Sogar ein leerer Destructor nützt nichts :D

DGL-luke 14. Dez 2005 18:01

Re: "Unsterbliche" Klassen
 
wieso? wird der speicher gleich dealloziiert? ohne das inherited destroy; wird doch nichts freigegeben... ausser das findet im free statt... kann man das überschreiben?

Neutral General 14. Dez 2005 18:04

Re: "Unsterbliche" Klassen
 
Ich rufe ja nur Destroy auf...
und mein Destructor ist leer..

Dax 14. Dez 2005 18:05

Re: "Unsterbliche" Klassen
 
Es geht: Überschreibe FreeInstance der Klasse und tue darin nichts, nicht mal inherited. Auch wenn ich den Sinn der Aktion nicht sehe... :gruebel:

Neutral General 14. Dez 2005 18:07

Re: "Unsterbliche" Klassen
 
Ok danke es klappt :D

Naja das hat kein Sinn aber da mir langweilig war wollte ich mal ne Unzerstörbare Klasse erschaffen xD :mrgreen:

jbg 14. Dez 2005 18:18

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
Naja das hat kein Sinn aber da mir langweilig war wollte ich mal ne Unzerstörbare Klasse erschaffen xD :mrgreen:

Na das hätte man auch einfacher haben können: Einfach nicht .Free aufrufen.

Neutral General 14. Dez 2005 18:22

Re: "Unsterbliche" Klassen
 
Ja das wäre genauso wie wenn man sagen würde: Ein Mensch ist auch unsterblich solange man ihn nicht umbringt...(oder er an altersschwäche stirbt^^)

Das Objekt muss ja immun gegen alle Angriffe sein :mrgreen: :freak:

Airblader 14. Dez 2005 19:19

Re: "Unsterbliche" Klassen
 
Per Holzhammermethode könntest du theoretisch so oder so die Klasse "kaputtieren" ;)

air

Neutral General 14. Dez 2005 19:32

Re: "Unsterbliche" Klassen
 
Wie denn das ?^^

Doch nicht etwa durch FreeAndNil ?? -.-
Dann werde ich erst FreeAndNil zerstören müssen :mrgreen:

alzaimar 14. Dez 2005 19:35

Re: "Unsterbliche" Klassen
 
Rechner ausschalten :wall:

Die Muhkuh 14. Dez 2005 19:36

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von alzaimar
Rechner ausschalten :wall:

:mrgreen:

Neutral General 14. Dez 2005 19:37

Re: "Unsterbliche" Klassen
 
...

Das ist unfair -.-^^

Neotracer64 14. Dez 2005 19:54

Re: "Unsterbliche" Klassen
 
Speicherresidenz und Autostart einbauen. :mrgreen:

tommie-lie 14. Dez 2005 20:02

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Airblader
Per Holzhammermethode könntest du theoretisch so oder so die Klasse "kaputtieren" ;)

Zitat:

Zitat von Neutral General
Wie denn das ?^^

Im Zweifelsfall so wie FreeInstance es auch macht: Aufräumen und den Speicher wegwerfen. Je nachdem was du mit der Klasse angestellt hast bringt schon ein Typekarsten nach TObject den gewünschten Effekt.

Zitat:

Zitat von Neutral General
Doch nicht etwa durch FreeAndNil ?? -.-
Dann werde ich erst FreeAndNil zerstören müssen :mrgreen:

FreeAndNil ist keine Methode, sondern eine normale Prozedur, ohne die SysUtils.pas zu manipulieren kannst du sie nicht verändern.

Versuche mit Destruktoren sind übrigens von vornherein zum Scheitern verurteilt, weil die Compiler-Magic sich um das Freigeben des Objektes kümmert, unabhängig davon ob im Destruktor irgendwas anderes behauptet wird, oder nicht. Das Freigeben der Instanz ist also nicht Sache des Destruktors, sondern geschieht immer und automatisch. Der Destruktor ist mit einem Event vergleichbar, daß ausgeführt wird, bevor die Klasse endgültig über den Jordan wandert.

Bernhard Geyer 14. Dez 2005 20:06

Re: "Unsterbliche" Klassen
 
Wie wäre es Du die Klasse in einer eigenen Unit kapselst und die Schnittstelle per Interface bereitstellst und z.B. schon im Initialisierungsabschnitt einen Interfacepointer darauf holst. Um ganz sicher zu sein überschreibst du auch noch die _Release-Methode um zu verhindern das ein "Bösewicht" die automatische Referenzzählung von Delphi überwinden will.

Neutral General 15. Dez 2005 12:43

Re: "Unsterbliche" Klassen
 
Ich hab ne Idee: Ich erstelle eine "Unverwundbare" Klasse. Ich geb euch den Quellcode von nem Programm mit ner Unverwundbaren Klasse. Ihr dürft verändert was ihr wollt, aber ihr dürft keine Functionen,Proceduren oder Variabel oder so von der Klasse verändern oder hinzufügen. Wer es zuerst schafft die Klasse zu zerstören hat gewonnen :mrgreen:

(Das war ernst gemeint ;))

NicoDE 15. Dez 2005 13:02

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
Ihr dürft verändert was ihr wollt, aber ihr dürft keine Functionen,Proceduren oder Variabel oder so von der Klasse verändern oder hinzufügen.

Sind ClassHelper und eigene Compiler erlaubt? ;)

Neutral General 15. Dez 2005 13:05

Re: "Unsterbliche" Klassen
 
Eigene Compiler... eh mal sehn^^
Classhelper vielleicht wenn ich weiß was das ist :mrgreen:

(Bin am Rumbauen^^: Meine Klasse überlebt schon :

Delphi-Quellcode:
Klasse.Free;
Klasse.Destroy;
Klasse.FreeInstance;
FreeAndNil(Klasse);
TAndereKlasse(Klasse).Free
MUHAHAHAA ^^)

NicoDE 15. Dez 2005 13:11

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
(Bin am Rumbauen^^: Meine Klasse überlebt schon :

Delphi-Quellcode:
Klasse.Free;
Klasse.Destroy;
Klasse.FreeInstance;
FreeAndNil(Klasse);
TAndereKlasse(Klasse).Free
MUHAHAHAA ^^)

Jemand könnte auf die Idee kommen die Klassen-Definition in der Exe zur Laufzeit zu patchen...

Neutral General 15. Dez 2005 13:18

Re: "Unsterbliche" Klassen
 
Hehe ich glaube ich weiß sogar wie ich das abwenden kann :mrgreen:

jim_raynor 15. Dez 2005 13:29

Re: "Unsterbliche" Klassen
 
Im Prinzip gibts eine ganz einfache Methode. An Adresse null steht immer der Zeiger auf die VMT (virtual Method Table) in der die Verweise zu den überschrieben Methoden drin stehen. Man muss ganz einfach die Adresse der VMT auf die von TObject umlenken :lol: Dann funktioniert auch wieder der Aufruf von FreeInstance. hehe.

Neutral General 15. Dez 2005 13:47

Re: "Unsterbliche" Klassen
 
Bis jetzt müsst ihr noch keine Angst haben -.-^^
Mein Problem im Moment ist :

Delphi-Quellcode:
Meine(Un)VerwundbareKlasse := nil;
-.-^^

Und das abzuwenden ist irgendwie ein Problem grad :mrgreen:

malo 15. Dez 2005 13:51

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
Und das abzuwenden ist irgendwie ein Problem grad :mrgreen:

Das ist ja auch kein Zerstören. Damit löschst du ja nur den Zeiger auf das Objekt. Das Objekt liegt weiterhin im Arbeitsspeicher, nur das Programm weiß nicht mehr, wo das liegt. So in etwa :mrgreen:

Aber eventuell könntest du ja eine Standard-Property definieren, die du stattdessen auf Nil setzen würdest. Dann dürfte der Pointer noch auf das Objekt zeigen, aber ein anderer Pointer wird gelöscht... ;)

tigerman33 15. Dez 2005 13:56

Re: "Unsterbliche" Klassen
 
Funktionieren Standardproperties nicht nur für array-Eigenschaften?

Neutral General 15. Dez 2005 13:57

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von malo
Zitat:

Zitat von Neutral General
Und das abzuwenden ist irgendwie ein Problem grad :mrgreen:

Das ist ja auch kein Zerstören. Damit löschst du ja nur den Zeiger auf das Objekt. Das Objekt liegt weiterhin im Arbeitsspeicher, nur das Programm weiß nicht mehr, wo das liegt. So in etwa :mrgreen:

Aber eventuell könntest du ja eine Standard-Property definieren, die du stattdessen auf Nil setzen würdest. Dann dürfte der Pointer noch auf das Objekt zeigen, aber ein anderer Pointer wird gelöscht... ;)

Das hört sich irgendwie schon gut an.. Aber wie meinst du das mit der Property ?
Ich muss ja verhindern das

Delphi-Quellcode:
Klasse := nil;
seine Wirkung verliert, bzw das die Klasse schnell wieder ihren Zeiger wiederbekommt oder ihn erst gar nicht verliert..

Dax 15. Dez 2005 13:59

Re: "Unsterbliche" Klassen
 
Hey.. Eine Klasse besitzt ihren Zeiger nicht. Du besitzt den Zeiger auf die Klasse.. Also hilft nur, deinen Zeiger auf die Klasse mit einem Schreibschutz zu versehen.

malo 15. Dez 2005 14:01

Re: "Unsterbliche" Klassen
 
Ich weiß nicht, ob es wirklich funktioniert, aber ich dachte an sowas:
Delphi-Quellcode:
property Irgendwas: Pointer read fIrgendwas write fIrgendwas; default;
Eventuell funktioniert es ja. Ist jedoch nicht getestet.

Neutral General 15. Dez 2005 14:01

Re: "Unsterbliche" Klassen
 
Ah ja.. soweit zur Theorie... ^^
Und wie sieht die Praxis aus ? (Bitte wenigstens ein Ansatz, ich muss ja sagen das ich die Unverwundbare Klasse erfunden hab xD)

Dax 15. Dez 2005 14:02

Re: "Unsterbliche" Klassen
 
Die Praxis? Read-Only-Property einer Klasse. Anders gehts _nicht_. ;)

Neutral General 15. Dez 2005 14:05

Re: "Unsterbliche" Klassen
 
Das heißt ich muss es schaffen den Pointer meiner Klasse readonly zu machen ?
Na super.. Die Klassen haben ja nichtmal ne Eigenschaft Pointer...
Wie soll man sowas denn Readonly machen ?^^

NEIN ich glaube ich muss die komplette Klasse Readonly machen ^^

Dax 15. Dez 2005 14:09

Re: "Unsterbliche" Klassen
 
Erm, du verstehst das falsch.

Delphi-Quellcode:
type TForm1 = class(TForm)
  ..
  private
    fKlasse: TMeineUnsterblicheKlasse;
  public
   property UnsterblicheKlasse: TMeineUnsterblicheKlasse read fKlasse;
  end;
Oder so in der Art. Jedenfalls so, das der Zugriff auf den Pointer nie schreibend sein darf.

MaBuSE 15. Dez 2005 14:10

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
Klasse.Free;
Klasse.Destroy;
Klasse.FreeInstance;
FreeAndNil(Klasse);
TAndereKlasse(Klasse).Free

Delphi-Quellcode:
Teste mal TObject(Klasse).FreeInstance;

NicoDE 15. Dez 2005 14:12

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
Ich muss ja verhindern das

Delphi-Quellcode:
Klasse := nil;
seine Wirkung verliert, bzw das die Klasse schnell wieder ihren Zeiger wiederbekommt oder ihn erst gar nicht verliert..

Ähm, 'Klasse' scheint eine Referenz auf ein Objekt (Instanz einer Klasse) zu sein... das hat nichts mit deiner Klasse zu tun.

tigerman33 15. Dez 2005 14:13

Re: "Unsterbliche" Klassen
 
@Dax:
Das geht nicht. Er will ja, dass niemand eine Instanz seiner Klasse zerstören kann, also auch ohne "selbstauferlegte" Beschränkungen. Ist also quasi eine Art vollkommen sinnloser API. :mrgreen: (Das ist aber nicht negativ gemeint)

@malo:
Nein, das geht nicht. Default-Eigenschaften kann man nur für Array-Eigenschaften angeben--siehe oben.

Neutral General 15. Dez 2005 14:16

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von MaBuSE
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
Klasse.Free;
Klasse.Destroy;
Klasse.FreeInstance;
FreeAndNil(Klasse);
TAndereKlasse(Klasse).Free

Delphi-Quellcode:
Teste mal TObject(Klasse).FreeInstance;

Eh was willst du mir damit sagen ?
Also meine Klasse ist immun gegen TObject(Klasse).FreeInstance...
Und das von Natur aus :mrgreen:

Aber immernoch nicht gegen Klasse := nil; -.-^^

@Tigerman(@Dax): Genau. Also die Klasse soll keine Property sein. Bzw sie muss keine sein aber trotzdem "unverwundbar" :mrgreen:

MaBuSE 15. Dez 2005 14:36

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
Eh was willst du mir damit sagen ?
Also meine Klasse ist immun gegen TObject(Klasse).FreeInstance...
Und das von Natur aus :mrgreen:

Kannst Du mal den Quellcode Deiner Klasse posten, ich würde das gerne mal sehen.

Dann kann ich selbst ausprobieren, ob TObject(Klasse).Free; funktioniert.

ichbins 15. Dez 2005 14:40

Re: "Unsterbliche" Klassen
 
Wie wärs wenn du den Inhalt deines Zeigers und einen Zeiger auf den Zeiger als protected-Variablen in deiner Klasse speicherst? Dann machst du eine Endlosschleife in die Klasse rein, in der du überprüfst, ob sich der Wert im Zeiger verändert hat.

Und: :=nil ist WIRKLICH kein Zerstören: Es bedeutet ja nur dass das Prog nicht mehr weiss wo im RAM die Klasse eigentlich ist. Dann könntest du die Klasse auch in einer lokalen Variable öffnen, die ist dann auch "verloren" wie bei :=nil.

MaBuSE 15. Dez 2005 14:40

Re: "Unsterbliche" Klassen
 
Zitat:

Zitat von Neutral General
Ich hab ne Idee: Ich erstelle eine "Unverwundbare" Klasse. Ich geb euch den Quellcode von nem Programm mit ner Unverwundbaren Klasse. Ihr dürft verändert was ihr wollt, aber ihr dürft keine Functionen,Proceduren oder Variabel oder so von der Klasse verändern oder hinzufügen. Wer es zuerst schafft die Klasse zu zerstören hat gewonnen :mrgreen:

(Das war ernst gemeint ;))

Also was ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.
Seite 1 von 2  1 2      

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