Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TUpDown Komponente zur Laufzeit klonen


trm - Mi 18.04.12 13:44
Titel: TUpDown Komponente zur Laufzeit klonen
Laut einem Tipp auf SwissDelphichenter kann man diverse Controls/Komopnenten zur Laufzeit mittels Memorystream klonen.

http://www.swissdelphicenter.ch/de/showcode.php?id=785

Leider versagt diese Möglichkeit bei einem TUpDown. Es gibt immer einen Speicherfehler beim Lesen des Streams:


Delphi-Quelltext
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:
    if TabSheet_Setup_Dummy.Controls[x] is TUpDown then
    begin
      ms := TMemoryStream.Create;
      try
        Dummy_UpDown := TabSheet_Setup_Dummy.Controls[x] as TUpDown;
        s := TabSheet_Setup_Dummy.Controls[x].Name;
        TabSheet_Setup_Dummy.Controls[x].Name := '';
        try
          ms.WriteComponent(Dummy_UpDown);
          ms.Position := 0;
          p_UpDown := TUpDown.Create(Self);

// Hier tritt der Fehler auf
          ms.ReadComponent(p_UpDown);
// !
          begin
            p_UpDown.Name := 'zufallsname';
            p_UpDown.Parent := Dummy_Sheet;
          end;
        finally
          Dummy_UpDown.Name := s;
//          TabSheet_Setup_Dummy.Controls[x] := Dummy_MaskEdit;
        end;
      finally
        ms.Free;
      end{ finally }
    end;


Mein Code ist ein wenig anders, da ich auf einem TabSheet alle Controls durchgehe und diese auf ein neues Tabsheet kopieren möchte.

Kann mir jemand helfen und sagen, warum das beim UpDown nicht geht ?


bummi - Mi 18.04.12 18:56

mit der Ergänzung vor Deinem Codeauszug

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
 x:Integer;
 ms:TMemoryStream;
 Dummy_UpDown,p_UpDown:TUpDown;
 s:String;

begin
for x := 0 to TabSheet_Setup_Dummy.ControlCount -1 do


läuft es bei mir mit XE ohne Fehler ....


trm - Mi 18.04.12 22:11

In einem neuen Project geht das tatsächlich.

Das Problem habe ich endlich gefunden: Das UpDown ist einem Edit zugeordnet.

Somit wird, wenn ControlCount durchlaufen wird, das Editfeld nicht auf dem neuen Parent nicht existiert und das UpDown zuerst kopiert wird, ein Fehler - zu Recht ausgegeben, da keine Assoziation bestehen kann.

Abhilfe schafft hier die Verknüpfung zu lösen und auf OnChange vom UpDown selbst zu reagieren und den Wert ins Editfeld einzutragen.

Wenn jeman eine Lösung kennt, wie die Assoziation beibehalten werden kann, lasst es mich doch bitte wissen :)