AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Komponenten mit dem Formular-Designer entwerfen
Thema durchsuchen
Ansicht
Themen-Optionen

Komponenten mit dem Formular-Designer entwerfen

Offene Frage von "Der schöne Günther"
Ein Thema von Der schöne Günther · begonnen am 12. Mär 2014 · letzter Beitrag vom 12. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 13:57
Mein Ziel: Ich möchte, ausgehend von einem TFrame, eine eigene VCL-Komponente erstellen. Mit eigenen Properties und Event-Handler.

Das bekomme ich relativ flott hin und bin vom Ergebnis begeistert.

Ich glaube aber nicht, dass ich alles richtig gemacht habe, vor allem da das benutzende Projekt die .DFM-Datei des Frames im Suchpfad haben muss.

Ich gehe so vor:
  • Neue Komponente, ausgehend von TFrame erstellen, in neues Package
  • Die automatisch angelegte Unit kann ich wegwerfen. Das ist eine reine Unit ohne Formular dahinter.
  • Ich füge meinem "Projekt" einen VCL-Frame hinzu.
  • Ich bastele den Frame so zusammen, wie ich ihn haben möchte. Event-Handler, interne Logik, alles.
  • Ich füge in meiner Frame-Unit (oder einer separaten) eine Prozedur "Register" ein und registriere die Kompente so wie ich es für richtig halte
  • Ich installiere die Komponente

Wenn ich meine Komponente in ein lauffähiges Projekt einbauen möchte habe ich sie jetzt wie einen TButton in der Tool-Palette und kann damit anstellen, was ich mag. Allerdings muss das Projekt den Pfad, an welchem die DFM des Frames liegt im Suchpfad haben. Ich habe keine Ahnung warum.

Weiterhin bekomme ich beim Kompilieren einen Hinweis
Code:
[dcc32 Hinweis] H2161 Warning: Duplicate resource: Type 10 (RCDATA), ID TMYFRAME; File C:\Pfad\MyComponent\TestProject\..\MyFrameUnit.dfm resource kept; file C:\Pfad\MyComponent\MyFrameUnit.dfm resource discarded.
An den Pfaden sieht man, dass es er ein und dieselbe Datei für zwei verschiedene hält.


Ich würde mich freuen wenn mir jemand erklären kann warum das benutzende Projekt die DFM zur Kompilierzeit kennen muss. Und ob ich den Kompilierhinweis abstellen oder beruhigt ignorieren kann. Und ob ich die Komponente dann auch im C++ Builder verwenden kann habe ich noch überhaupt nicht ausprobiert. Sollte gehen, oder?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#2

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 14:06
So richtig kann ich jetzt zwar nicht helfen, ABER

Weiterhin bekomme ich beim Kompilieren einen Hinweis
Code:
[dcc32 Hinweis] H2161 Warning: Duplicate resource: Type 10 (RCDATA), ID TMYFRAME; File C:\Pfad\MyComponent\TestProject\..\MyFrameUnit.dfm resource kept; file C:\Pfad\MyComponent\MyFrameUnit.dfm resource discarded.
An den Pfaden sieht man, dass es er ein und dieselbe Datei für zwei verschiedene hält.
das sind ja auch zwei "unterschiedliche" Dateien, auch wenn sie den selben Inhalt haben mögen. (zwei unterschiedliche Adressen)
Und nein, beim Vergleich der Pfade löst halt nicht jeder den Pfad auf, womit das für den dann eben unterschiedliche Pfade sind.

Hier liegt das Problem auch nicht am Pfad, sondern daß irgendwer die selbe Resource (der selbe Resource-Name) versucht "doppelt" einzubinden.



Ach ja, DFM-Resourcen sind Named.Resourcen, welche über den Namen der Form/Frame-Klasse gelasen werden.

Und Resourcen müssen eindeutig sein.
Es kann nur eine Resource mit dem selben Namen, bzw. mit der selben ID geben.

