| Autor |
Beitrag |
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 25.04.03 10:15
Hi,
wie soll ich das machen : Auf einer Form sind 100 Labels. Diese sollen alle gleich aussehen (z.B. gleich lang werden). Nun könnte ich ja 100mal die Länge, Schriftart usw. einstellen. Besser wäre es aber wohl dies für die ganze Form festzulegen. Also wollte ich eine neue Form-Klasse von TForm ableiten, die von Hause aus die erforderlichen properties hat. Als Vorfahr-Typ kann ich aber anscheinend TForm nicht benutzen. Zumindest wird es nicht aufgeführt. Ist das Objekt-Repository vielleicht für so was gut, oder wie soll ich das machen?
_________________ Gruß
Hansa
Zuletzt bearbeitet von hansa am Fr 25.04.03 11:40, insgesamt 1-mal bearbeitet
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Fr 25.04.03 10:26
Du meinst du leitest eine neue Klasse von TForm ab und willst diese dann so installieren, dass die neuen Properties der Form zur DesignTime im OI auftauchen?
Das Problem hatte ich vor kurzem auch..! Du musst die neue Klasse mit RegisterCustomModule registrieren. Mehr dazu kann ich dir erst sagen wenn ich zu Hause bin, hab jetzt keinen Code in dem ich nachschaun kann wie der genaue Aufruf ausschaut.
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Fr 25.04.03 10:28
Hallo,
ich habe dein konkretes Problem nicht verstanden, möchte dir aber trozdem zwei Hinweise geben, die dir vieleicht helfen:
1. du solltest Deine Formulare nciht von tForm, sondern von tCustomForm ableiten. Funktionieren sollte beides, aber bei tCustum Form kannst du selber festlegen, welche Propertys du veröffentlichst.
2. Interessant wenn du mehrere Gleichartige Komponenten Maipulieren willst, ist FindComponent. Ein Beispiel fidest du hier: www.delphi-forum.de/viewtopic.php?t=10419
Gruß
Klabautermann
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Fr 25.04.03 10:45
| Klabautermann hat folgendes geschrieben: | | 1. du solltest Deine Formulare nciht von tForm, sondern von tCustomForm ableiten. Funktionieren sollte beides, aber bei tCustum Form kannst du selber festlegen, welche Propertys du veröffentlichst. |
Hab ich auch geglaubt und ausprobiert, aber...
Sofern die MainForm von der neuen Klasse abgeleitet werden soll funktioniert das nicht! (wie das bei andren Formen die zur Laufzeit erzeugt werden ausschaut weiß ich nicht)
Grund ist folgendes: wenn eine Form mit einem Aufruf von Application.CreateForm() erzeugt wird (was zB bei der MainForm der Fall ist) dann wird die Form in einer Liste des Screen-Objektes aufgenommen (ich glaub mittels der Methode AddForm o.ä.) In dieser Methode findet allerdings eine explizite Prüfung auf "is TForm" statt weshalb eine MainForm die nicht von einer Klasse abgeleitet ist die TForm in ihrer Hierachie hat nie am Bildschirm auftaucht!"
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 25.04.03 11:00
Also nochmals : ich will 2,3 (vielleicht werdens auch mehr) Eigenschaften in der Form hinterlegen. Diese Eigenschaften sollen dann von einzelnen Steuerelementen übernommen werden. Z.B. sage ich der Form einmal, daß alle Buttons hellblau sein sollen. D.h. die Buttons "fragen" die Form, welche Farbe sie haben sollen. Und vor allem soll das ganze einheitlich sein. Wie Motzi schon vermutet hat, soll das ganze am besten im OI eingestellt werden. Und worauf Klabautermann hinaus will, ist auch klar. Mit FindComponent könnte ich in dem Stile :
Quelltext 1: 2:
| if component is TButton then Farbe := hellblau |
gezielt alle buttons hellblau einfärben. Mir geht es aber nur darum einen Wert in der Form zu hinterlegen, den ich eventuell noch brauche. Dann käme eventuell FindComponent ins Spiel. Von Form zu Form kann der Wert stark variieren. Mir fällt gerade ein, ich kann das ja einfach in die Deklaration der Form reinschreiben. Im OI wärs allerdings eleganter. Wobei die ursprüngliche Frage noch nicht geklärt ist, nämlich wie ich einen Abkömmling einer Form hinkriege. Ich ändere mal den Titel. Geht das überhaupt ?
@Motzi:Monster-Thread Nr. 2 
_________________ Gruß
Hansa
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 25.04.03 11:11
@Mods: wäre nicht schlecht, man könnte den Titel ändern.
zur Sache:
Da die auf der Form liegenden Komponenten intern auf einen Wert zugreifen müssen, reicht es nicht, einfach in der Form-Deklaration etwas hinzuschreiben. Der Owner muß schon diese Eigenschaft besitzen. Wehe, wenn man bei einer Form dies vergisst. Also doch ein klassischer Fall von Vererbung. Ich muß TForm erweitern. Wobei FindComponent schon ein (aber nicht sehr schöner) Ausweg wäre.
P.S.: Das Hauptproblem ist im Moment: New->Component->Anchestor-Type Tja, das wars, denn von TForm,TCustomForm usw. keine Spur. 
_________________ Gruß
Hansa
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Fr 25.04.03 11:21
| hansa hat folgendes geschrieben: | | @Mods: wäre nicht schlecht, man könnte den Titel ändern. |
Bin zwar kein Mod, weiß aber trotzdem wies geht!  Einfach deinen ersten Beitrag editieren und den Titel ändern. Das schaffst du auch selber..
| Zitat: | zur Sache:
Da die auf der Form liegenden Komponenten intern auf einen Wert zugreifen müssen, reicht es nicht, einfach in der Form-Deklaration etwas hinzuschreiben. Der Owner muß schon diese Eigenschaft besitzen. Wehe, wenn man bei einer Form dies vergisst. Also doch ein klassischer Fall von Vererbung. Ich muß TForm erweitern. Wobei FindComponent schon ein (aber nicht sehr schöner) Ausweg wäre. |
Hä? Sorry, aber wiedermal *nixcheck*..!
| Zitat: | P.S.: Das Hauptproblem ist im Moment: New->Component->Anchestor-Type Tja, das wars, denn von TForm,TCustomForm usw. keine Spur.  |
Einfach eine neue unit anlegen und den Rest selber eintippen..! 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 25.04.03 11:49
Ich habe mir folgendes überlegt : Farben sind mir zu blöd, aber folgendes wäre gut: angenommen ich habe 20 LabeledEdits auf der Form (@Motzi:hoffe Du verstehst den Zusammenhang). Nun wäre es doch einwandfrei, wenn die schön alle untereinander stehen. Zu diesem Zweck könnte man doch ein Feld in der Form einfügen. Und dieses Feld sagt den laabels, wie breit sie sein müssen. Ich hab mal so angefangen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| unit StammForm;
interface
uses Windows, Messages, SysUtils, Classes, Controls, Forms;
type TStammForm = class(TForm) private { Private declarations } FLabelLaenge: integer; procedure SetLabelLaenge(const Value:integer); protected { Protected declarations } public { Public declarations } published { Published declarations } property LabelLaenge: integer read FLabelLaenge write SetLabelLaenge; end;
procedure Register;
implementation
procedure TStammForm.SetLabelLaenge(const Value: Integer); begin FLabelLaenge := Value; end;
procedure Register; begin RegisterComponents('Samples', [TStammForm]); end;
end. |
Schön und gut, da ist im OI jetzt ein Feld LabelLaenge zu sehen. Und nu? Ziehe ich die Komponente auf die Form, tja so wohl nicht. Das ganze müßte bei NEW->OTHERS, halt so wie man auch eine neue Form erzeugt.
_________________ Gruß
Hansa
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Fr 25.04.03 15:55
Tja, wie schon gesagt registriert man eine Form nicht mit RegisterComponent sondern mit RegisterCustomModule.
Nachdem ich jetzt zu Hause bin kann ich dir auch meinen exakten Code geben:
Quelltext 1:
| RegisterCustomModule(<deinKlassenname>, TCustomModule); |
Benötigen tust du die Units DesignIntf und DesignEditors. Außerdem musst du (glaub ich) ein DesignTime-Package und ein RunTime-Package erstellen. Ein "Kombi"-Package funktioniert in diesem Fall nicht. Wie man die neue Form jetzt bei New->Other unterkriegt hab ich auch noch nicht rausgefunden, aber es reicht schon, wenn du in einem neuen Projekt einfach den Klassennamen von TForm auf deinen Klassennamen umschreibst.
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 25.04.03 18:37
Das da scheint ans eingemachte zu gehen. DesignInt???? ist irgendwo bei ToolsAPI. Das geht schon ziemlich tief alles. Wir werden sehen.
_________________ Gruß
Hansa
|
|
opfer.der.genauigkeit
      
