![]() |
Delphi-Version: 2010
Klassen Wegoptimieren abschalten ?
Moin !
Ich habe ja hier versucht aus einem String eine Klasseninstanz zu erstellen: ![]() Das funktioniert auch. Aber wenn die Klasse in der Anwendung vorher nie für eine Instanz benötigt wird, dann optimiert der Compiler die Klasse weg. Gibts einen Schalter/Direktive mit dem ich dem Compiler sagen kann "Diese Klasse immer mit in die Anwendung compilieren" ? |
AW: Klassen Wegoptimieren abschalten ?
Nachtrag:
![]() Dort habe ich schon mal nachgesehen. Aber nix passendes gefunden :? |
AW: Klassen Wegoptimieren abschalten ?
Delphi läßt nunmal alles weg, welches nicht verwendet wird und abschalten läßt es sich nicht.
Einzige Lösung: das gewünschte Verwenden. Also irgendwo den Klassennamen benutzen und alle Methoden aufrufen. Und wenn es irgendwo in einem IF-Block steckt, welcher nie aufgerufen würde (also so, daß es der Compiler nicht mitgekommt, denn sonnst läßt es es ebenfalls weg :stupid: ... z.B. if Klassenvariable <> 0, welche aber nirgends gesetzt wird) |
AW: Klassen Wegoptimieren abschalten ?
Wasn Bullshit :)
Nuja, muss man dann wohl mit leben :cry: |
AW: Klassen Wegoptimieren abschalten ?
Joar, war ich damals auch drüber gestolpert, als ich versuchte einige Klassen über DLL-Grenzen hinweg nutzbar zu machen ... ohne BPLs.
Aber standardmäßig gibt es ja keinen Grund, irgendwas einzubinden, welches nicht genutzt wird ... drum wurde dafür wohl auch keine Moglichkeit implementiert. OK, außer bei eingebundenen Resourcen ( .RES ), wo Delphi leider alles einbindet, welches in irgendeiner Datei ( .PAS / .DPR ) verlinkt ist. (das verursacht übrigens einen gewissen Teil unserer "rießigen" Delphi-Anwenungen) |
AW: Klassen Wegoptimieren abschalten ?
Zitat:
Also hast du nur das Problem, dass die Klasse selber als nirgendwo benutzt erkannt wird und nicht kompiliert wird. Das kannst du einfach mit einem initialization Block in der jeweiligen Unit lösen. Dort kannst du zum Beispiel ein RegisterClass(TMyObject) machen oder einfach eine Dummy Methode aufrufen, die nix macht. |
AW: Klassen Wegoptimieren abschalten ?
Ich denke dass du deiner Lösung (RTTI und Delphi Internas bis an die Grenzen ausreizen) auf den Holzweg bist.
Immer an das ![]() Leider hast du nirgends erklärt wozu du Strings in Objekte umwandeln möchtest und wie die Klassen aufgebaut sind. Es gibt aber die Design-Pattern ![]() ![]()
Delphi-Quellcode:
Eine saubere Lösung ohne Tricks und doppelten Boden.
TGameObjFactory = class(TObject)
public class function CreatePlayer:TPlayer; class function CreateBomb:TBomb; class function CreateBlackHole:TBlackHole; class function CreateByString(const s:string):TGameBaseClass; end; class function TGameObjFactory.CreatePlayer:TPlayer; begin Result := TPlayer.Create; end; class function TGameObjFactory.CreateByString(const s:string):TGameBaseClass; begin if s='player' then result := CreatePlayer else if s='bomb' then result := CreateBomb else if s='timebomb' then begin Result := CreateBomb; TBomb(Result).Delay := 360; end else ... end; |
AW: Klassen Wegoptimieren abschalten ?
Nja, in Delphi gibt es ja auch schon eine Vorlage (quasi ein Designpattern) und zwar die VCL.
String (Klassenname aus der DFM) > ein Objekt erzeugen (also das Formular laden) |
AW: Klassen Wegoptimieren abschalten ?
Moin !
Zitat:
Wenn der User nun sein Gerät auswählt hatte ich folgende Idee: Ich durchsuche per RTTI alle vorhandenen Klassen. Und die Klassen die entweder einer bestimmten Namenkonvention folgen oder ein spezielles Attribut haben gebe ich dem User zur Auswahl. Er selektiert dann sein Gerät (und damit die Geräteklasse) und ich nutze eben die Auswahl um meine Klasseninstanz zu erstellen. Das hätte den Vorteil das man weitere Geräte hinzufügen kann, ohne sich an anderer Stelle Gedanken über die Einbindung zu machen. Neue Geräte würden automatisch erkannt und dem User angeboten. Derzeit haben wir ein Konstrukt das eben so ausschaut: if name = 'test1' then Geraet := TLVTest1.Create..... Aber wie geschrieben muss man dort bei jedem Gerät dafür sorgen das es eben auch dort eingetragen wird. Ist sicher kein riesen Aufwand, aber ich wollte eben mal einen neuen Weg testen :) |
AW: Klassen Wegoptimieren abschalten ?
Was passiert, wenn zufällig irgendeine Klasse, welche mit deiner Nutung rein garnichts zu tun hat, zufällig einen passenden Klassennamen oder dieses Attribut besitzt?
Besser wäre es, wenn diese Klasse also z.B. von einem bestimmten Vorfahren abgeleitet ist, damit du direkt über diesen Vorfahren zugreifen kannst (nötige Methoden per virtual+override hinzugefügt). Somit könnte man auch noch "sicherer" prüfen, ob die Klasse auch über die gewünschten Funktionen verfügt. Wenn man da nun eh eine Unit (mit der Basisklasse) einbinden muß, dann wäre es ein Leichtes, dort eine Registrierungsstelle anzubieten, wo neue Klassen registriert werden. Und schon hat man keinerlei Probleme mehr. - registrierte (benutzte) Klassen werden nicht wegoptimiert - die überschriebenen Methoden und in der Basisklasse verwendeten Methoden, beiben ebenfalls erhalten - man hat nun eine wunderschöne und extrem leicht zu durchsuchende Liste alle wichten Klassen und muß nun auch keine der anderen zigtausend Klassen rausfiltern, welche die RTTI unnötiger Weise mit auflistet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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 by Thomas Breitkreuz