![]() |
TStringlist als Property - Werte nicht in Laufzeit übernomme
Hi,
also ich erstelle gerade ein Komponte und sie bekommt zusätzliche Properys und davon auch 3 Stück mit dem Typ TStringlist. Alles super, doch wenn ich im Objekt-Inspektor die Stringlisten verändere, haben diese, nachdem ich das Projekt kompiliert habe, wieder den Standart-Inhalt. Mit anderen propertys (integer) klappt es super. Wieso klappt es nicht? Und wieso kann Delphi sotwas überhaupt von der Design- zur Laufzeit übernehemen, wo doch alle Objekte beim Ausführen komplett neu created werden. Also woher wissen die Propertys welche Werte im Design vorhanden waren? Gruß Alexander |
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Zitat:
Zitat:
|
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Hi,
ja meine Stringlisten sind auch schreibbar, das werde ich ändern. Danke!!! Und wann werden die Werte aus der DFM in die Objekte geschrieben? Gruß Alexander EDIT: Also das mit dem nur lesbar klappt nicht: Im OI souckt er dann einen Fehler aus. Zitat:
Vielleicht liegt es auch daran dass ich falsch die Listen zuweise: In
Delphi-Quellcode:
Ich habe 2 Möglichkeiten ausprobiert:
procedure TExpandPanels.setExpandList(value:TStringList);
Delphi-Quellcode:
oder
FExpandList.Assign(value);
Delphi-Quellcode:
Welche ist richtig? Und wieso gibt OI in beiden fällen einen Fehler aus?
FExpandList:=value;
|
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Zitat:
|
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Ok.
Und wie ist das mit der Stringlist? Weisst du wieso das einen Fehler gibt? |
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Die Zugriffsverletzung deutet darauf hinn das du die Stringlisten nie erzeugt hast. Ich glaube es ist zeit das du uns etwas Quelltext präsentierst :wink:
|
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Ok:
Alle wäre ein bisschen zuviel, deswegen:
Delphi-Quellcode:
TExpandPanels = class(TWinControl)
private { Private-Deklarationen } PanelArray:TClassArray; // Properties FCountPanels:integer; FColors:TJvRollOutColors; FBehaviour:TExpandPanelsBehaviour; FCaptions, FExpandList, FHeightList:TStringList; procedure setCountPanels(value:Integer); procedure setColors(value:TJvRollOutColors); procedure setBehaviour(value:TExpandPanelsBehaviour); procedure setCaptions(value:TStringList); procedure setExpandList(value:TStringList); procedure setHeightList(value:TStringList); procedure JvRollOutClick(Sender: TObject); procedure ArrangePanels(WhatResize:TWhatResize); procedure HotTrackSetActivePanel(value:integer); procedure AddPanel; procedure CopyColorsTo(AimColors:TJvRollOutColors); procedure JvRollOut1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property CountPanels:integer read FCountPanels write setCountPanels; property Colors:TJvRollOutColors read FColors write setColors; property Behaviour:TExpandPanelsBehaviour read FBehaviour write setBehaviour; property Captions:TStringList read FCaptions; property ExpandList:TStringList read FExpandList; property HeightList:TStringList read FHeightList; constructor create(AOwner: TComponent); override; destructor destroy; override; end;
Delphi-Quellcode:
constructor TExpandPanels.create(AOwner: TComponent);
begin inherited create(AOwner); FCaptions:=TStringList.Create; FExpandList:=TStringList.Create; FHeightList:=TStringList.Create; FColors:=TJvRollOutColors.Create; PanelArray:=TClassArray.create(false); Self.Height:=300; Self.Width:=150; FColors.ButtonColor:=clBlue; FColors.HotTrackText:=clRed; CountPanels:=3; end;
Delphi-Quellcode:
destructor TExpandPanels.destroy;
begin FCaptions.Free; FCaptions:=nil; FExpandList.Free; FExpandList:=nil; FHeightList.Free; FHeightList:=nil; FColors.Free; FColors:=nil; PanelArray.Free; PanelArray:=nil; inherited destroy; end;
Delphi-Quellcode:
So es ist allerdings egal, ob ich in den set... nur
procedure TExpandPanels.setCaptions(value:TStringList);
var i:Integer; begin FCaptions.Assign(value); for I := 0 to PanelArray.Count - 1 do if value.Count>=PanelArray.count then PanelArray[i].Caption:=value[i] else Continue; end; procedure TExpandPanels.setExpandList(value:TStringList); var i:Integer; begin FExpandList.Assign(value); for I := 0 to PanelArray.Count - 1 do if value.Count>=PanelArray.count then PanelArray[i].Collapsed:= pos('0',value[i])>0 else Continue; ArrangePanels(WRRoot); end; procedure TExpandPanels.setHeightList(value:TStringList); var i:Integer; begin FHeightList.Assign(value); for I := 0 to PanelArray.Count - 1 do if value.Count>=PanelArray.count then PanelArray[i].Height:=strtoint(value[i]) else Continue; ArrangePanels(WRRoot); end;
Delphi-Quellcode:
oder den anderen kram noch stehen habe.
FHeightList.Assign(value);
Der Fehler bleibt! |
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Hallo Alexander,
die Stringlisten müssen als Property lesbar und schreibbar sein:
Delphi-Quellcode:
So ungefähr sollte das aussehen.
type
TMyComponent = class (TComponent) private FList : TStrings; procedure SetList (aList: TStrings); public constructor Create (aOwner: TComponent); override; destructor Destroy; override; published property List: TStrings read FList write SetList; end; constructor TMyComponent.Create (aOwner: TComponent); begin inherited; FList := TStringList.Create; end; destructor TMyComponent.Destroy; begin FList.Free; inherited; end; procedure TMyComponent.SetList (aList: TStrings); begin FList.Assign (aList); end; Gruß Hawkeye |
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Da sagt auch jeder was anderes. Das hatte ich ja vorher. Und da war das oben genannte Problem mit dem übernehmen der Daten doch dafür war kein Fehler. Gruß Alexander EDIT: Man sieht dass die Stringlisten leer sind, indem man das Create so gestaltet:
Delphi-Quellcode:
constructor TExpandPanels.create(AOwner: TComponent);
begin inherited create(AOwner); FCaptions:=TStringList.Create; FExpandList:=TStringList.Create; FHeightList:=TStringList.Create; FColors:=TJvRollOutColors.Create; PanelArray:=TClassArray.create(false); Self.Height:=300; Self.Width:=150; FColors.ButtonColor:=clBlue; FColors.HotTrackText:=clRed; showmessage(IntToStr( ExpandList.Count)); showmessage(IntToStr( HeightList.Count)); showmessage(IntToStr( Captions.Count)); CountPanels:=3; // hier werden die Panels erstellt und die Listen mit standartwerten gefüllt end; |
Re: TStringlist als Property - Werte nicht in Laufzeit übern
Hallo Alexander,
der von mir gezeigte Code sollte richtig sein. Schaue dir den Quelltext der VCL-Controls (z.B. TMemo) an, dort wird es ebenso gemacht. Du kannst nicht erwarten, daß im Constructor bereits alle aus den .dfm-Dateien gelesenen Daten vorliegen. Die Auswertung darf frühestens in der (virtuellen) Methode ![]() Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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 by Thomas Breitkreuz