Beiträge: 754
Erhaltene Danke: 1
|
Verfasst: Fr 25.04.03 19:36
Ich muß zugeben, ich hab das alles nur überflogen.
Aber das erste was mir in den Kopf kommt ist, daß du dir die Arbeit vielleicht mit nem Frame sparen kannst?
Und noch ne Sache die mir durch den Kopf geht:
Ich hab das hier nur überflogen also nich gleich umbringen wenn ich was falsches sage. 
_________________ Stellen Sie sich bitte Zirkusmusik vor.
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 25.04.03 19:41
| opfer.der.genauigkeit hat folgendes geschrieben: | ...Aber das erste was mir in den Kopf kommt ist, daß du dir die Arbeit vielleicht mit nem Frame sparen kannst?
|
Über Frames ist fast nichts zu finden. Jedenfalls nichts brauchbares.
_________________ Gruß
Hansa
|
|
opfer.der.genauigkeit
      
Beiträge: 754
Erhaltene Danke: 1
|
Verfasst: Sa 26.04.03 02:12
Naja... mein Gedanke war der... er wollte die von ihm veränderte Klasse TForm ableiten.
Wenn er einfach alle eine Elemente auf nen Frame transferieren würde, dann hätte er doch prinzipiell den gleichen Effekt. Was den Frames fehlt ist allerdings n Create bzw. Destroy...
_________________ Stellen Sie sich bitte Zirkusmusik vor.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 26.04.03 10:20
| hansa hat folgendes geschrieben: | | Das da scheint ans eingemachte zu gehen. DesignInt???? ist irgendwo bei ToolsAPI. Das geht schon ziemlich tief alles. Wir werden sehen. |
Ja, die Units sind beide bei der ToolsAPI und ja, das geht ziemlich tief. Wobei das noch nix im Vergleich dazu ist, wenn du die Form ins Repository aufnehmen willst, weil da musst du dir dann (soweit ich das bis jetzt mitbekommen hab) einen eigenen Wizard schreiben, der von einem Interface abgeleitet wird...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 26.04.03 10:51
So schlimm scheint es nicht zu sein. Soeben kommt die Nachricht wie es angeblich geht (von Borland). Man muß die Form in das Repository legen und da eben inherited auswählen. Eigentlich logisch. Habs aber noch nicht ausprobiert.
_________________ Gruß
Hansa
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 26.04.03 11:40
| hansa hat folgendes geschrieben: | | So schlimm scheint es nicht zu sein. Soeben kommt die Nachricht wie es angeblich geht (von Borland). Man muß die Form in das Repository legen und da eben inherited auswählen. Eigentlich logisch. Habs aber noch nicht ausprobiert. |
Ja, manuell über die IDE ist es kein Problem.. aber ich meinte codegesteuert...!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 26.04.03 11:53
Bei mir gehts so nicht. Der button "inherit" ist grau. ich kann nur copy wählen. Dann kommt die Aufforderung: "Select Directory" und dann versucht der Sauhund, alle PAS,DFM usw. zu überschreiben, die er anscheinend auf der ganzen Festplatte sucht. 
_________________ Gruß
Hansa
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 26.04.03 12:57
| hansa hat folgendes geschrieben: | Bei mir gehts so nicht. Der button "inherit" ist grau. ich kann nur copy wählen. Dann kommt die Aufforderung: "Select Directory" und dann versucht der Sauhund, alle PAS,DFM usw. zu überschreiben, die er anscheinend auf der ganzen Festplatte sucht.  |
Äh.. was tust du? Bzw. wie kommt es zu dieser Situation?
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 26.04.03 13:11
Ganz einfach, ich habe "Add to Repository" bei den Projekt-Optionen gewählt.  Um eine Form da rein zu kriegen muß man aber diese rechts klicken. Was aber immer noch nicht geht: irgendwelche Eigenschaften im OI sichtbar zu machen. Siehe obiger Quelltext. Das mit dem Register muß wahrscheinlich anders ablaufen, als bei einer Komponente. RegisterCustomModule scheint es nicht zu geben.
_________________ Gruß
Hansa
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 26.04.03 13:23
| hansa hat folgendes geschrieben: | | Was aber immer noch nicht geht: irgendwelche Eigenschaften im OI sichtbar zu machen. Siehe obiger Quelltext. Das mit dem Register muß wahrscheinlich anders ablaufen, als bei einer Komponente. |
Hab ich bereits geschrieben.. muss man mit RegisterCustomModule machn.
| Zitat: | | RegisterCustomModule scheint es nicht zu geben. |
RegisterCustomModule ist in DesignIntf deklariert und TCustomModule ist in DesignEditors. Du musst für deine Form aber wie bereits gesagt ein RunTime-Package und ein DesignTime-Package erstellen! Die Registrierung darf nicht über eine Register-Procedure innerhalb der Unit der Kompo erfolgen sondern in einer eigenen Unit die nur im DesignTime-Package ist. Und das DesignTime-Package braucht unter Requires designide.dcp und das RunTime-Package. Das ganze ist etwas komplizierter... probier einfach mal herum..!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|