AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Komponente mit TStrings Property erstellen

Ein Thema von GuenterS · begonnen am 9. Sep 2006 · letzter Beitrag vom 19. Jan 2014
Antwort Antwort
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#1

AW: Komponente mit TStrings Property erstellen

  Alt 18. Mär 2013, 21:33
Hallo,

hast Du denn einen Setter für FSQL in Deiner Klasse TGSQuery? Schau Dir mal den Quellcode in Post #3 an; da sollte die Lösung stehen.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Komponente mit TStrings Property erstellen

  Alt 18. Mär 2013, 21:49
Hallo Volker,
danke für Deine Antwort!

Ja, habe ich schon.

Allerdings stand ich auch gerade ganz schön auf der Leitung:

Im Konstruktor muss es natürlich heißen:
Code:
constructor TGSQuery.Create(aOwner: TComponent);
  begin
     inherited;
     ...
     combobox := TComboBox.Create(Self);
     ...
     FSQL := combobox.Items;
     // und NICHT:
     //FSQL := TStringList.Create;
  end;
Was will ich denn mit ZWEI Listen????????
Es ist halt doch schon spät...

Viele Grüße,

Poolspieler
Andreas
  Mit Zitat antworten Zitat
Gutelo

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

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 07:37
Noch eine weiterfuehrende Frage,

ich habe auch eine TStrings Liste in den Properties einer eigenen Komponente. Zur Designzeit werden die eingetragenen Werte in der Liste durch eine Setter procedure uebernommen. Nun werden die eigentragenen Werte in der Stringliste dazu verwendet ein Array zu fuellen (wird ebenfalls in der Setter procedure erledigt). Das funktioniert waehrend des Designs prima, allerdings ist das Array zur Laufzeit wieder leer.

Die Komponente ist von TPaintBox abegeleitet. Da das Array vom Typ record ist und einige werte zur Laufzeit geaendert werden kann ich das Erstellen des Arrays nicht einfach in die paint procedure packen, da sonst jedesmal standardwerte im Array stehen.

Gibt es eine procedure die nur einmal nach dem constructor ausgefuehrt wird?

Gutelo


Edit: Habs jetzt so geloest in der paint procedure auch wenns nich ganz optimal ist:

if Length(Arr) = 0 then FillArr(SList, Arr);

Arr ist das Array, SList ist TStrings mit Werten und FillArr eine Prozedur die die Werte aus SList in Arr eintraegt.

Geändert von Gutelo (19. Jan 2014 um 08:08 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
 
#4

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 08: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
 
#5

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 09: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 09: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
 
#6

AW: Komponente mit TStrings Property erstellen

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

AW: Komponente mit TStrings Property erstellen

  Alt 19. Jan 2014, 16: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 16:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:26 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-2025 by Thomas Breitkreuz