![]() |
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; |
Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
Zitat:
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; |
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:
Wenn ich das Programm starte, dann werde ich hier gestoppt.
procedure TTestKompo1.SetLabelCaption(const Value: TCaption);
begin FLabel.Caption := Value; end; 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 ""? |
Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
Zitat:
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. |
Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
Mit einer zusätzlichen Zeile im Konstruktor geht es aber:
Delphi-Quellcode:
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.
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; Gruß, teebee |
Re: Komponente und Strings (Leerzeichen wird nicht erkannt)
Hallo teebee,
vielen Dank. Es funktioniert. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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