![]() |
AW: Komponente mit TStrings Property erstellen
|
AW: Komponente mit TStrings Property erstellen
hmm, wenn ich ein override bei AfterConstruction durchfuehre und meinen Code eintrage dann passiert leider garnichts :(
Edit: hmm, ein showmessage zeigt mir dass er AfterConstruction abarbeitet, aber das Array wird nicht gefuellt |
AW: Komponente mit TStrings Property erstellen
Zitat:
Delphi-Quellcode:
kann aus nicht funktionierendem Code auch keinen funktionierenden zaubern ;)
AfterConstruction
Zeig doch mal den Code und mindestens den interface Teil deiner Komponente |
AW: Komponente mit TStrings Property erstellen
Hallo Rufo,
ich stell das Problem mal kurz dar mit Auszug aus meiner Komponente
Code:
Wie vorher schon gesagt reicht das "ReadButtons(VButtonList, AllButtons);" in SetButtonList nicht aus. Das AllButtons Array, welches zur Designzeit gefuellt wird, ist zur Laufzeit wieder leer. Auch wenn ich "ReadButtons(VButtonList, AllButtons);" in AfterConstruction packe bleibt das Array leer.unit MyComponent; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs, ExtCtrls, Math, StrUtils; type TPanelButton = record Left : integer; Top : integer; Width : integer; Height : integer; Caption : String; BorderColor : TColor; FillColor : TColor; FillCheckColor : TColor; UnCheckedFont : TFont; CheckedFont : TFont; Checked : boolean; end; Type TPanelButtons = Array of TPanelButton; ... MyComponent = class(TPaintBox) private VButtonList : TStringList; ... procedure SetButtonList(Value: TStringList); AllButtons : TPanelButtons; published ... property ButtonList : TStringList read VButtonList write SetButtonList; public procedure ReadButtons(List : TStrings; var BTNArr : TPanelButtons); ... implementation ... constructor MyComponent.Create(AOwner: TComponent); begin inherited Create(AOwner); VButtonList := TStringList.create; ... end; procedure MyComponent.SetButtonList(Value: TStringList); begin VButtonList.Assign(Value); ReadButtons(VButtonList, AllButtons); refresh; end; procedure MyComponent.ReadButtons(List : TStrings; var BTNArr : TPanelButtons); var i: Integer; PosKomma : integer; PosStart : integer; begin // Format of Button Strings: Caption,Left,Width,Top,Height SetLength(BTNArr, List.count); for i := 0 to List.Count - 1 do begin // Caption PosStart := 1; PosKomma := Pos(',', List[i]); BTNArr[i].Caption := Copy(List[i],PosStart,PosKomma-PosStart); // Left PosStart := PosKomma+1; PosKomma := PosEx(',', List[i], PosStart); BTNArr[i].Left := StrToInt(Copy(List[i],PosStart,PosKomma-PosStart)); // Top PosStart := PosKomma+1; PosKomma := PosEx(',', List[i], PosStart); BTNArr[i].Width := StrToInt(Copy(List[i],PosStart,PosKomma-PosStart)); // Width PosStart := PosKomma+1; PosKomma := PosEx(',', List[i], PosStart); BTNArr[i].Top := StrToInt(Copy(List[i],PosStart,PosKomma-PosStart)); // Height PosStart := PosKomma+1; PosKomma := Length(List[i])+1; BTNArr[i].Height := StrToInt(Copy(List[i],PosStart,PosKomma-PosStart)); // Other Button Options BTNArr[i].UnCheckedFont := TFont.Create; BTNArr[i].UnCheckedFont.Color := clBlue; BTNArr[i].CheckedFont := TFont.Create; BTNArr[i].CheckedFont.Color := clWhite; BTNArr[i].BorderColor := clBlue; BTNArr[i].FillColor := clWhite; BTNArr[i].FillCheckColor := clBlue; BTNArr[i].Checked := false; end; end; ... procedure MyComponent.paint(); begin ... hier werden die buttons aus dem Array gezeichnet end; Ich vermute, dass es am "Array of record" liegt. Bei anderen Strukturen bleiben die Werte zwischen Designzeit und Laufzeit erhalten. |
AW: Komponente mit TStrings Property erstellen
Aha, zur DesignTime und zur RunTime.
Wo sagst du denn, dass das ButtonArray auch gespeichert werden soll? Oder wie denkst du, dass zur RunTime noch was aus der DesignTime bekannt ist? Nachschauen, ja aber wo denn? Diese Informationen müssen in der .dfm stehen Und idR werden solche Unterkomponenten in variabler Anzahl als Collection gespeichert (die werden dann auch automatisch in der .dfm abgelegt und wieder ausgelesen, wenn published) Schau dir dazu mal ein paar Komponenten an, die solche Unterkomponenten haben (z.B. ![]() |
AW: Komponente mit TStrings Property erstellen
Naja, die Eintraege der TStringList bleiben ja auch zur Runtime erhalten. Und ich habe eine weitere Stringlist die nicht in einem Array gespeichert wird sondern nur in einem Record:
type TPanelGraph = record Left : integer; Top : integer; Width : integer; Height : integer; Gap : integer; BorderColor : TColor; FillColor : TColor; FillCheckColor : TColor; Values : Array of integer; end; Und in diesem Fall sind die Designzeit Eintraege ebenfalls noch zur Runtime vorhanden. |
AW: Komponente mit TStrings Property erstellen
Aaargs, nun reicht es doch die Werte mit der Setter prozedur zur Designzeit zu setzen und die Array werte sind zur Laufzeit noch da. Kann leider nicht sagen warum es jetzt geht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 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