Autor Beitrag
joschi
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 23.10.04 12:40 
Hi!

Und zwar möchte ich noch in mein kleinen Rechner einbauen, dass man nur ein Komma eingeben darf, sodass dadurch keine Fehlermeldung mehr entstehen kann.

Ich habe nur leider keine Ahnung wie man das machen kann. Ich dachte zuerst etwa so:

wenn man die Taste #44 (für das Komma) gedrückt hat, dann wird ein Befehl ausgeführt. Und zwar wird dann jede weitere EIngabe durch #0 ersetzt.

Doch irgendwie funzt das nicht richtig, keine Ahnung wieso.

Kann mir jemand helfen? wäre super!
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Sa 23.10.04 12:49 
Ich habe eine Eingabeabsicherung mal nach folgendem Prinzip programmiert:
Wenn sich der Text ändert (edit1.change meinetwegen), dann soll er alle Zeichen durchgehen.
Wenn ein Komma gefunden wird, und das Sicherungsargument=false ist (das kannst du zb. über den Ascii-Code kontrollieren), dann soll er das Zeichen akzeptieren, und das Sicherungsargument, ob ein Komma eingeben wurde, auf true setzen. Danach, wenn er nochmal ein Komma findet, soll er das einfach wegfallen lassen.
Ich gehe zb einfach alle Zeichen durch, und die Zeichen, die akzeptiert werden sollen, speichert er in einen String, der dann den "gefilterten" Text enthält. Uund der wird dann hinterher dem Textfeld zugewiesen.
Ich kann dir auch mal nen Ausschnitt, wenn du das hier nicht verstehst, von meinem Source schicken!
Harry M.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: Mo 25.10.04 22:43 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if key = '.' then key:= ','
end;


versuche das mal.......
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Di 26.10.04 00:59 
Also ich habe mit ihm schon eine Menge geredet....und er wollte einfach nur verhindern, dass nicht mehr als ein Komma eingegeben werden darf, damit es nicht zu einer Fehlermeldung kommt.....
Deine Anweisung machtja nur aus einem Punkt ein Komma, dannkannst du ja immer noch so viele Kommas eingeben wie du willst =)
Harry M.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: Di 26.10.04 12:43 
du wilst also verhindern das nicht mehr als 1 komma eingegeben werden kann. habe ich das jetzt richtig verstanden???

du kannst bei dir die eingaben über die tastatur machen???
hast du dir mal den windows-standart-rechner angesehen??

gib dem benutzer ein tastenfeld (mit buttons) und arbeite mit einem panel nicht mit einer edit-feld

so kannst du fehler bei der eingabe besser abfangen

z.b. so:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Eins: TButton;
    Panel1: TPanel;
    Null: TButton;
    Komma: TButton;
    procedure EinsClick(Sender: TObject);
    procedure NullClick(Sender: TObject);
    procedure KommaClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  KOMMA_ENTHALTEN : boolean = FALSE;

implementation

{$R *.dfm}

procedure TForm1.NullClick(Sender: TObject);
begin
   Panel1.Caption := Panel1.Caption+'0';
end;

procedure TForm1.EinsClick(Sender: TObject);
begin
   Panel1.Caption := Panel1.Caption+'1';
end;

      //    usw     //

procedure TForm1.KommaClick(Sender: TObject);
begin
  if KOMMA_ENTHALTEN = FALSE then begin
    Panel1.Caption := Panel1.Caption+',';
    KOMMA_ENTHALTEN := TRUE;
    exit;
    end;
  if KOMMA_ENTHALTEN = TRUE then Messagebox(0,'Wie werden mehrere Kommas berechnet?????','Problem',16 );
end;

end.



learning by imitating...
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 27.10.04 19:27 
Es sollte aber bei ihm darum gehen, dass man Eingaben nur per Tastatur machen kann.....weil man das ganze auch auf einen Netto Brutto Rechner usw übertragen werden sollte....aber das wäre natürlich auch eine Möglich keit.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 27.10.04 19:37 
das ist so ziemlich das gleiche
ausblenden Quelltext
1:
2:
if key = Komma then Komma:=true;
if komma = true then key:=0;

