Komponente zur Laufzeit kopieren

Rund um die LCL und andere Komponenten
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Komponente zur Laufzeit kopieren

Beitrag von MmVisual »

Hallo,

Ich habe eine TComboBox, gefüllt mit allen möglichen Eigenschaften. Zur Laufzeit benötige ich eine Kopie dieser Komponente mit allen Eigenschaften usw.

Also mit .Create(Self) kann ich eine neue auf machen, aber wie bekommen ich da die vielen Eigenschaften alle einfach rein?

Gibt es sowas wie ".CreateCopy(TComponent)"?

Hintergrund: Ich nutze die TDBGrid und möchte im Grid die gleiche TComboBox zeigen, wie schon an einer anderen Stelle im Programm gezeigt wird. Wenn ich jetzt diese anhänge, dann ist sie im Grind und nicht mehr an dem Platz wo sie war, also brauche ich eine 1:1 Kopie dieser TComboBox. Da ich davon viele habe wollte ich eine einfache Methode nutzen.

Vielen Dank für eure Hilfe.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10890
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente zur Laufzeit kopieren

Beitrag von theo »

Es gibt ein Beispiel zu Komponenten Streaming in
/examples/componentstreaming

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Komponente zur Laufzeit kopieren

Beitrag von MmVisual »

Vielen Dank für den Tipp. Ich hab folgendes Programmiert:

Code: Alles auswählen

grdEditor := Nil; // Dummy-Komponente
      AStream := TMemoryStream.Create;
      try
         WriteComponentAsBinaryToStream(AStream, cboPParDefDatentyp); // Quell Komponente
         AStream.Position := 0;
         ReadComponentFromBinaryStream(AStream, grdEditor, @OnFindClass, grdPParamDefs); // Ziel, neue Komponente
      finally
         AStream.Free;
      end;
      grdEditor.BoundsRect := grdRect; // Zuweisen Position im Grid
Nachteil: Es werden die Events nicht mit kopiert. Also es funktioniert nicht ganz richtig. :(

Gibt es noch eine andere Lösung?

(Assign und AssignTo funtkionieren nicht)
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10890
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente zur Laufzeit kopieren

Beitrag von theo »

MmVisual hat geschrieben: Nachteil: Es werden die Events nicht mit kopiert. Also es funktioniert nicht ganz richtig. :(
Gibt es noch eine andere Lösung?
Naja, die paar Events könntest du auch von Hand einhängen.

Aber wenn du's um's verrecken "akademisch" haben willst, kann man das mit RTTI schon lösen.

Hier gibt's ein zip mit einer RTTIUnit drin und einer Funktion CopyObject damit geht's. (uses typinfo)

http://www.blong.com/Conferences/BorCon ... tToAnother" onclick="window.open(this.href);return false;

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Komponente zur Laufzeit kopieren

Beitrag von MmVisual »

Toller Tipp!
Es Funktioniert aber nur zum Teil. Also das Element ist da und alles drin, aber der ItemIndex ist -1. Liegt wohl daran dass erst die Eigenschaften kopiert werden (dadurch wird ItemIndex dank leerer Item-Liste auf -1 gesetzt) und dann erst die Itemliste.
Ich werde es wohl doch manuell machen müssen...
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10890
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente zur Laufzeit kopieren

Beitrag von theo »

MmVisual hat geschrieben: Ich werde es wohl doch manuell machen müssen...
Kannst ja diese Methode trotzdem benutzen und dann einfach den Itemindex manuell kopieren.

Antworten