Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 18:57

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: neue TForm Klasse erstellen
BeitragVerfasst: Do Dez 04, 2003 22:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 04, 2003 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 26, 2003 15:57
Beiträge: 50
Wohnort: Hamminkeln
Code:
  1.  
  2.  TMyOwnForm = class(TForm)
  3.     {...]
  4.   end;
  5.  


In dem kommentierten Teil kannst du dann deine zusaetzlichen Funktionen bzw. Variablen einbauen, genau wie du es sonst mit Klassen machst.

mfg,
Dennis.

_________________
Bush's on a highway to hell with the whole world blind, leading it straight into the flames.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 04, 2003 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
argh
ok
falsch beschrieben :wink:
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?

ohje, ich glaub das wird keiner verstehen :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 04, 2003 23:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
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:
  1.  
  2.   TObjectWnd = class(TForm)
  3.   public
  4.     ObjectID : Integer;
  5.   end;
  6.  

hinzu da ich das Formulas aus dem Package als laden und auf ObjectID zugriff haben will.
Bei
Code:
  1.  
  2. PackageData.AClass := GetClass('TObjectWnd');
  3. if PackageData.AClass <> nil then
  4. begin
  5.        PackageData.C:=TComponentClass(PackageData.AClass).Create(Application);
  6.        with PackageData.C as TCustomForm do
  7.        begin
  8.        ...
  9.        end;
  10. end;
  11.  

Ä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 :wink:
was mache ich falsch?[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 04, 2003 23:17 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 04, 2003 23:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
LarsMiddendorf hat geschrieben:
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 05, 2003 22:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
... kann mir bitte irgendjemand weiter helfen? Ich krieg das alleine nicht wirklich hin. Aber es ist derdammt wichtig das ich das hinbekomme :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 12:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
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.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 13:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
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? :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 18:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
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 ? :?:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 19:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 19:32 
Offline
DGL Member
Benutzeravatar

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 19:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
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 :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 06, 2003 20:49 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]