Ich möchte eine neue Komponente/Klasse auf basis der TForm Komponente erstellen. Diese neue Klasse soll dann ein paar erweiterte Eigenschaften und Funktionen haben. Nur hab ich das irgendwie absolut nicht hinbekommen Wie erzeuge ich eine neue Klasse auf basis von TForm und wie ergänze ich mögliche Eingeschaften und Funktionen?
argh
ok
falsch beschrieben da muß ich dann doch etwas weiter ausholen...
Also, ich hab ein Formular in einem Delphi Package gespeichert,
dieses wird zur Laufzeigt gelade und das Formular erzeugt. Um an das Forumlar in irgendeiner Weise zu nutzen muß ich mit
"with ... as TCustomForm do" darauf Zugreifen. Deshalb kann ich aber nicht auf variablen des Forumlars aus dem Paket von der Anwendung aus zugreifen da diese ja nicht in TCustomForm drin stecken. Die variablen und funktionen die ich brauche sind aber bei jeden Forumlar in jedem Package was ich lade gleich. Nur bekomme ich darauf ja keinen Zugriff so lange ich mit TCustomForm arbeiten muß. Also müßte ich in der Anwendung das ganze als TObjectForm behandeln(oder wie das Formular aus dem Packet auch heißt). Also müßte ich in der Anwendung die das Formular aus dem Package ließt als type TObjectForm mit den immer gleichen variablen und funktionen definieren... oder?
Nur habe ich dann nicht das ich für jede funktion die ich dort definiere auch gleiche eine Funktion im Code der Anwedung zuweise muß? Oder wie erreiche ich es das er dann auf die Funktion des Packets zugreift wenn ich dieses als TObjectForm betrachte?
Hier mal ein genauses Beispiel...
In dem Package was ich lade ist ein Forumlar mit diversen Komponenten und funktionen. In der Publik Sektion habe ich " ObjectID : integer;" hinzugefügt.
Nun füge ich in der Anwendung unter type
Code:
TObjectWnd = class(TForm)
public
ObjectID : Integer;
end;
hinzu da ich das Formulas aus dem Package als laden und auf ObjectID zugriff haben will. Bei
Ändere ich das TCustomForm zu "with PackageData.C as TObjectWnd do". Nur sagt er mir jedesmal "ungültige Typenumwandlung" als Fehler... ich hoffe nun versteht jeder mein Problem was mache ich falsch?[/code]
Mit der Methode FindComponent kann man sich eine Komponente auf einer Form anhand ihres Names zurückgeben lassen.
Mit MethodAddress und FieldAddress kann man von jedem Objekt die Addresse einer Methode oder eines Elementes im published Bereich herausfinden.
Mit den Funktionen SetStrProp,SetOrdProp,SetObjProp bzw.. GetStrProp usw. aus der unit typinfo, kann man die Eigenschaften eines Objektes über ihren Namen schreiben bzw lesen.
Eine ganz andere Idee wäre die Form in der Package von einer Basisklasse mit den entsprechenden Methoden und Eigenschaften die du benötigst abzuleiten und diese Basisklasse in einer unit zu deklararieren, die die Package und das Hauptprogramm statisch einbinden.
Eine ganz andere Idee wäre die Form in der Package von einer Basisklasse mit den entsprechenden Methoden und Eigenschaften die du benötigst abzuleiten und diese Basisklasse in einer unit zu deklararieren, die die Package und das Hauptprogramm statisch einbinden.
Das ist genau das was ich will...
Denn dann müßte es doch funktionieren das ich das geladene Formular einfach mit "widht ... as TBasisKlasse do" behandeln kann. Oder?
Hmm, wenn du dein Formular aus einem Package lädst und gleichzeitig den selben Formulartyp aus einer statischen Unit einbindest, kann es schon sein, dass Delphi nicht erkennt, dass es die selben Typen sind (sind es genaugenommen ja auch nicht: es sind zwei verschiedene Typen, die halt zufällig genau gleich deklariert wurden).
Eine (nicht ganz elegante) Lösung, wäre anstatt des as Operators einen einfachen Typecast zu verwenden
with TMyForm(form) do
...
Da dieser keine Typüberprüfung mit sich bringt. Allerdings solltest du dann sicher stellen, dass die Kompileroptionen in Hauptprogramm und Package exakt die selben sind, damit sich Membervariablen und VMT auch tatsächlich an gleicher Adresse befinden.
Du kannst es ja probieren - eleganter und sicherer ist aber Lars Middendorfs Methode.
Vielleicht bin ich da falsch verstanden worden, aber ich meinte eigentlich genau das gleiche wie Mars. Das einzige was dem Compiler da fehlt sind ja die Typeinformationen für die Klasse.
Die gemeinsam genutzte Unit darf aber nur bei requires in der Package stehen und nicht bei contains, weil die Package sonst nicht geladen werden kann.
Die gemeinsam genutzte Unit ist da die basis Klasse für das Formular?
Die binde ich ins Package und in die Hauptanwendung ein.
Im Package wird das das Forum "TForm1 = TBasisKlasse"
und in der Anwendung wirds dann als "TBasisKlasse" behandelt welche ebenfalls aus der gleichen Unit geladen wird.
richtig?
Das ganze funktioniert bis jetzt erstmal Nur noch eine Frage zu proceduren und functionen.
Wenn ich in der Basis Klasse eine prozedur definiere diese aber dann vom Formular des Package geändert werden soll dann definiere ich die procedur in der Basis Klasse als "virtual" und im Form des Package definiere ich sie einfach mit "override" neu...
Macht man das so oder mache ich damit irgendwas falsch ?
Ja, die Methode muß als dynamic oder virtual deklariert werden, weil der Compiler bzw. Linker die Addresse der Methode beim Erstellen der Exe Datei nicht weiß. Auf virtuelle Methoden wird über eine Tabelle zugegriffen und dynamische Methoden haben alle einen Index, der beim Aufruf in der Klasse und dann in der Basisklasse usw.. gesucht wird. Daher sind dynamic Methoden langsamer, aber jede Klasse benötigt nur die jenigen Methoden in der Methodentabelle für dynamische Methoden, die neu deklariert oder überschrieben werden. Bei virtuellen Methoden enthält die virtuelle Methodentabelle immer alle geerbten virtuellen Methoden. "class of" Typen sind Zeiger auf diese VMT, die an negativen Indizes noch mehr Informationen enthält, und jedes Objekt enthält als ersten Eintrag einen Zeiger auf seine Klasse.
Weil die Einträge in der Tabelle in der Reihenfolge der Deklaration vergeben werden, muß die Exe Datei und die Package neu erstellt werden, falls etwas an der Reihenfolge geändert wird.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Dynamic und Virtual sind von der Handhabung her vollkommen identisch. Der einzige Unterschied besteht dabei, dass Dynamic auf Codegröße hin optimiert wird wärend Virtual auf Ausführungsgeschwindigkeit setzt.
Dynamic macht nur dann Sinn (lauf der Delphihilfe) wenn man in einer Basisklasse sehr viele Methoden deklariert diese in vielen abgelittenen Klassen aber nur selten überschreibt.
Aber mal so eine Frage zum Verständniss. Ich weiß nämlich nicht, ob ich das noch richtig verstanden habe oder ob ich irgendwo abgehangen wurde. Stammt das Package auch von dir oder hast du das irgendwo heruntergeladen?
Ich habe die Entwicklung von SharpDesk übernommen(Desktop Komponente der SharpE Shell Erweiterung). Die aktuelle version ist derbst alt und primitv. Deshalb Code ich es komplett neu. In der alten Version war alles fest in der exe integriert(Über einfaches erzeugen von Bildern zur Laufzeit,...) . Ich hab mich aber dazu entschieden es Modular aufzubauen. Es soll dann so sein das die Packages als Module/Plugins/Desktop Objekte von der Haupt Anwendung geladen werden. Ich erstelle also die Hauptanwendung und ein paar Beispiel Packages. So können die ganzen anderen SharpE Entwickler dann auch Desktop Objekte / Packages erstellen und auch später hinzufügen. Dazu erstelle ich jetzt einfach die Basis Klasse für jedes Package so das die Kommunikation zwischen Anwendung und Package durch diesen Standard definiert wird und bei jedem Package gleich ist.
Das Prob war halt nur das ich vorher noch nie mit Packages gearbeitet habe
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Okay. Jetzt verstehe ich auch den Sinn in der Aktion. Das war mir nämlich gerade noch nicht ganz so klar. Aber in diesem Falle musst du ja mehr oder minder mit Packages arbeiten. Eine andere Alternative wären DLL's. Aber Forms daraus zu erstellen ist ähnlich nervenzerreißend.
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.