Autor Beitrag
Jacko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 02.09.05 10:51 
Hallo,
wie kann ich die Eingabe einer Float Zahl überwachen?
Ich habe einen StringGrid und will nun die Eingaben in die Zellen auf zwei Nachkommastellen reduzieren.
z.B. 2,00 ist erlaubt, 2,000 ist unzulässig.

Wie kann ich dies einstellen.

danke im voraus.
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Fr 02.09.05 12:50 
Damit die Nachkommastellen immer erkannt werden, sollten nicht-Zahl, -Lösch, oder -Kommas nicht zugelassen werden. Die eigentliche Prüfmethode arbeitet so, dass erst der neue Inhalt der Zelle zusammengesetzt wird (OnKeyPress wird vor dem eigentlichen Einfügen aufgerufen), dann wird der Nachkommateil seperiert und dessen Länge festgestellt, bei überlänge wird das einzufügende Zeichen gelöscht.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9',#8,#44]) then begin //Prüfen ob unzulässiges Zeichen
    Key:=#0//Zeichen löschen
    Beep; //Warnton
  end else begin
    if Key<>#8 then begin //Wenn nicht gelöscht wird
      zelle:=StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]+Key; //Inhalt der Zelle zwischenspeichern + neues Zeichen dranhängen
      nachkomma:='';
      for i:=Length(zelle) downto 1 do if zelle[i]=#44 then Break else nachkomma:=nachkomma+zelle[i];    //Nachkommateil herausfiltern
      if Length(Nachkomma)>2 then begin //Wenn Nachkommateil zu lang
        Key:=#0;
        Beep;
      end;
    end;
  end;
end;

Der Code muss in die Ereignisbehandlung OnKeyPress von dem Stringgrid (Stringgrid Markieren, im Objektinspektor auf Ereignisse, Doppelklick auf das Editfeld rechts neben OnKeyPress, Code einfügen)
Code ist getestet, bei mir gehts.

Edit: Code-Zeile 3, #46 durch #44 ersetzt.

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.


Zuletzt bearbeitet von jakobwenzel am Fr 02.09.05 16:03, insgesamt 2-mal bearbeitet
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 02.09.05 14:53 
Hallo,
user profile iconjakobwenzel hat folgendes geschrieben:

Code ist getestet, bei mir gehts.
glaub ich Dir nicht :wink:

Du läßt mit #46(Punkt) zu, und prüfst dann später auf #44(Komma).

Besser ist es außerdem mit der Konstante DecimalSeparator zu arbeiten.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
//...
if not (Key in ['0'..'9',#8,DecimalSeparator]) then 
//...
for i:=Length(zelle) downto 1 do if zelle[i]=DecimalSeparator then


Außerdem kann man mit dem Code
- keine Zahlen mit mehr als zwei Stellen vor dem Komma eingeben
- über das Kontextmenü beliebigen Text einfügen
- mehrere Kommas eingeben

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Fr 02.09.05 16:12 
Der Code ist verbessert...
(Die Varablendeklarationen fehlten auch :lol: )
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var
  zelle, nachkomma:String;
  i:Integer;
begin
  if not (Key in ['0'..'9',#8,DecimalSeparator]) then begin //Prüfen ob unzulässiges Zeichen
    Key:=#0//Zeichen löschen
    Beep; //Warnton
  end else begin
    if Key=DecimalSeparator then begin
      if Pos(DecimalSeparator,StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])<>0 then begin
        Beep;
        Key:=#0;
      end else Exit;
    end;
    if Key<>#8 then begin //Wenn nicht gelöscht wird
      if Pos(DecimalSeparator,StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])<>0 then begin
        zelle:=StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]+Key; //Inhalt der Zelle zwischenspeichern + neues Zeichen dranhängen
        nachkomma:='';
        for i:=Length(zelle) downto 1 do if zelle[i]=DecimalSeparator then Break else nachkomma:=nachkomma+zelle[i];    //Nachkommateil herausfiltern
        if Length(Nachkomma)>2 then begin //Wenn Nachkommateil zu lang
          Key:=#0;
          Beep;
        end;
      end;
    end;
  end;
end;

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Jacko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mo 05.09.05 10:02 
Danke an euch, probiere es gleich mal aus.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 05.09.05 10:20 
Die Methode ist (imho) aus folgenden Gründen schlecht:

- Kopieren der Zahl mit Ctrl+C unmöglich
- Paste von Text (<>Zahl) mit Maus (per rechtsklick) bzw. Shift+Insert möglich (!)
- Wenn Zahl schon 2 Nachkommastellen hat, kann man die Zahl nicht markieren und mit Tastendruck überschreiben

Fazit: Du schränkst den Benützer unnötig ein und es ist trotzdem noch möglich Text reinzubekommen.