Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mehrere Steuerelemente mit der gleichen "Identität" (https://www.delphipraxis.net/137218-mehrere-steuerelemente-mit-der-gleichen-identitaet.html)

freddiiii 16. Jul 2009 13:01


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 :)

himitsu 16. Jul 2009 13:17

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

Uwe Raabe 16. Jul 2009 13:17

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Zitat:

Zitat von freddiiii
- Diese Buttons sollen sich lediglich davon Unterscheiden, wo sie angezeigt werden, sprich im Parent

Auch nicht in dem, was sie tun, wenn man draufklickt?

freddiiii 16. Jul 2009 13:25

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Zitat:

Zitat von Uwe Raabe
Zitat:

Zitat von freddiiii
- Diese Buttons sollen sich lediglich davon Unterscheiden, wo sie angezeigt werden, sprich im Parent

Auch nicht in dem, was sie tun, wenn man draufklickt?

nein, auch nicht darin ;-)

@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 :/

himitsu 16. Jul 2009 13:28

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
dank RTTI kannst du dr doch etwas zusammenbasteln, welches alles "automaisch" kopiert

freddiiii 16. Jul 2009 13:33

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.

Lannes 16. Jul 2009 13:56

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Hallo,

welchem Element wird den der Button jeweils zugeordnet?

freddiiii 16. Jul 2009 13:57

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
was genau meinste oder worauf willste hinnaus?

himitsu 16. Jul 2009 13:59

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:
procedure SetButtonCaption(s: String);
begin
  Button1.Caption := s;
  Button2.Caption := s;
  Button3.Caption := s;
  ...
end;
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.

freddiiii 16. Jul 2009 14:04

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.

Lannes 16. Jul 2009 14:05

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Hallo,
Zitat:

Zitat von freddiiii
was genau meinste oder worauf willste hinnaus?

wird der Button auf TabSheets, Panels etc. gesetzt ?

mjustin 16. Jul 2009 14:10

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Zitat:

Zitat von freddiiii
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 :)

Wenn man jedem Button die gleiche Action Property (aus einer TActionList) zuweist, ändern sich in allen Buttons alle in der Action definierten Eigenschaften gleichzeitig. Es ist also kein Button als Vater definiert, aber die Action in der Actionlist sorgt dafür, dass alle Buttons immer auf die gleiche Art geändert werden (Caption, Hint, Enabled, ...)

Uwe Raabe 16. Jul 2009 14:11

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.

himitsu 16. Jul 2009 14:44

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Delphi-Quellcode:
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;
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.

freddiiii 16. Jul 2009 15:01

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Zitat:

Zitat von Uwe Raabe
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.

Die Intention versteh ich, klingt auf jedenfall gut. Ich habe aber selbst nochnie mit Frames gearbeitet und gerade nen bischen rumprobiert. Biste sicher, dass das was du da sagst überhaupt geht? fürn kleines beispiel wär ich sehr dankbar =)

himitsu 16. Jul 2009 15:06

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:
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;
und das Ganze nun nur noch für jeden Button aufrufen
Delphi-Quellcode:
CloneObject(Button1, Button2, ['Name', 'Parent', 'Left']);
CloneObject(Button1, Button3, ['Name', 'Parent', 'Left']);
CloneObject(Button1, Button4, ['Name', 'Parent', 'Left']);
Button2 bis Button4 erben nun "alle" Eigenschaften von Button1

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

freddiiii 16. Jul 2009 15:12

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Zitat:

Zitat von himitsu
Eigentlich dachte ich, daß dann jeder Frame für sich alleine steht und nur das Gleiche vorm Erstellen der Instanz auch gleich ist :gruebel:

Deswegen frag ich nochmal nach, weil ich mir das gleiche denk.

Und danke für den Code, aber das ist ja gerade was ich nicht möchte un btw. viel zu umständlich ^^

Uwe Raabe 16. Jul 2009 16:04

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von freddiiii
Biste sicher, dass das was du da sagst überhaupt geht? fürn kleines beispiel wär ich sehr dankbar =)

Aber klar doch! Bitte schön...

Einfach mal die Eigenschaften des Buttons in Unit2 ändern und schauen, was in Unit1 passiert.

himitsu 16. Jul 2009 17:10

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

Uwe Raabe 16. Jul 2009 18:13

Re: Mehrere Steuerelemente mit der gleichen "Identität&
 
Zitat:

Zitat von himitsu
@Uwe:
also die Caption konnte ich ändern, ohne daß sie sich änderte

Solange du die Caption in Unit1 nicht geändert hast, sollten alle Änderungen in Unit2 (also im Frame) sofort in das Form übernommen werden - und zwar in beiden Frame-Instanzen. Funktioniert hier tadellos - zumindest zur Design-Time.

- 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