AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente mit TStrings Property erstellen

Ein Thema von GuenterS · begonnen am 9. Sep 2006 · letzter Beitrag vom 19. Jan 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 09:27
Delphi-Referenz durchsuchenTObject.AfterConstruction
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#12

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 10:05
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

Geändert von Gutelo (19. Jan 2014 um 10:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 12:11
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
AfterConstruction kann aus nicht funktionierendem Code auch keinen funktionierenden zaubern

Zeig doch mal den Code und mindestens den interface Teil deiner Komponente
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#14

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 17:17
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.

Geändert von Gutelo (19. Jan 2014 um 17:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 17:38
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (19. Jan 2014 um 17:42 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#16

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 18:03
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.
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#17

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 18:09
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 Uhr.
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