Delphi-PRAXiS

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 und Strings (Leerzeichen wird nicht erkannt) (https://www.delphipraxis.net/30619-komponente-und-strings-leerzeichen-wird-nicht-erkannt.html)

LuckySpacy 27. Sep 2004 10:43


Komponente und Strings (Leerzeichen wird nicht erkannt)
 
Hallo,

ich habe ein Problem in einer Komponenten bei vorbelegtem String (published), den ich im Objektinspektor leeren möchte.

Ein kleines Beispiel:

Ich erzeuge eine neue Komponente (TestKompo1) vom Typ TWinControl.
Auf diese Komponente setze ich ein Label.
Dieses Label wird mit 'Hallo Welt' vorbelegt.

Ich setze diese Komponente (TestKompo1) auf eine Form.
Die Komponente zeigt, wie zu erwarten war, 'Hallo Welt' an.
Beim Starten der Form wird ebenfalls 'Hallo Welt' angezeigt.

Wenn ich im Objektinspektor die Caption des Labels in 'Hurra' verändere,
dann wird auch während der Entwicklung die Caption von 'Hallo Welt' in 'Hurra' verändert.
Nach dem Starten der Form steht jetzt 'Hurra'.

Wenn ich im Objektinspektor die Caption des Labels in '' verändere,
dann wird auch während der Entwicklung die Caption von (jetzt) 'Hurra' in '' verändert.
Nach dem Starten der Form wird aber 'Hallo Welt' angezeigt.

Wenn ich also im Objektinspektor eines vorbelegten Strings in '' verändere,
so wird dies ignoriert und die Vorbelegung übernommen.

Frage:
Wie bekomme ich es hin, dass '' übernommen wird?

Als Beispiel möchte ich noch meinen Quellcode zeigen:


Delphi-Quellcode:
unit TestKompo1;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls;

type
  TTestKompo1 = class(TWinControl)
  private
    FLabel: TLabel;
    FLabelCaption: TCaption;
    procedure SetLabelCaption(const Value: TCaption);
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property LabelCaption: TCaption read FLabelCaption write SetLabelCaption;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TTestKompo1]);
end;

{ TTestKompo1 }

constructor TTestKompo1.Create(AOwner: TComponent);
begin
  inherited;
  FLabel        := TLabel.Create(Self);
  FLabel.Parent := Self;
  FLabel.Top    := 0;
  FLabel.Left   := 0;
  FLabelCaption := 'Hallo Welt';
  FLabel.Caption := FLabelCaption;
end;

destructor TTestKompo1.Destroy;
begin
  FreeAndNil(FLabel);
  inherited;
end;

procedure TTestKompo1.SetLabelCaption(const Value: TCaption);
begin
  FLabelCaption := Value;
  FLabel.Caption := Value;
end;

shmia 27. Sep 2004 13:55

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
 
Zitat:

Zitat von LuckySpacy
Wenn ich im Objektinspektor die Caption des Labels in 'Hurra' verändere,
dann wird auch während der Entwicklung die Caption von 'Hallo Welt' in 'Hurra' verändert.
Nach dem Starten der Form steht jetzt 'Hurra'.

Wenn ich im Objektinspektor die Caption des Labels in '' verändere,
dann wird auch während der Entwicklung die Caption von (jetzt) 'Hurra' in '' verändert.
Nach dem Starten der Form wird aber 'Hallo Welt' angezeigt.

Du darfst das Property LabelCaption nicht an 2 Stellen (im LabelObjekt und in Objektvariablen FLabelCaption) speichern !
Dazu folgende Änderungen am Sourcecode:
Delphi-Quellcode:
type
  TTestKompo1 = class(TWinControl)
  private
    FLabel: TLabel;
    FLabelCaption: TCaption;  // Zeile löschen !
    procedure SetLabelCaption(const Value: TCaption);
    function GetLabelCaption:TCaption;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    // jetzt gibt es Get- & Set-Methode
    property LabelCaption: TCaption read GetLabelCaption write SetLabelCaption;
  end;

implementation

constructor TTestKompo1.Create(AOwner: TComponent);
begin
  inherited;
  FLabel        := TLabel.Create(Self);
  FLabel.Parent := Self;
  FLabel.Top    := 0;
  FLabel.Left   := 0;
  LabelCaption := 'Hallo Welt';  // <----- 
end;

destructor TTestKompo1.Destroy;
begin
  FreeAndNil(FLabel);
  inherited;
end;

procedure TTestKompo1.SetLabelCaption(const Value: TCaption);
begin
  FLabel.Caption := Value;
end;

function TTestKompo1.GetLabelCaption: TCaption;
begin
  Result := FLabel.Caption;
end;

LuckySpacy 27. Sep 2004 14:36

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
 
Hallo shmia,
vielen Dank für die Antwort.

Ich habe das so eingebaut, aber leider funktioniert es nicht.

Also, ich setze LabelCaption im Objektinspektor auf "".
Dann setze ich meinen Breakpoint auf:

Delphi-Quellcode:
procedure TTestKompo1.SetLabelCaption(const Value: TCaption);
begin
  FLabel.Caption := Value;
end;
Wenn ich das Programm starte, dann werde ich hier gestoppt.
Der Wert der in FLabel.Caption von Value zugewiesen wird ist 'Hallo Welt'.
(In Value steht 'Hallo Welt')

Wenn ich aber das LabelCaption im Objektinspektor auf " " (Leertaste) setze,
dann werde ich in SetLabelCaption zweimal gestoppt.
Beim ersten mal mit dem Value-Wert 'Hallo Welt' und beim zweiten mal
mit dem Value-Wert " ".

Wieso funktioniert es nicht mit ""?

shmia 27. Sep 2004 14:51

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
 
Zitat:

Zitat von LuckySpacy
Wenn ich aber das LabelCaption im Objektinspektor auf " " (Leertaste) setze,
dann werde ich in SetLabelCaption zweimal gestoppt.
Beim ersten mal mit dem Value-Wert 'Hallo Welt' und beim zweiten mal
mit dem Value-Wert " ".
Wieso funktioniert es nicht mit ""?

Weil in Delphi String-Properties im Abschnitt published nur dann in der DFM-Datei gespeichert werden, wenn der Inhalt ungleich "" ist.
Bei Ordinal- und Mengen-Properties kann man ja mit der Default Direktive steuern, welcher Wert als Defaultwert angesehen wird
und deshalb nicht gespeichert wird.

Deshalb sollte man String-Properties überhaupt keinen Defaultwert geben. Strings werden ja in Delphi
automatisch mit "" initialisiert; man braucht im Konstruktor Strings also nicht löschen.

teebee 27. Sep 2004 16:27

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
 
Mit einer zusätzlichen Zeile im Konstruktor geht es aber:
Delphi-Quellcode:
constructor TTestKompo1.Create(AOwner: TComponent);
begin
  inherited;
  FLabel        := TLabel.Create(Self);
  FLabel.Parent := Self;
  FLabel.Top    := 0;
  FLabel.Left   := 0;
  If (AOwner<>nil) And (csDesigning In ComponentState) And Not (csReading In AOwner.ComponentState) then
   LabelCaption := 'Hallo Welt';
end;
Dadurch wird das Label immer nur dann mit dem Default-Wert belegt, wenn es in der IDE erzeugt wird, ansonsten entweder mit einem Leerstring oder was in der DFM steht.

Gruß, teebee

LuckySpacy 27. Sep 2004 16:36

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
 
Hallo teebee,
vielen Dank.

Es funktioniert. :thumb:


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