Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Published TStringList-Property lädt Daten zur Designtime nicht (https://www.delphipraxis.net/196844-published-tstringlist-property-laedt-daten-zur-designtime-nicht.html)

freejay 25. Jun 2018 08:59

Published TStringList-Property lädt Daten zur Designtime nicht
 
Hallo zusammen,

ich habe schon lange eine um viele Funktionen erweiterte von TAdvStringGrid abgeleitete Komponente.

Nun habe ich eine TStringList-Property hinzugefügt, mit der man zur Entwurfszeit bereits Daten in das Grid füllen können soll.

Das funktioniert auch eigentlich, aber wenn ich das Projekt neu öffne werden die Daten, die korrekt in der dfm-Datei gespeichert werden, nicht wieder in das Grid übertragen.

Hier die nötige Codeabschnitte:

Delphi-Quellcode:
type
  TMyAdvStringGrid = class(TAdvStringGrid)
  private
    FDefaultData: TStringList;
    procedure SetDefaultData(const Value: TStringList);
  published
    property DefaultData: TStringList read FDefaultData write SetDefaultData;
  end;

procedure TMyAdvStringGrid.SetDefaultData(const Value: TStringList);
begin
  FDefaultData.Assign(Value);

  if FDefaultData.Text <> '' then
    StringToGrid(FDefaultData.Text); // füllt die Daten in das Grid
end;
(Natürlich wird FDefaultData auch im Constructor erzeugt und später wieder freigegeben)

Die Daten werden beim Öffnen des Projekts zwar korrekt von der dfm-Datei in FDefaultData eingelesen, es wird dabei aber offenbar nicht der entsprechende Setter (SetDefaultData) benutzt...

Kann mir hier jemand weiterhelfen?

Vielen Dank im Voraus!

Bjoerk 25. Jun 2018 09:14

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Probierst mal so?

Delphi-Quellcode:
  protected
    procedure Loaded; override;

..

procedure TMyAdvStringGrid.SetDefaultData(const Value: TStringList);
begin
  FDefaultData.Assign(Value);
  Loaded;
end;

procedure TMyAdvStringGrid.Loaded;
begin
  inherited;
  if FDefaultData.Text <> '' then StringToGrid(FDefaultData.Text);
end;

Uwe Raabe 25. Jun 2018 09:22

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Zitat:

Zitat von freejay (Beitrag 1405709)
es wird dabei aber offenbar nicht der entsprechende Setter (SetDefaultData) benutzt

Offenbar? Was sagt denn der Debugger?

freejay 25. Jun 2018 09:27

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Ich habe ehrlich gesagt keine Ahnung, wie man eine installierte Komponente debugt...

Aber Björks Antwort hat mir bereits sehr geholfen: Vielen Dank!

Die Prozedur Loaded kannte ich echt noch nicht - und das nach fast zwanzig Jahren Delphientwicklung...

Allerdings werde ich Loaded nicht explizit so aufrufen: Durch das inherited würden da viel zu viel anderer Code mit ausgeführt.

hoika 25. Jun 2018 09:35

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Hallo,
Zitat:

Ich habe ehrlich gesagt keine Ahnung, wie man eine installierte Komponente debugt...
Indem Du die zur Laufzeit erzeugst.
Ob dann aber das Loaded klappt, müsstest Du ausprobieren.

Uwe Raabe 25. Jun 2018 09:45

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Zitat:

Zitat von freejay (Beitrag 1405712)
Ich habe ehrlich gesagt keine Ahnung, wie man eine installierte Komponente debugt

Wie jeden anderen Code auch. Ob die Komponente nun installiert ist oder nicht, zur Laufzeit wird der entsprechende Code ja immer aufgerufen. Setzt einfach einen Breakpoint in den Setter und du siehst schon ob der aufgerufen wird oder nicht.

Mit dem Loaded bin ich deiner Meinung: Das sollte auf keinen Fall im Setter aufgerufen werden.

freejay 25. Jun 2018 09:54

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1405717)

Wie jeden anderen Code auch. Ob die Komponente nun installiert ist oder nicht, zur Laufzeit wird der entsprechende Code ja immer aufgerufen. Setzt einfach einen Breakpoint in den Setter und du siehst schon ob der aufgerufen wird oder nicht.

Äh, das glaube ich nicht: Der Komponentencode wird doch schon beim Laden des Projekts ausgeführt. Da kann ich Breakpoints setzen bis ich umfalle... :-D

himitsu 25. Jun 2018 10:32

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Zitat:

Ich habe ehrlich gesagt keine Ahnung, wie man eine installierte Komponente debugt...
Wie jedes andere Programm auch.
> Du startest ein zweites Delphi, welches du debuggst, inkl. deiner Komponente. :zwinker:


Tipp: Bei deiner BPL > Menü > Start > Parameter
* Host-Anwendung: C:\...\bin\bds.exe
* Parameter: -np -pDelphi

Uwe Raabe 25. Jun 2018 10:46

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Zitat:

Zitat von freejay (Beitrag 1405719)
Der Komponentencode wird doch schon beim Laden des Projekts ausgeführt. Da kann ich Breakpoints setzen bis ich umfalle... :-D

Das gilt für die Design-Time, aber zur Laufzeit wird der Code eben auch ausgeführt. Du musst das Programm halt einmal im Debugger starten.

freejay 25. Jun 2018 12:13

AW: Published TStringList-Property lädt Daten zur Designtime nicht
 
Zitat:

Zitat von himitsu (Beitrag 1405723)
Zitat:

Ich habe ehrlich gesagt keine Ahnung, wie man eine installierte Komponente debugt...
Wie jedes andere Programm auch.
> Du startest ein zweites Delphi, welches du debuggst, inkl. deiner Komponente. :zwinker:


Tipp: Bei deiner BPL > Menü > Start > Parameter
* Host-Anwendung: C:\...\bin\bds.exe
* Parameter: -np -pDelphi

Danke für den Tip: Werde ich mir beim nächsten derartigen Problem mal näher ansehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 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