![]() |
Mehrere Steuerelemente mit der gleichen "Identität"
Hallo allesamt,
Ich stehe bei einem Projekt momentan vor folgendem Problem: - Ich habe n-Buttons - Diese Buttons sollen sich lediglich davon Unterscheiden, wo sie angezeigt werden, sprich im Parent - Ändere ich bei einem Button eine Eigenschaft, sollen die Eigenschaften aller anderen Buttons ebenfalls angeglichen werden Nun ist die Frage ob es irgendwie Möglich ist Buttons zu erzeugen, die aber wiederum auf einen "Vater"-Button zeigen, sodass alle die selben Eigenschaften haben und diese auch immer parallel angleichen. Oder geh ich gerade logisch in die falsche Richtung? Ich bedanke mich schon jetzt für die Antworten :) |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
mit der VCL ist das nicht möglich, außerdem kapselt ja jeder Button ein eigenes Button-Control (von Windows)
dir bleibt also keine andere Möglichkeit, als entweder selber alle Buttons zu änder, oder die Buttons zu überwachen und bei Änderung diese bei den anderen Buttons auch zu ändern. Was willst du denn erreichen? ist immer nur ein Button auf einmal zu sehen, dann könntest du einen Button anlegen und diesen jeweils zu verschieben (wo er grad sichtbar ist) bei mehreren Buttons mußt du mehrere Buttons anlegen und deren eigenschaften "klonen"/kopieren |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Zitat:
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Zitat:
@himitsu: Gneau das was du da gerade geschrieben hast habe ich befürchtet. Das mit dem kopieren der Eigenschaften sollte wäre ein schlechter Weg, da dies, bezogen auf das was ich mache, zu aufwendig wäre. Das mit dem verschieben habe ich mir auch überlegt, wobei ich dies als keine wirklich elegante Lösung empfinde. Ich überlege schon seit Stunden hin und her, wie ich das mal am geschicktesten lösen könnte :/ |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
dank RTTI kannst du dr doch etwas zusammenbasteln, welches alles "automaisch" kopiert
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Ich hör grad RTTI zum ersten mal, les mir aber gerade parallel nen Artikel darüber durch :-)
Naja wen es wirklich nicht so geht, wie ich es mir erhofft habe, werd ich wohl ein zwischenweg zwischen Kapselung der Buttons in einem Überobjekt und dem hinundherkopieren wählen müssen. |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Hallo,
welchem Element wird den der Button jeweils zugeordnet? |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
was genau meinste oder worauf willste hinnaus?
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
was willst du denn nun damit erreichen und was kann sich alles an den Buttons ändern, welces übernommen werden soll?
im Notfall würde ja auch eine einfache Setter-Funktion ausreichen z.B. statt
Delphi-Quellcode:
Button1.Caption := 'xyz';
Button2.Caption := 'xyz';
Delphi-Quellcode:
SetButtonCaption('xyz');
Delphi-Quellcode:
wenn man die gewünschten Buttons irgendwie markiert oder man eine der vorhandenen Eigenschaften als Markierung nehmen kann, könnte man die Components der Form nach diesen Buttons durchsuchen und es überall setzen.
procedure SetButtonCaption(s: String);
begin Button1.Caption := s; Button2.Caption := s; Button3.Caption := s; ... end; |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Ändern kan sich so ziemlich alles. Das fängt bei der Caption an und hört bei nem Popupmenü auf. Natürlich könnte ich Setter-Funktionen machen, das ist jedoch für das Projekt grade sehr zeit- und arbeitsintensiv. ich hab mir jetzt überlegt eine klasse für einen fiktiven button zu schreiben, was halt im endeffekt auch auf sowas wie den setter-kram rausläuft, aber was solls.
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Hallo,
Zitat:
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Zitat:
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Ist vielleicht etwas oversized, aber sollte genau das tun, was du willst: Erzeuge einen neuen TFrame, leg den Button drauf und instanziere den Frame mehrfach auf deinem Form. Wenn du jetzt die Eigenschaften des Buttons im Frame änderst, erben das alle Instanzen des Frames.
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Delphi-Quellcode:
allerdings müßte tkClass noch etwas geändert werden, also speziell für Klassen, welche zum Objekt gehören und wo nur deren Inhalt kopiert werden müßte und nicht nur deren Referenz.
Procedure Clone(C, C2: TObject);
Var List: PPropList; i, i2: Integer; Begin i2 := GetPropList(C.ClassInfo, List); If i2 > 0 Then Try For i := 0 to i2 - 1 do If IsStoredProp(C, List[i].Name) and not MatchText(List[i].Name, ['Name', 'Parent']) Then Case List[i].PropType^.Kind of tkInteger, tkEnumeration, tkChar, tkWChar: SetOrdProp (C2, List[i].Name, GetOrdProp (C, List[i].Name)); tkInt64: SetInt64Prop (C2, List[i].Name, GetInt64Prop (C, List[i].Name)); tkSet: SetSetProp (C2, List[i].Name, GetSetProp (C, List[i].Name)); tkFloat: SetFloatProp (C2, List[i].Name, GetFloatProp (C, List[i].Name)); tkLString: SetAnsiStrProp (C2, List[i].Name, GetAnsiStrProp (C, List[i].Name)); tkWString: SetWideStrProp (C2, List[i].Name, GetWideStrProp (C, List[i].Name)); {$IF Declared(UnicodeString)} tkString, tkUString: GStUnicodeStrProp(C2, List[i].Name, GetUnicodeStrProp(C, List[i].Name)); {$ELSE} tkString: SetAnsiStrProp (C2, List[i].Name, GetAnsiStrProp (C, List[i].Name)); {$IFEND} tkClass: SetObjectProp (C2, List[i].Name, GetObjectProp (C, List[i].Name)); tkMethod: SetMethodProp (C2, List[i].Name, GetMethodProp (C, List[i].Name)); tkVariant: SetVariantProp (C2, List[i].Name, GetVariantProp (C, List[i].Name)); Else Raise Exception.Create('Propertytyp wird nicht unterstützt'); End; Finally FreeMem(List); End; End; |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Zitat:
|
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Eigentlich dachte ich, daß dann jeder Frame für sich alleine steht und nur das Gleiche vorm Erstellen der Instanz auch gleich ist :gruebel:
Delphi-Quellcode:
und das Ganze nun nur noch für jeden Button aufrufen
Procedure CloneObject(O, O2: TObject; Const Ignore: Array of String);
Var List: PPropList; i, i2: Integer; Begin i2 := GetPropList(O.ClassInfo, List); If i2 > 0 Then Try For i := 0 to i2 - 1 do If IsStoredProp(O, List[i].Name) and not MatchText(List[i].Name, Ignore) Then Case List[i].PropType^.Kind of tkInteger, tkEnumeration, tkChar, tkWChar: SetOrdProp (O2, List[i].Name, GetOrdProp (O, List[i].Name)); tkInt64: SetInt64Prop (O2, List[i].Name, GetInt64Prop (O, List[i].Name)); tkSet: SetSetProp (O2, List[i].Name, GetSetProp (O, List[i].Name)); tkFloat: SetFloatProp (O2, List[i].Name, GetFloatProp (O, List[i].Name)); tkLString: SetAnsiStrProp (O2, List[i].Name, GetAnsiStrProp (O, List[i].Name)); tkWString: SetWideStrProp (O2, List[i].Name, GetWideStrProp (O, List[i].Name)); {$IF Declared(UnicodeString)} tkString, tkUString: SetUnicodeStrProp(O2, List[i].Name, GetUnicodeStrProp(O, List[i].Name)); {$ELSE} tkString: SetAnsiStrProp (O2, List[i].Name, GetAnsiStrProp (O, List[i].Name)); {$IFEND} tkClass: If MatchText(List[i].Name, ['CustomHint', 'Action', 'DropDownMenu', 'Images', 'PopupMenu']) Then SetObjectProp (O2, List[i].Name, GetObjectProp (O, List[i].Name)) Else If (GetObjectProp(O, List[i].Name) is TPersistent) and ( GetObjectProp(O2, List[i].Name) is TPersistent) Then TPersistent(GetObjectProp(O2, List[i].Name)).Assign(GetObjectProp(O, List[i].Name) as TPersistent); tkMethod: SetMethodProp (O2, List[i].Name, GetMethodProp (O, List[i].Name)); tkVariant: SetVariantProp (O2, List[i].Name, GetVariantProp (O, List[i].Name)); Else Raise Exception.Create('Propertytyp wird nicht unterstützt'); End; Finally FreeMem(List); End; End;
Delphi-Quellcode:
Button2 bis Button4 erben nun "alle" Eigenschaften von Button1
CloneObject(Button1, Button2, ['Name', 'Parent', 'Left']);
CloneObject(Button1, Button3, ['Name', 'Parent', 'Left']); CloneObject(Button1, Button4, ['Name', 'Parent', 'Left']); wenn du nun die Buttons alle in einer Liste hast, oder diese über die Form suchst, dann kannst'e diese Funktion auch in einer Schleife aufrufen |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Zitat:
Und danke für den Code, aber das ist ja gerade was ich nicht möchte un btw. viel zu umständlich ^^ |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Einfach mal die Eigenschaften des Buttons in Unit2 ändern und schauen, was in Unit1 passiert. |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Liste der Anhänge anzeigen (Anzahl: 1)
@Uwe:
also die Caption konnte ich ändern, ohne daß sie sich änderte |
Re: Mehrere Steuerelemente mit der gleichen "Identität&
Zitat:
- Unit2 in den Form-Designer - Button1.Caption ändern - Unit1 in den Form-Designer - beide Buttons haben neue Caption Soll ich ein Video machen? :wink: Edit: falls bereits Änderungen in Unit1 gemacht wurden, hilft "geerbte Einstellungen wieder herstellen". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 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-2025 by Thomas Breitkreuz