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 TUpDown: Floats (https://www.delphipraxis.net/143779-tupdown-floats.html)

Jazzman_Marburg 23. Nov 2009 13:28


TUpDown: Floats
 
Mahlzeit!

Sorry, aber ich habe da mal 'nen Problem:

Ich habe eine TEdit Eingabefeld mit TUpDwon verheiratet, und der Benutzer soll den Wert um 0.1 erhöhen bzw. verkleinern können (in TEdit selbst nicht eingeben können), aber irgendwie stehe ich auf dem Schlauch:

procedure TForm1.UpDown2Click(Sender: TObject; Button: TUDBtnType);
begin
if Button = btNext then
Edit2.Text := FloatToStr(StrToFloat(Edit2.Text)+0.1);
if Button = btPrev then
Edit2.Text := FloatToStr(StrToFloat(Edit2.Text)-0.1);
end;

Was mache ich denn falsch? Es tut sich garnix!

Vermutlich wäre das Event OnChanging besser -- aber da habe ich doch kein 'Button' als Parameter -- wie werte ich dann aus, ob addiert order subtrahiert werden soll?

Vielen Dank
Jazzman

toms 23. Nov 2009 13:39

Re: TUpDown: Floats
 
Hallo,

Das sollte schon funktionieren, forausgesetzt, im Edit2 steht anfangs ein gültiger Float Wert.

Damit du den Wert nicht umwandeln musst, könntest du es auch etwa so machen:

Delphi-Quellcode:
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
{$J+}const
  Value: Real = 0; // Anfangswert
{$J-}
begin
  case Button of
    btNext: Value := Value + 0.1;
    btPrev: Value := Value - 0.1;
  end;
  Edit2.Text := FloatToStrF(Value, ffNumber, 1, 1);
end;

Jazzman_Marburg 23. Nov 2009 15:41

Re: TUpDown: Floats
 
Hhhmm,
irgendwie war da der Wurm drin -- selbst der Debugger hielt dort nicht, wenn ein Breakpoint im EventHandler zum UpDown2 gesetzt war.
Habe einfach beide Controls gelöscht und dann neu auf die Form gesetzt -- und Dein (weil eleganteres) Coding übernommen.
Funktioniert prima.

Vielen Dank für die schnelle Reaktion.

Gruß
Jazzman

himitsu 23. Nov 2009 18:14

Re: TUpDown: Floats
 
Man müßte nichtmal am Speichermanagement rumspielen :angel:
Delphi-Quellcode:
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
var Value: Real;
begin
  Value := StrToFloatDef(Edit2.Text, 0);
  case Button of
    btNext: Value := Value + 0.1;
    btPrev: Value := Value - 0.1;
  end;
  Edit2.Text := FloatToStrF(Value, ffNumber, 1, 1);
end;
PS:
* krallt sich das bei .Associate eingetragene Edit
* Ereignis kann für beliebig viele UpDown-Buttons genutzt werden, da keine externen Variablen verwendet werden
* der Wertebereich kann begrennzt werden > .Min und .Max des jeweiligen UpDowns ( x / 10 )
Delphi-Quellcode:
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
  Assert(Sender is TUpDown);
  If TUpDown(Sender).Tag = 0 Then Begin
    TUpDown(Sender).Tag := Integer(TUpDown(Sender).Associate);
    TUpDown(Sender).Associate := nil;
    Assert(TObject(TUpDown(Sender).Tag) is TEdit);
  End;
  TEdit(TUpDown(Sender).Tag).Text := FloatToStrF(TUpDown(Sender).Position / 10, ffNumber, 1, 1);
end;
* wenn .Position bei Programmstart <> 0 ist, dann sollte dieses Ereignis in {Form}.Create einmal aufgerufen werden, damit der angezeigte Wert stimmt
z.B.:
Delphi-Quellcode:
UpDown1.OnClick(UpDown1, btNext);

toms 23. Nov 2009 18:50

Re: TUpDown: Floats
 
Warum nicht einfach so?

Delphi-Quellcode:
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
  Assert(Sender is TUpDown);
  with TUpDown(Sender) do
  begin
    Assert(Associate is TEdit);
    TEdit(Associate).Text := FloatToStrF(Position / 10, ffNumber, 1, 1);
  end;
end;

himitsu 23. Nov 2009 19:17

Re: TUpDown: Floats
 
Müßte man mal ausprobieren, aber so könnte es nicht sein, daß TUpDown dann durchdreht.

TUpDown überwacht .OnChange des in Associate eingetragenen Edits
> könnte Probleme geben, wenn man dort was eingibt/reinkopiert

und es könnte sein, daß TUpDown den an .Text übergebenen Wert mit seinem reellen Wert (.Position) überschreibt

:gruebel:

toms 23. Nov 2009 19:33

Re: TUpDown: Floats
 
Zitat:

Zitat von himitsu
> könnte Probleme geben, wenn man dort was eingibt/reinkopiert

Das TEdit ist in diesem Fall ReadOnly
Zitat:

Zitat von Jazzman_Marburg
(in TEdit selbst nicht eingeben können)


himitsu 23. Nov 2009 19:36

Re: TUpDown: Floats
 
Reagiert UpDown nicht auch, wenn man an Edit.Text etwas übergibt?

toms 23. Nov 2009 19:49

Re: TUpDown: Floats
 
Zitat:

Zitat von himitsu
Reagiert UpDown nicht auch, wenn man an Edit.Text etwas übergibt?

Nein.


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