Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringlist als Property - Werte nicht in Laufzeit übernomme (https://www.delphipraxis.net/97437-tstringlist-als-property-werte-nicht-laufzeit-uebernomme.html)

Alexander Roth 10. Aug 2007 13:03


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

jim_raynor 10. Aug 2007 13:06

Re: TStringlist als Property - Werte nicht in Laufzeit übern
 
Zitat:

Zitat von Alexander Roth
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.

Sind deine TStringList Propertys auch schreibbar (also mit write?). Wenn ja, dann werden diese nicht mit gespeichert. Die StringListen dürfen nur lesbar sein.

Zitat:

Zitat von Alexander Roth
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?

Schau dir mal eine dfm-Datei zum Formular an, dort werden die published-Eigenschaften gespeichert und beim starten des Programms geladen.

Alexander Roth 10. Aug 2007 13:13

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:

---------------------------
Fehler
---------------------------
Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000.
---------------------------
OK Details >>
---------------------------

Vielleicht liegt es auch daran dass ich falsch die Listen zuweise:
In
Delphi-Quellcode:
procedure TExpandPanels.setExpandList(value:TStringList);
Ich habe 2 Möglichkeiten ausprobiert:
Delphi-Quellcode:
  FExpandList.Assign(value);
oder
Delphi-Quellcode:
FExpandList:=value;
Welche ist richtig? Und wieso gibt OI in beiden fällen einen Fehler aus?

jim_raynor 10. Aug 2007 13:20

Re: TStringlist als Property - Werte nicht in Laufzeit übern
 
Zitat:

Zitat von Alexander Roth
Und wann werden die Werte aus der DFM in die Objekte geschrieben?

Die DFM-Dateien werden als Resourcen an die Exe angehangen (in binärer Form). Geladen werden die Einstellungen beim Erstellen des Formulars (vor dem OnCreate).

Alexander Roth 10. Aug 2007 13:47

Re: TStringlist als Property - Werte nicht in Laufzeit übern
 
Ok.

Und wie ist das mit der Stringlist? Weisst du wieso das einen Fehler gibt?

SirThornberry 10. Aug 2007 13:52

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:

Alexander Roth 10. Aug 2007 14:13

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:
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;
So es ist allerdings egal, ob ich in den set... nur
Delphi-Quellcode:
  FHeightList.Assign(value);
oder den anderen kram noch stehen habe.
Der Fehler bleibt!

Hawkeye219 10. Aug 2007 14:42

Re: TStringlist als Property - Werte nicht in Laufzeit übern
 
Hallo Alexander,

die Stringlisten müssen als Property lesbar und schreibbar sein:

Delphi-Quellcode:
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;
So ungefähr sollte das aussehen.

Gruß Hawkeye

Alexander Roth 10. Aug 2007 14:58

Re: TStringlist als Property - Werte nicht in Laufzeit übern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jim_raynor
Zitat:

Zitat von Alexander Roth
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.

Sind deine TStringList Propertys auch schreibbar (also mit write?). Wenn ja, dann werden diese nicht mit gespeichert. Die StringListen dürfen nur lesbar sein.


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;

Hawkeye219 10. Aug 2007 15:41

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 Delphi-Referenz durchsuchenTComponent.Loaded durchgeführt werden. Verschiebe den ShowMessage-Aufruf (und die Zuweisung zu CountPanels) in diese Routine, dann sollte es funktionieren. Beim Überschreiben der Methode darfst du den inherited-Aufruf nicht vergessen.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz