Delphi-PRAXiS
Seite 2 von 2     12   

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/)
-   -   Delphi Komponente mit TStrings Property erstellen (https://www.delphipraxis.net/76758-komponente-mit-tstrings-property-erstellen.html)

Sir Rufo 19. Jan 2014 08:27

AW: Komponente mit TStrings Property erstellen
 
Delphi-Referenz durchsuchenTObject.AfterConstruction ;)

Gutelo 19. Jan 2014 09:05

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

Sir Rufo 19. Jan 2014 11:11

AW: Komponente mit TStrings Property erstellen
 
Zitat:

Zitat von Gutelo (Beitrag 1244300)
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

Delphi-Quellcode:
AfterConstruction
kann aus nicht funktionierendem Code auch keinen funktionierenden zaubern ;)

Zeig doch mal den Code und mindestens den interface Teil deiner Komponente

Gutelo 19. Jan 2014 16:17

AW: Komponente mit TStrings Property erstellen
 
Hallo Rufo,

ich stell das Problem mal kurz dar mit Auszug aus meiner Komponente

Code:

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;
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.

Ich vermute, dass es am "Array of record" liegt. Bei anderen Strukturen bleiben die Werte zwischen Designzeit und Laufzeit erhalten.

Sir Rufo 19. Jan 2014 16:38

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. Delphi-Referenz durchsuchenTListView.Columns)

Gutelo 19. Jan 2014 17:03

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.

Gutelo 19. Jan 2014 17:09

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 20:04 Uhr.
Seite 2 von 2     12   

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