Autor Beitrag
kandesbunzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 1


Delphi 7, XE2
BeitragVerfasst: Do 05.08.21 14:21 
Hallo,

ich möchte in einem SpinEdit1Change-Feld nur Zahlen zulassen.

Dies soll sowohl für Direkteingaben als auch für Copy&Paste-Aktionen gelten.

Da es sich um ein SpinEdit-Feld handelt, kann man, soweit ich weiß, bspw. TMask nicht verwenden.

Danke und vG!


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 07.08.2021 um 09:29
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 05.08.21 17:50 
user profile iconkandesbunzler hat folgendes geschrieben Zum zitierten Posting springen:
ich möchte in einem SpinEdit1Change-Feld nur Zahlen zulassen.

Hallo!

Mein erster Gedanke war: Ein SpinEdit lässt doch ohnehin nur Zahlen zu! Aber auch das Komma-Zeichen (FormatSettings.DecimalSeparator) kann eingefügt werden. (Seltsam, handelt es sich doch um Integer!)

Jedes Zeichen entfernen, das keine Zahl ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.SpinEdit1Change(Sender: TObject);
const
  aCharSet: TSysCharSet = ['0'..'9'];
var
  i, t: Integer;
begin
  for i := Length(SpinEdit1.Text) downto 1 do
  begin
    if not CharInSet(SpinEdit1.Text[i], aCharSet) then
    begin
      t := SpinEdit1.SelStart;
      SpinEdit1.Text := StringReplace(SpinEdit1.Text, SpinEdit1.Text[i], '', []);
      SpinEdit1.SelStart := t;
    end;
  end;
end;


Einfügen per Tastatur behandeln:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.SpinEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (ssShift in Shift) and (Key = VK_INSERT) then  //Strg+C funktioniert bei TSpinEdit offenbar sowieso nicht!
    Key := 0;
end;


Für das Einfügen per PopupMenü funktioniert SpinEdit1Change grundsätzlich, allerdings wird das Caret da jeweils um ein Zeichen nach rechts gesetzt. Kannst das ja noch anpassen!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.08.21 20:28 
Ich halte das schlicht für einen Fehler in TSpinEdit, dass der Dezimalseparator explizit erlaubt ist (siehe IsValidChar).

Ich würde die virtuelle Methode IsValidChar in der VMT der Klasse TSpinEdit umbiegen auf eine eigene Methode, die beim Dezimalseparator dann False statt True zurück liefert und sonst die Standardmethode aufruft. Dann ist das für alle TSpinEdit Komponenten direkt korrigiert.

Alternativ kannst du natürlich auch eine eigene Komponente davon ableiten und die Methode überschreiben.