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 Limitierung auf SmallInt (https://www.delphipraxis.net/139084-tupdown-limitierung-auf-smallint.html)

anse 23. Aug 2009 09:09


TUpDown Limitierung auf SmallInt
 
Ein TUpDown ist mit seinen Werten auf 16 Bit Zahlen, also -32767 bis +32767 limitiert. Aus diesem Grund kommt dessen Verwendung für viele Situationen nicht in Frage, wenn man höhere Werte braucht. Muß ich einen Descendent basteln der Integer Werte akzeptiert oder bin ich auf das TSpinEdit angewiesen?

Bei QualityCentral wurde das als Bug gemeldet aber auch schon wieder geschlossen, ohne dass es eine Lösung gäbe.

Muetze1 23. Aug 2009 09:56

Re: TUpDown Limitierung auf SmallInt
 
Warum nutzt du nicht die Events und zählst selbst?

himitsu 23. Aug 2009 10:06

Re: TUpDown Limitierung auf SmallInt
 
TUpDown nutzt halt noch die alten 16-Bit-Messages, aber es gibt von einigen Anbietern auch komponenten, welche die "neueren" Messages verwendet.


zu Muetze1 (also die Hauptfuntion):
Delphi-Quellcode:
procedure TForm1.UpDown1ChangingEx(Sender: TObject;
  var AllowChange: Boolean; NewValue: Smallint;
  Direction: TUpDownDirection);
begin
  UpDown1.Tag := UpDown1.Tag + NewValue;
  Edit1.Text := IntToStr(UpDown1.Tag);
  AllowChange := False;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  UpDown1.Tag := StrToInt(Edit1.Text);
end;

// Starteinstellungen:
// Edit1.Text = '0'
// ansonsten sind die beiden Komponenten nicht miteinander verbunden

anse 23. Aug 2009 11:05

Re: TUpDown Limitierung auf SmallInt
 
Danke für den Tip. Sind ja nur wenige Code Zeilen von daher ein verschmerzbarer Hack.

Helmi 23. Aug 2009 11:26

Re: TUpDown Limitierung auf SmallInt
 
Hallo,

vielleicht sollte man noch prüfen, ob wirklich Zahlen im Editfeld eingegeben wurden...
(die manuelle Eingabe ist ja trotz UpDown noch möglich)

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var
  i: Integer;

begin
  If TryStrToInt(Edit1.Text, i) then
    UpDown1.Tag := i;
end;

himitsu 23. Aug 2009 12:20

Re: TUpDown Limitierung auf SmallInt
 
wobei ich es dann eher so erweitern würde
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  if (Trim(Edit1.Text) <> '') and (Trim(Edit1.Text) <> '-') then
    UpDown1.Tag := StrToInt(Edit1.Text);
end;
hatte oben absichtlich auf die Try- und Def-Version verzichtet, damit man bei Falscheingabe mit entsprechenden Fehlermeldungen "bombardiert" wird :angel2:

PS: völlig unoptimierte Zugriffe, aber sowas ist hier auch nicht unbedingt nötig ... soooooo schnell tippt ja eh keiner :nerd:

[add]
aber was eventuell nicht schaden könnte, wäre noch die Abfrage der Cursortasten für Hoch und Runter, im Edit, damit auch da die Taastatursteuerung wie "normal" funktioniert.

anse 23. Aug 2009 13:03

Re: TUpDown Limitierung auf SmallInt
 
Ja, die Cursor Tasten würden sogar noch funktionieren, wenn man MeinUpDown.Associate = MeinEdit belässt. Leider gibt es dann aber den Effekt dass das MeinUpDown sein .Value auf MeinEdit überträgt sobald es zum ersten mal gemalt wird. Also lieber das Associate entfernen und die Cursortasten per OnKeyDown behandeln.

himitsu 23. Aug 2009 17:39

Re: TUpDown Limitierung auf SmallInt
 
@Muetze1:
so schlau war ich auch schon
und jetzt rate mal, wofür das AllowChange := False; da drinnen ist :zwinker:

NewValue gibt ja den "neuen" Wert an, also einen Positiven für hoch und einen Negativen für runder, da ist das Direction vollkommen egal, da dieses immer ausgehend von der Ausgangs-0 geschieht :angel2:

Muetze1 23. Aug 2009 17:43

Re: TUpDown Limitierung auf SmallInt
 
Zitat:

Zitat von himitsu
@Muetze1:
so schlau war ich auch schon :angel2:
und jetzt rate mal, wofür das AllowChange := False; da drinnen ist :zwinker:

Ich habe meinen Beitrag direkt nach dem Schreiben einem Moderator gemeldet zum Löschen, da ich dies auch erst nach dem Senden gesehen habe. Und dank deines Beitrages ist dies nun hinfällig, also editier ich ihn selbst...


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