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 Überprüfen, ob Variable einem gewissen Typ entspricht (https://www.delphipraxis.net/92520-ueberpruefen-ob-variable-einem-gewissen-typ-entspricht.html)

MarquiseDeSade 21. Mai 2007 17:00


Überprüfen, ob Variable einem gewissen Typ entspricht
 
:-D Hallo

Ich habe folgendes Problem:

Ich programmiere einen Taschenrechner. Wie kann ich es unterbinden, dass der Benutzer mehrmals die Kommataste drücken darf. Ich dachte da an eine Art überprüfung:

Delphi-Quellcode:
If edit1.text = real then....
Aber wahrscheinlich geht das so nicht. Auf den Punkt gebracht, möchte ich die Eingabe in Edit1 auf ein Komma überprüfen, und nur wenn keines vorhanden ist, darf der User die Kommataste drücken.

Hat jemand einen Denkanstoß ?

Danke :stupid:

Apollonius 21. Mai 2007 17:03

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Es gibt mehrere Möglichkeiten: Ich denke da an val(hat einen Fehlerparameter) und TryStrToFloat, außerdem natürlich die unsaubere Variante mit try..except.
Hoffe geholfen zu haben
Apollonius

MarquiseDeSade 21. Mai 2007 17:26

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
:shock:

Da ich Delphi-Anfänger bin, glaube ich, dass ich noch nicht weiter bin. Ich habe mir
Delphi-Quellcode:
TryStrToFloat
und
Delphi-Quellcode:
val
mal in der Hilfe angesehen, aber geht es dabei nicht eher darum, Eingabefehler des Users so umzuändern, dass ich brauchbar damit rechnen kann ?

Ich suche aber eine Möglichkeit, die es gänzlich dem User untersagt, eine falsche Eingabe zu tätigen. Vielleicht wäre auch einfach ein simples Beispiel für mich möglich ??

danke :mrgreen:

Apollonius 21. Mai 2007 17:32

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Du versuchst einfach, die Benutzereingabe mit TryStrToFloat in einen Float umzuwandeln. Wenn die Funktion false zurückgibt, weißt du, dass die Benutzereingabe ungültig ist. Dann kannst du z.B. eine Messagebox zeigen lassen.

Wenn du ständig überprüfen willst, dann solltest du obige Testroutine in das onChange deines Edits schreiben.

Neutral General 21. Mai 2007 17:32

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Hi,

Wie wärs damit?

Delphi-Quellcode:
if pos(',',Edit1.Text) = 0 then
  ManDarfKommaSetzen;
Das find ich einfacher als TryStrToFloat oder so.

Gruß
Neutral General

dominikkv 21. Mai 2007 17:33

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
du könntest bei jedem onKeyPress des Edits schauen ob schon ein ',' vorhanden ist (zB mit Pos), wenn ja einfach key := #0 setzen

SirThornberry 21. Mai 2007 17:36

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Zitat:

Zitat von dominikkv
du könntest bei jedem onKeyPress des Edits schauen ob schon ein ',' vorhanden ist (zB mit Pos), wenn ja einfach key := #0 setzen

nicht so toll! Angenommen im Edit steht "3," dann kann ich den Teil nach dem komma schon nicht mehr eingeben :wink:

Apollonius 21. Mai 2007 17:38

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
*grummel*
Aber damit ignoriert man die Einstellung für den DecimalSeparator, und außerdem kann man mit TryStrToFloat auch gleich in einem Aufwasch die Überprüfung machen, dass nur Zahlen vorkommen.
Wie arbeitet denn der Taschenrechner? Schreibt man alles in eine Zeile (3+5*6) oder gibt man erst eine Zahl ein, bei Eingabe eine Rechenzeichens wird das Edit gelöscht, nächste Zahl...
Bei ersterer Methode ist TryStrToFloat nämlich hinfällig, die Überprüfung auf mehrere Kommata aber auch :lol:

dominikkv 21. Mai 2007 17:40

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Zitat:

Zitat von SirThornberry
Zitat:

Zitat von dominikkv
du könntest bei jedem onKeyPress des Edits schauen ob schon ein ',' vorhanden ist (zB mit Pos), wenn ja einfach key := #0 setzen

nicht so toll! Angenommen im Edit steht "3," dann kann ich den Teil nach dem komma schon nicht mehr eingeben :wink:

stimmt auch wieder xD
allerdings geht ja noch
Delphi-Quellcode:
if (key = ',') and (Pos(',', Edit1.Text) <> 0) then
  key := #0;

SirThornberry 21. Mai 2007 17:44

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
das geht. Allerdings sollte man beachten das man auch per "Strg + V" und per Kontextmenü dinge aus der zwischenablage einfügen kann und das sollte man dann im OnChange korrigieren.

MarquiseDeSade 21. Mai 2007 17:49

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Danke für eure zahlreichen Antworten. Ich werde gleich mal ein bissl rumprobieren. Die Eingabe ist zu 100 % über Buttons geregelt. Der Taschenrechner hat das selbe Layout, wie der Standartrechner von Windows...

Kannst du mal die Anwendung von
Delphi-Quellcode:
TryStrToFloat
an einem Beispiel zeigen ?

Khabarakh 21. Mai 2007 17:50

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Zitat:

Zitat von Apollonius
Du versuchst einfach, die Benutzereingabe mit TryStrToFloat in einen Float umzuwandeln.

Wie stellst du dir die praktische Umsetzung vor? Das Programm kann dem User wohl schlecht auf die Fingerchen hauen, sobald dieser "3," eingibt.
Bei Fließkommazahlen ist eine sofortige Validierung und entsprechende Fehlermeldung/Anpassung einfach unmöglich, weshalb ich sie vollständig auf den Zeitpunkt nach der Eingabe (Fokusverlust, Button-Klick, ...) verlagern würde (dann würde ich wirklich TryStrToFloat empfehlen ;) ).

