Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 13:03 Uhr.
Seite 2 von 2     12   

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