AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Komponente und Strings (Leerzeichen wird nicht erkannt)
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente und Strings (Leerzeichen wird nicht erkannt)

Ein Thema von LuckySpacy · begonnen am 27. Sep 2004 · letzter Beitrag vom 27. Sep 2004
Antwort Antwort
LuckySpacy

Registriert seit: 2. Apr 2003
Ort: Fränkisch-Crumbach
50 Beiträge
 
Delphi 10.4 Sydney
 
#1

Komponente und Strings (Leerzeichen wird nicht erkannt)

  Alt 27. Sep 2004, 11:43
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;
Thomas Bachmann
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)

  Alt 27. Sep 2004, 14:55
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;
Andreas
  Mit Zitat antworten Zitat
LuckySpacy

Registriert seit: 2. Apr 2003
Ort: Fränkisch-Crumbach
50 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)

  Alt 27. Sep 2004, 15:36
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 ""?
Thomas Bachmann
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)

  Alt 27. Sep 2004, 15:51
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.
Andreas
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#5

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)

  Alt 27. Sep 2004, 17:27
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
  Mit Zitat antworten Zitat
LuckySpacy

Registriert seit: 2. Apr 2003
Ort: Fränkisch-Crumbach
50 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Komponente und Strings (Leerzeichen wird nicht erkannt)

  Alt 27. Sep 2004, 17:36
Hallo teebee,
vielen Dank.

Es funktioniert.
Thomas Bachmann
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:34 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