Apollonius 21. Mai 2007 17:52

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Hm. Hast recht. Aber wenn die Überprüfung wirklich erst im onExit oder ButtonClick ist, dann geht es (wie du gesagt hast).

MarquiseDeSade 21. Mai 2007 18:07

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Dachte nicht, dass dieses Thema so unterschiedliche Umsetzungsvarianten zur Verfügung stellt :lol:

Da ich aber erst ca. 3 wochen Delphierfahrung habe, würde ich mich über ein konkretes Beispiel mit der
Delphi-Quellcode:
TryStrToFloat-Anweisung
freuen....

Apollonius 21. Mai 2007 18:12

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Delphi-Quellcode:
procedure TForm1.EingabePruefen;
var h:float;
begin
if not TryStrToFloat(edit1.text,h) then
 begin
  showmessage('Sie Schuft! Geben Sie gefälligst eine gültige Fließkommazahl ein!');
  edit1.text:='';
 end;
end;
Der Text der MessageBox ist natürlich nach Belieben :-D

MarquiseDeSade 21. Mai 2007 18:30

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
So sieht es bei mir im Code aus:

Delphi-Quellcode:
procedure TForm1.Button15Click(Sender: TObject);
var
  h:double;

begin
  if TryStrToFloat(edit1.Text,h) then
  edit1.Text:=edit1.text+','
    else
      begin
        showmessage('Sie haben schon ein Kommata');
        edit1.Text:=' ';
      end;

end;
Nun zu meinem Problem. Es arbeitet alles einwandfrei, aber erst ab dem 3. Kommata :|

Beispiel:
Der User kann eingeben... 2,2,3, erst beim rotem Kommata erscheint die Fehlermeldung. Die Fehlermeldung soll aber schon beim 2. Komma erscheinen :angel2:

Apollonius 21. Mai 2007 18:35

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Bei welcher Gelegenheit wird dieser Button denn geklickt? Um ein Komma zu setzen? Das funktioniert nicht, du darfst erst ganz am Ende, wenn die Zahl komplett sein soll, prüfen.

MarquiseDeSade 21. Mai 2007 18:54

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mh, ich glaube, ich muss ein bissl besser erklären...

Also, der Rechner besteht aus einem edit1, welches readOnly=true gesetzt ist. Die Eingabe der Zahlen erfolgt über 9 Buttons. Weitere 4 Buttons für die Rechenarten und 1 Button für das Kommata. Nun soll der Benutzer über die Buttons seine Zahlen eingeben. Wenn er dann z.B. die Zahl 1,2,3 eingibt(indem er auf den Kommata-Button drückt), soll schon beim 2. Kommata die Meldung erscheinen, das dies nicht möglich ist.

Wie kann ich das realisieren ?

Im Anhang ist ein ScreenShot vom Rechner...

Ah, und warum lässt sich die Farbe der Zahlen auf den Butten eigentlich nicht verändern ?

Apollonius 21. Mai 2007 19:19

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Wenn du das so machen willst, ist es mit trystrtofloat nicht möglich, du solltest pos verwenden, um zu prüfen, ob schon ein Komma da ist. TryStrToFloat geht nur dann, wenn die Zahl schon vollständig vorliegt.

Die Einzahl von Kommata lautet übrigens Komma :???:

willnix 21. Mai 2007 19:48

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Wenn du das rein mit Buttons machst kannst du natürlich auch einfach eine Zählvariable mit dem Komma Button koppeln.
Also wenn der Button geklickt wird erhöhst du die variable um 1 und prüfst bei jedem klick auf den button auch ob die variable schon erhöht wurde oder nicht.
Nur wenn nicht wird ein Komma geschrieben.
Wenn eine Operationstaste Taste wie +,-,*,\,sqrt usw... gedrückt wird setzt du die variable zurück.

Als Code könnte ich mir so etwas denken:
Delphi-Quellcode:
procedure TForm1.KommaButton1Click(Sender: TObject);
begin
  if KommaCount < 1 then
    begin
    Edit1.Text := Edit1.Text+',';
    inc(KommaCount);
    end
  else
    begin
    ShowMessage('Ähäm.. Nur EIN Komma!');
    end;
end;

procedure TForm1.OperationsButton2Click(Sender: TObject);
begin
KommaCount := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
KommaCount := 0;
end;
Willnix

MarquiseDeSade 21. Mai 2007 22:08

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
:lol:

Vielen Dank willnix :???:

Deine Variante funktioniert und gefällt mir am besten.

tschüssi..

willnix 22. Mai 2007 15:29

Re: Überprüfen, ob Variable einem gewissen Typ entspricht
 
Kein Ding, immer gerne, viel Spaß noch. :mrgreen:
Willnix


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