Wenn man mehrere Resourcen versucht in eine EXE oder DLL einzubinden, welche den selben Namen/ID haben, dann meckert natürlich der Linker rum und das zu Recht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (12. Mär 2014 um 14:09 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 14:08
Das sehe ich ein. Ich frage mich ja, was das benutzende Programm die DFM-Ressource der Komponente überhaupt angeht?
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 14:15
Frames sind visuelle Klassen und keine Komponenten. Damit die im Designer sichtbar sind, müssen sie imho im Projekt enthalten sein. Mir macht das nichts.

Ich habe ein 'Shared' Verzeichnis, direkt neben meinen Tools. die Tools sind per Suchpfad zu finden, im Shared-Verzeichnis habe ich Formulate und Datenmodule, die Grundfunktionen bereitstellen und in jedem Projekt zu finden sind. Dort würde ich so ein Frame plazieren und eben immer mit einbinden. Ich habe z.B. Standard-Dialoge mit einem OK-Button und frei konfigurierbarer Oberfläche, Titelleiste usw. Multilingual etc. Wenn ich das brauche - wupps- eingebunden und abgeleitet. Und so ein Frame (Fällt mir gerade keins ein, was ich *immer* brauchen kann) kommt eben auch in meinen Shared-Folder.

Nebenbei habe ich auch in einem Projektordner ein Shared-Verzeichnis, weil ein Projekt auch mehrere Apps Anwendungen beinhaltet. Dort sind dann z.B. Frames zum Suchen und Anzeigen eines Kunden oder Artikels etc. Ich baue mir das Teil also 1x und verwende es dann überall. Das hat einen hohen Wiedererkennunswert und der Anwender kennt sich damit sofort aus.

Ein Frame ist nun mal keine Komponente.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#5

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 14:16
Du kompilierst die Frameklasse da rein, also wird auch die zugehörige DFM da mit eingebunden *1, sonst könnte der Form-Loader den Frame ja nicht laden.

1: (Meistens) über das {$R ...} in der Unit der Frame-Klasse.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 14:47
Normale Komponenten erzeugen ihre Kindkomponenten 'per Hand'.
Im Frame übernimmt das die VCL über die DFM. Und dafür muss das Frame explizit im Projekt eingebunden sein. (Oder?)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.008 Beiträge
 
Delphi 12 Athens
 
#7

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 15:38
Ein anderer Weg für solch wiederkehrenden, visuellen Konstrukte (Form, Frame, DataModule) ist die Objektablage. Dafür bietet sich dann so ein globaler Shared-Folder à la Furtbichler an.

Die Vorgehensweise ist recht simpel. Man designt das Form (Frame, Datamodule) und speichert es zentral ab. Dann auf dem Form im Kontextmenü "Der Objektablage zufügen" auswählen, ein paar Angaben machen (bei dem Icon auf die Größe achten! - oder es einfach so belassen) und das wars.

Die Verwendung in einem beliebigen anderen Projekt geht dann über die Objektgalerie (oder Datei - Neu - Weitere...), wobei man dort Kopieren, Vererbenoder Verwenden zur Auswahl hat.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#8

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 16:11
Mein Ziel: Ich möchte, ausgehend von einem TFrame, eine eigene VCL-Komponente erstellen. Mit eigenen Properties und Event-Handler.

Ich würde mich freuen wenn mir jemand erklären kann warum das benutzende Projekt die DFM zur Kompilierzeit kennen muss. Und ob ich den Kompilierhinweis abstellen oder beruhigt ignorieren kann.
Ich habe eine Zeit lang mit Frame-Komponenten gearbeitet. Im Vergleich zu normalen Frames war das damals schon eine Verbesserung (die Dinger sind weniger fragil). Aber irgendwann war mir der Haufen an abhängigen Packages, die mehrfach verschachtelten Komponenten produzieren zu viel und ich bin dann auf ganz andere Techniken umgestiegen... Mal sehen woran ich mich noch erinnere..

Also das .dfm braucht z.B. der Compiler für die Komponente, da darin ja die Properties der Controls im Frame stehen.
Ohne die Informationen geht nix. Bei einem Formular in einem Package ist das genauso. Ohne Positions-Informationen
sähe so ein Formular wirklich nicht gut aus.

Komerzielle Packages ohne Sourcecode haben deshalb auch immer die nötigen .DFMs bei den .DCUs dabei.

Da man beim Entwickeln .pas und das .dfm schlecht in unterschiedliche Pfade legen kann,
wird man bei Frame-Komponenten leider dahin genötigt den ganzen Sourcecode in den Library-Pfad zu stellen.

Wenn man die dfm kopiert hat man sie doppelt auf dem Rechner und das produziert auf ganz natürliche Art und Weise
Ärger.

Arbeitet man ausserdem in einem Projekt, das den Frame selbst enthält sieht der Compiler das DFM vermutlich doppelt.
Also: Frame als Komponente -> Frame aus den Projekten entfernen und nur im Package der Komponente bearbeiten.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 16:32
Ein anderer Weg für solch wiederkehrenden, visuellen Konstrukte (Form, Frame, DataModule) ist die Objektablage. Dafür bietet sich dann so ein globaler Shared-Folder à la Furtbichler an
Stimmt. Hatte ich früher (und verdrängt). Mein Problem dabei: Ich kopiere das Projektverzeichnis und packe es auf einen anderen Rechner => Objektablage fehlt => Projekt kann nicht kompiliert werden.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Komponenten mit dem Formular-Designer entwerfen

  Alt 12. Mär 2014, 16:49
Danke für die zahlreichen Antworten

Dass die DFM auch in der benutzenden Anwendung benötigt wird habe ich verstanden. Das Dopplungs-Problem war rein meine Schuld: Irgendwie ist mir ganz oben in meine DPR der benutzenden Anwendung ein {$R '..\MyFrameUnit.dfm' :TForm(MyFrameUnit)} gerutscht. Keine Ahnung woher. Aber das war es.

Danke auch für den Hinweis mit der Objektablage bzw. dem "Der Komponentenpalette hinzufügen". So mache ich es seit dem kurz nach dem Tag als ich Frames entdeckte.

Nur habe ich mit der Tatsache,
  • dass sich die Frames weiterhin (leicht ungewollt) verändern lassen (da alle enthaltenen Komponenten published sind)
  • und die Dinger oft mit der Zeit langsam zusammenbröseln (siehe mein Thema hier)
große Hoffnung darin, die Dinger als reine Komponenten zu realisieren.

Eigentlich bin ich jetzt fertig. Ich baue entspannt meinen Frame als Komponente, dichte noch Events und Properties (wie ein zu benutzendes TDataSource) mit dran und sehe dann im Objektinspektor nur die ganz grundlegenden TControl -Eigenschaften und meine zugedichteten Dinge.

Hätte ich mich nur früher mal damit auseinandergesetzt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.
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