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 Label OnChange? (https://www.delphipraxis.net/121326-label-onchange.html)

Johnny Bravo 25. Sep 2008 19:35


Label OnChange?
 
Hi,
ich stehe vor einem kleinen Problem.

Ich prüfe folgendermaßen, wieviele Zeichen sich in einem Label befinden:

Delphi-Quellcode:
...

if Wert.GetTextLen = 0 then
    ShowMessage ('Funktioniert');
...
Zur Laufzeit ist das Label leer. Beim anklicken von Images, werden dem Label Werte hinzugefügt:

Delphi-Quellcode:
procedure TForm1.GelbClick(Sender: TObject);
begin
   Wert.Caption := Wert.Caption + ('4');
   Wert.Refresh;
end;

procedure TForm1.GrauClick(Sender: TObject);
begin
   Wert.Caption := Wert.Caption + ('8');
   Wert.Refresh;
end;

usw...
Das Label soll max. 5 Zeichen lang sein, egal welches bild in welcher reihenfolge angeklickt wird.
Am einfachsten wäre das natürlich wenn das Label ein OnChange event hätte - gibts ja nicht. :?
Wie kann ich das am besten lösen?

mfg

Phoenix 25. Sep 2008 19:45

Re: Label OnChange?
 
Durch eine neue Methode, z.B. AddCharToLabel(newChar: Char): boolean;
In dieser Methode machst Du die Prüfung, änderst ggf. wenn noch Platz ist das Label und gibst halt noch zurück obs geklappt hat oder nicht (weil's z.B. schon voll war).

Natürlich musst Du dann halt alle Stellen ändern, die das Label anpacken, aber da gibts ne relativ einfache Möglichkeit alle Stellen zu finden: Benams das Label einfach um, dann meckert der Compiler an jeder Stelle und Du kannst dort die neue Methode aufrufen ;-)

Helmi 25. Sep 2008 19:46

Re: Label OnChange?
 
Hallo,

am besten wäre es du prüfst auf die Länge des Labels
direkt nachdem du Caption des Labels geändert hast.

Bau dir einfach eine Procedure in dem du die Länge
des Labels prüft und diese Procedure rufst du nach
jedem:

Delphi-Quellcode:
Caption := Caption + 'Zahl'
auf.

so in Etwa:
Delphi-Quellcode:
Caption := Caption + 'Zahl'
Laengenpruefung;

toms 25. Sep 2008 19:47

Re: Label OnChange?
 
Hallo

Anstelle eines OnChange Ereignisses könntest du auch eine eigene Procedure schreiben, über welche
dem Label weiteren Text hinzugefügt. Dabei wird zuvor überprüft, ob die max. Länge nicht schon erreicht wurde.

Delphi-Quellcode:
procedure SetLabelText(ALabel: TLabel; const AText: string; MaxLen: Shortint);
begin
 if ALabel.GetTextLen + Length(AText) <= MaxLen then
   ALabel.Caption := ALabel.Caption + AText;
end;

Beispiel Aufruf:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  SetLabelText(Label1,'A', 5);
end;

Johnny Bravo 25. Sep 2008 20:13

Re: Label OnChange?
 
Danke für eure Antworten, die Methode von toms fand ich am einfachsten, und funktioniert auch wunderbar, danke.

Mir fällt gerade noch ein, wenn das Label die max. Länge von 5 erreicht hat, sollen einige Images deaktiviert werden.
Wäre es sinnvoll wenn man zu jeder prozedur dann:


Delphi-Quellcode:
procedure TForm1.GruenClick(Sender: TObject);
begin
  SetLabelText(Wert,'5', 5);

if Wert.GetTextLen = 5 then
   Gelb.Enabled := False; // jedes Image von Hand deaktivieren sinnvoll?
   Blau.Enabled := False;  
   ...

end;
hinzufügt?
Also zu jedem klick eines Images die andern Images deaktiviert? Kann man das eleganter machen?

mfg

grenzgaenger 25. Sep 2008 20:58

Re: Label OnChange?
 
du könntest dir z.b. dein einges label bauen (ableiten von TLabel), in dem du die ganzen sonderbehandlungen integrierst...

jaenicke 25. Sep 2008 21:05

Re: Label OnChange?
 
Zitat:

Zitat von Johnny Bravo
Also zu jedem klick eines Images die andern Images deaktiviert? Kann man das eleganter machen?

Schreib doch das auch in deine SetLabelText Methode hinein ;-).

toms 25. Sep 2008 21:33

Re: Label OnChange?
 
Ich würde aus der Procedur SetLabelText() eine Function machen. Diese gibt zurück, ob Text hinzugefügt wurde oder nicht (d.h Result ist vom Typ Boolean)


Delphi-Quellcode:
if SetLabelText(Wert,'5', 5) then ...


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