Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi eigenen Pointer unterbringen in TObject? (https://www.delphipraxis.net/129351-eigenen-pointer-unterbringen-tobject.html)

stoxx 17. Feb 2009 16:50


eigenen Pointer unterbringen in TObject?
 
Hallo Profis,

gibts eine Möglichkeit, in der VMT oder so, für jedes TObject noch einen eigenen Pointer zu platzieren und unterzubekommen?
Ab TComponent gäbe es die Tag Property.
Gibt es vielleicht noch eine vesteckte Möglichkeit und freier Platz in TObject? vielleicht für unwichtige Features?

Eher nicht, oder?

Delphi-Quellcode:
 ShowMessage(InttoStr (obj.InstanceSize ));
zeigt 4 Byte an, finde aber keine deklarierte Variable in den Sourcen von TObject :)

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

nuclearping 17. Feb 2009 16:53

Re: eigenen Pointer unterbringen in TObject?
 
Kannst du keinen Nachfahr erstellen, der die neue Property hat?

stoxx 17. Feb 2009 16:55

Re: eigenen Pointer unterbringen in TObject?
 
naja, darum gings ja jetzt nicht. eine TStringrid kann man halt nicht mehr von diesem eigenem Typ ableiten ...

Apollonius 17. Feb 2009 16:56

Re: eigenen Pointer unterbringen in TObject?
 
Die VMT ist eine Tabelle für jede Klasse. Nicht für jedes Objekt. Jedes Objekt hat einen Zeiger auf die VMT seiner Klasse (damit arbeiten dann auch as und is); das sind genau die 4 Byte einer TObject-Instanz.

Um ein Feld nachträglich unterzubringen, musst du extern eine Tabelle (z.B. Hashmap) verwalten, die für jede Objektinstanz das Feld hält. Einen anderen Weg gibt es leider nicht. Dummerweise gibt es in Delphi keine Garbage Collection, weshalb das Freigeben des Platzes in der Tabelle schwierig ist. Am besten hookst du dazu TObject.FreeInstance, dort kannst du dann aufräumen.

stoxx 17. Feb 2009 16:58

Re: eigenen Pointer unterbringen in TObject?
 
ok, gut .. danke Dir. Wollte nur wissen, ob eine zusätzliche Tabelle, in welcher Form auch immer, vermeidbar wäre ...
Danke Dir da ..

sirius 17. Feb 2009 16:59

Re: eigenen Pointer unterbringen in TObject?
 
Zitat:

Zitat von stoxx
ShowMessage(InttoStr (obj.InstanceSize ));
zeigt 4 Byte an, finde aber keine deklarierte Variable in den Sourcen von TObject :)

Das ist der Zeiger zur VMT.

Ansonsten verstehe ich nicht, was du vorhast. Wenn du in einem Stringgrid noch einen weiteren Pointer unterbingen wills, dann leite doch davon ab.

mirage228 17. Feb 2009 17:03

Re: eigenen Pointer unterbringen in TObject?
 
Naja du kannst ja auch Objekte oder Records in die Tags (also die jeweilige Tag-Property) schreiben, darin kannst Du mehrere Pointer oder was auch immer packen. Dürfteste die sauberste Lösung sein... :gruebel:

Viele Grüße

stoxx 17. Feb 2009 17:06

Re: eigenen Pointer unterbringen in TObject?
 
@ Sirius

es gänge darum, Funktionalität zu einem beliebigen Object hinzuzufügen. Eine Art Mehrfachvererbung zu realisieren.
Mehrfachvererbung bräuchte man ja meist nur zur Erweiterung von Objectfunktionalitäten.
Reine Funktionerweiterungen lassen sich mit dem Class Helpern super realisieren, wenn man jetzt aber noch eigene Daten unterbringen möchte, müsste man wirklich eine zweite Tabelle führen.

bräuchte es für dies hier ...

http://www.delphipraxis.net/internal...148&highlight=

@Apollonius


wie geht das mit dem Hooken von TObject.FreeInstance. Code hast Du nicht zufällig gleich parat, oder? :-)

Apollonius 17. Feb 2009 17:16

Re: eigenen Pointer unterbringen in TObject?
 
Ich denke, es ist einfacher, einen eigenen Speichermanager zu installieren und dann in FreeMem das Objekt aus der Tabelle zu nehmen. Dazu holst du dir mit GetMemoryManager(Ex) (das hängt von der Delphi-Version ab) den alten Speichermanager, ersetzt im Record den FreeMem-Zeiger und setzt das dann als neuen Speichermanager. In deinem eigenen FreeMem löschst du gegebenenfalls den Tabelleneintrag und rufst das alte FreeMem auf.

Das Hooken von TObject.FreeInstance mag zwar geringfügig schneller sein (da du beispielsweise nur Objekt-Freigaben mitbekommst und keine Feld-Wald-und-Wiesen-FreeMems), allerdings ist es auch erheblich unsauberer.

stoxx 17. Feb 2009 17:26

Re: eigenen Pointer unterbringen in TObject?
 
Ich muss gestehen, dass der Hook auf FreeInstance mir besser gefällt ...

hab da was gefunden, bin mir aber nicht sicher, ob das das richtige ist?

http://www.kbasm.com/delphi-per-class-allocator.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.
Seite 1 von 2  1 2      

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