und wenn das feld wieder leer ist oder ein komma gelöscht wurde,
dann muss komma wieder auf true gesetzt werden :)
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 27.10.04 23:42 
Also ich mache das einfach so....weil ich noch andere Zeichen usw eingeben will:
ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
var text1:string;
    zeichen:char;
    i,ascii:integer;
    komma,e,minus:boolean;
begin

text1:=''//speichert den gefilterten Text
komma:=false;
e:=false;
minus:=false;
for i:= 1 to length(eingabe) do  //jeden Buchstabe durchgehen
    begin

    zeichen:=eingabe[i];         //i. zeichen aus eingabe rausziehen
    ascii:=ord(zeichen);         //ascii zeichen speichern

    if ((ascii=45and (i=1)) then    //minuszeichen und an erster stelle
       begin
       text1:='-';
       minus:=true;
       end;

    if ((ascii=44and (komma=false)) then //komma und noch keins vorher eingegeben
       begin
       text1:=text1+zeichen;
       komma:=true;            //Argument, dass schon ein Komma eingegeben wurde
       end;

    if (((ascii=69or (ascii=101)) and (e=false)and
        (((i>=3and (minus=true))or (i>=2and (minus=false))) then
                                  //E/e und noch keins eingegeben und zahl vor E
       begin
       text1:=text1+zeichen;
       e:=true;                     //Argument, dass E/e eingegeben wurde
       end;

    if((ascii>=48and (ascii<=57)) then   //zahl zwischen 0 und 9
       begin
       text1:=text1+zeichen;
       end;

    end;

eingabe:=text1;

end;

das ist ne Komplette Absicherung für Edit Felder, in denen nur Zahlen eingegeben werden dürfen, weil damit gerechnet werden soll.
Es muss dann nu rnoch auf die Absicherung geachtet werden, was passiert, wenn das Feld leer ist!
jojo-sp
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

Windows XP Prof, Vista Ultimate & Home Premium, Windows 7
Delphi 7 Enterprise, Delphi 2009
BeitragVerfasst: Do 28.10.04 11:37 
Wieso macht ihr euch das denn so schwer? Bei dem onkeypress oder so kann doch wenn zum ersten mal das Komma gedrückt werden ein Prüfer auf true gesetzt werden, wenn dieser false ist, sonst passiert nichts -> exit;
Wenn man über eine Button-Tastatur aus dem Programm heraus eingibt, einfach dieses True/false setzen bei ButtonKomma.click.

_________________
Ist der Ruf erst ruiniert, lebts sich gänzlich ungeniert...
Wilhelm Busch (1832 - 1908)
greg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119

Windows2000, WindowsXP
D5 Prof
BeitragVerfasst: Do 28.10.04 12:02 
Öhm ... wie wäre es denn mit einem MaskEdit und der dazugehörigen Property EditMask?

Gruß
Gregor
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Do 28.10.04 15:48 
alles viel zu kompliziert, du willst doch nur zahleneingaben haben und die backspacetaste soll man auch noch drücken können, dann nimm den hier

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Edit1KeyPress(Sender: TObject;
  var Key: Char);
begin
  if not (key in ['0'..'9',#8]) then
    key:=#0;
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Do 28.10.04 15:57 
also, ich habe dsa als das einfachste gefunden.....
ZB das mit dem Komma auf true setzten, klingt zu Anfang sehr sehr Einfach, nur was machst du, wenn das Komma gelöscht wird?? Wie erkenne ich genau, wann das Komma gelöscht wird??
Position merken, und dann, wenn an der Position die Backspace gedrückt wird, ganz klar, aber was mache ich, wenn vor dem Komma noch eine Zahl zusätzlich eingegeben wird??
Das waren die Fragen, die sehr viel Code und Aufwand brauchen, finde ich, und deshalb habe ich mich für diese Eingabeabsicherung durchgerungen.
Und ich wollte die Eingabe nicht durch Buttons machen, weil sie das Programmfenster zu groß machen, für ein kleines Programmm, dass wir über die Tastatur bedienen bzw über die Tastatur die Eingaben machen sollen.
Das war dann ein Gedankengang, der mich zu dem Code da oben geführt hat!
Zitat:

alles viel zu kompliziert, du willst doch nur zahleneingaben haben
und die backspacetaste soll man auch noch drücken können,
dann nimm den hier

ich möchte aber auch noch Komma, das E und sowas alles eingeben, und dann dabei beachten, dass nicht mehr als ein Komma eingegeben werden darf, da es sonst auch wieder zu einer Fehlermeldung kommt, und ich bin dafür, dass man gar nicht erst Falsche eingaben machen sollte, und erst nachher auf die Falsche eingabe aufmerksam geamcht werden sollte.
grayfox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 800

win98, winXP
D4 Standard; D6 Personal
BeitragVerfasst: Do 28.10.04 16:33 
ausblenden Delphi-Quelltext
1:
2:
if key = Komma then Komma:=true;  
if komma = true then key:=0;


wieso denn so kompliziert?
so gehts doch um einiges einfacher:
ausblenden Delphi-Quelltext
1:
2:
   if key = #44 then  
     key:= #0;


mfg, stefan
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Do 28.10.04 16:39 
Das schon, nur was mache ich, wenn danach das Komma gelöscht wird?? dann muss ich ja komma wieder auf false setzen. Und dann muss ich dafür, damit das Funktioniert wieder eine Prozedur schreiben, die erkennt, wann ein Komma gelöscht wurde.
Verstehst du, was ich meine? (nich böse gemeint die Frage)
grayfox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 800

win98, winXP
D4 Standard; D6 Personal
BeitragVerfasst: Do 28.10.04 17:28 
hallo kroni!

ich habe zwar eure ganze diskussion nur teilweise mitverfolgt und bin daher bestimmt nicht am laufenden - melde mich aber trotzdem zu wort ;)

du könntest das ganze auch so lösen: in der procedure, in welcher die die eingaben prüfst (keypress, onkeydown, usw...)
bekommst du ja mit, ob ein komma eingegeben wurde. wenn dem so ist, dann überprüfst du, ob sich in deinem eingabestring bereits ein komma befindet. ist eins vorhanden, dann löscht du die eingabe. somit ergeben sich auch keine probleme wenn das komma wieder wegeditiert wurde.
alles klar? falls nicht, dann frag nochmal :)

mfg, stefan

ps:
Zitat:
(nich böse gemeint die Frage)

ich dachte immer, dass es keine bösen, sondern nur dumme fragen gäbe? :mrgreen:
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 28.10.04 17:38 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  with Sender as TEdit do begin
    if not (Key in ['0'..'9', chr(vk_Back), chr(vk_Delete)]) then begin
      if  ((Key = DecimalSeparator)
      and (Pos(DecimalSeparator, Text) > 0))
      or  (Key <> DecimalSeparator) then
        Key := #0;
    end;
  end;
end;
Dann kann man aber immer noch kopieren und einfügen, deshalb würde ich mit einer Funktion überprüfen, ob die Eingage ein gülter Float ist und je nach dem die Rechen-Buttons ein-/ oder auschalten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function IsFloat(const S: String): Boolean;
var
  I: Integer;
  Sep: Boolean;
begin
  Sep := False;
  Result := False;
  if Length(S) = 0 then
    Exit;
  for I := 1 to Length(S) do begin
    if not (S[I] in ['0'..'9']) then begin
      if  (S[I] = DecimalSeparator)
      and (Sep = False) then
        Sep := True
      else
        Exit;
    end;
  end;
  Result := True;
end;
Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Do 28.10.04 17:47 
Zitat:
du könntest das ganze auch so lösen: in der procedure, in welcher die die eingaben prüfst (keypress, onkeydown, usw...)

bekommst du ja mit, ob ein komma eingegeben wurde. wenn dem so ist, dann überprüfst du, ob sich in deinem eingabestring bereits ein komma befindet.[/quote]
das mache ich ja im Prinzip schon....also mit meiner Prozedur, allerdings mache ich das bei jeder neuen eingabe, so dass ich dannauch sofort die Zahlen usw, also alles Kontrolliere!
also so schlecht finde ich das nicht(liegt vlt. daran, dass es ovn mir kommt