Editfeld ohne Buchstaben

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Phil_1905
Beiträge: 6
Registriert: Mi 23. Okt 2013, 12:57

Editfeld ohne Buchstaben

Beitrag von Phil_1905 »

hallo zusammen,

zur Zeit arbeiten mein Kollege und ich an einem Projekt für die Uni. Es geht um die Simulation einer Glühlampe. An sich läuft das Programm und ist fast fertig. Allerdings haben wir ein Problem welches wir nicht gelöst bekommen. Und zwar bekommen wir es nicht hin, dass in den Editfeldern, welche zur erfassung der Werte für die Berechnungen sind, nur Zahlen einzugeben. Wenn wir dasProgramm vorstellen darf die Eingabe von Buchstaben in die Felder nicht möglich sein. Haben schon vieles Probiert und uns auch in alten Forenbeiträgen informiert, allerdings ohne erfolg. Vielleicht kann uns ja hier jemand helfen, da unser Abgabetermin Anfang November ist und uns die Zeit davon läuft. Danke schonmal im Vorfeld

lg Philip

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Editfeld ohne Buchstaben

Beitrag von Michl »

Schau mal unter dem Suchbegriff "MaskEdit". Hilfsweise könnte auch im Ereignis OnKeyDown des Edit-Feldes der jeweils eingegeben Key (Taste) geprüft werden, ob er eine Zahl darstellt oder nicht.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

wp_xyz
Beiträge: 5169
Registriert: Fr 8. Apr 2011, 09:01

Re: Editfeld ohne Buchstaben

Beitrag von wp_xyz »

Oder nimm TSpinEdit oder TFloatSpinEdit

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Editfeld ohne Buchstaben

Beitrag von Ally »

Hallo Philip,

ich habe mir mal die angehängte Komponente (NumEdit) gebastelt.
Vielleicht ist das ja genau das was du suchst.
Die Eingabe ist gut gegen Fehleingaben, auch gegen Einfügen über die Zwischenablage, abgesichert.


MfG
Zuletzt geändert von Ally am Mi 23. Okt 2013, 17:34, insgesamt 1-mal geändert.

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Editfeld ohne Buchstaben

Beitrag von Ally »

Entschuldigung - falscher Anhang. :(

Hier der Richtige
Dateianhänge
NumEdit.zip
(4.59 KiB) 87-mal heruntergeladen

Phil_1905
Beiträge: 6
Registriert: Mi 23. Okt 2013, 12:57

Re: Editfeld ohne Buchstaben

Beitrag von Phil_1905 »

Danke.

Werde das heute abend ausprobieren. Halte euch auf dem Luafenden ;)

Phil_1905
Beiträge: 6
Registriert: Mi 23. Okt 2013, 12:57

Re: Editfeld ohne Buchstaben

Beitrag von Phil_1905 »

Über das Erieignis OnKeyDown bekomme ich immer einnen fatalenn Fehler.

hatte es damit versucht.

Code: Alles auswählen

if not ((key in [0..9]) or (key = 8) or ((Shift = [ssAlt]) and (key = 115)) or ((Shift = [ssCtrl, ssAlt]) and (key = 12))) then
  begin
  key := $0;
  //MessageBeep(0);
@Ally: Ich habe Probleme deine Komponente in mein Programm zu integrieren. Bekomme immer neue Fehler... Gibt es eine möglichkeit die Komponente direkt in mein Programm zu laden?
Zuletzt geändert von Lori am Fr 1. Nov 2013, 12:44, insgesamt 1-mal geändert.
Grund: Highlighter

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Editfeld ohne Buchstaben

Beitrag von Ally »

Hallo Philip,

die Komponente muss man über Package / Package-Datei (.lpk) öffnen... installieren.
Anschließend kann man sie wie jede andere Komponente auf dem Form platzieren und benutzen.

Mfg

p.s. ich nutze Lazarus 1.12 und Win

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Editfeld ohne Buchstaben

Beitrag von Michl »

Phil_1905 hat geschrieben:if not ((key in [0..9]) or (key = 8) or ((Shift = [ssAlt]) and (key = 115)) or ((Shift = [ssCtrl, ssAlt]) and (key = 12))) then
begin
key := $0;

Falls du das unbeding selber machen willst, nutze doch eine "Case"-Abfrage (Achtung Key ist ein Word, kein Char oder Byte!) z.B:

Code: Alles auswählen

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  case Key of
    48..59,                     //0..9
    8,                          //BackSpace
    37,                         //Pfeil Links
    39:;                        //Pfeil Rechts
//    ...                       //etc.
//    else Caption:=IntToStr(Key);
    else Key:=0;
  end;
end;
Bin aber immer noch der Meinung, soetwas, wie TMaskEdit ist dafür besser geeignet und immer bei Lazarus standardmäßig dabei. Siehe z.B. http://www.delphipraxis.net/302508-post.html

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Phil_1905
Beiträge: 6
Registriert: Mi 23. Okt 2013, 12:57

Re: Editfeld ohne Buchstaben

Beitrag von Phil_1905 »

okay danke.

wie benutze ich denn genau TMaskEdit? Arbeite hier nur von einem Fehler zum anderen.

Ich benutze Lazarus 1.0

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Editfeld ohne Buchstaben

Beitrag von Michl »

TMaskEdit einfach wie ein normales TEdit auf die Form schieben, dann die gewünschte Maske z.B. im Objektinspektor unter Eigenschaft "EditMask" einstellen. Was alles möglich ist, hatte ich oben in dem Link gepostet, eine bessere Beschreibung habe ich nicht gefunden. Eine Maske könnte dann z.B. so aussehen:

!###,##;1;_

Das ists. Am besten ein bischen damit experimentieren.

Ansonsten, sollen nur Ganzzahlen (mit fester Ober- und Untergrenze) eingegeben werden können, ist evtl. TSpinEdit (wie von wp_xyz empfohlen) für dich das Richtige?! Oder evtl. TFloatSpinEdit, für Float-/Gleitkommazahlen?! Sind auch standardmäßig bei Lazarus dabei!

[Edit] Ich zitiiere mal den Link, bevor er evtl. irgendwann mal down ist (ist allerdings für Delphi, weiss nicht, ob 100%ig gleich in Lazarus?!):
Die Eigenschaft EditMask definiert die Maske, mit der festgelegt wird, welche Eingaben im maskierten Steuerelement gültig sind.

property EditMask: string;

Beschreibung

Mit Hilfe der Eigenschaft EditMask können Sie festlegen, welche Zeichen und Formate im maskierten Steuerelement gültig sind. Versucht der Benutzer, ein ungültiges Zeichen einzugeben, wird dieses nicht angenommen. Die Überprüfung wird von der Methode ValidateEdit zeichenweise durchgeführt.
Eine Maske besteht aus drei Feldern, die durch Semikolons voneinander getrennt sind. Das erste Feld ist die Maske selbst. Das zweite Feld besteht aus einem Zeichen und bestimmt, ob die literalen Zeichen der Maske mit den Daten gespeichert werden. Das dritte Feld legt das Zeichen fest, das für noch nicht eingegebene Zeichen angezeigt wird.

Die folgenden speziellen Zeichen werden im ersten Feld der Maske verwendet:

Zeichen Bedeutung in der Maske

! Das Zeichen ! gibt in einer Maske an, daß optionale Zeichen als führende Leerzeichen dargestellt werden. Ist kein !-Zeichen vorhanden, werden optionale Zeichen im EditText-Objekt als abschließende Leerzeichen dargestellt.
> Wird das Zeichen > in einer Maske angegeben, werden alle nachfolgenden Zeichen in Großbuchstaben umgewandelt, bis das Ende der Maske erreicht ist oder das Zeichen < angetroffen wird.
< Wird das Zeichen < in einer Maske angegeben, werden alle nachfolgenden Zeichen in Kleinbuchstaben umgewandelt, bis das Ende der Maske erreicht ist oder das Zeichen > angetroffen wird.

<> Werden diese beiden Zeichen zusammen verwendet, findet keine Überprüfung der Groß-/Kleinschreibung statt. Die Daten werden in der Schreibweise formatiert, in der sie vom Benutzer eingegeben werden.
\ Nach dem Zeichen \ folgt ein literales Zeichen. Mit seiner Hilfe können die speziellen Maskenzeichen als Literale in den Daten angegeben werden.
L An dieser Stelle muß ein Buchstabe (A-Z, a-z) eingegeben werden.
l An dieser Stelle ist ausschließlich ein Buchstabe erlaubt. Eine Eingabe ist jedoch nicht erforderlich.

A An dieser Stelle muß ein alphanumerisches Zeichen (A-Z, a-z, 0-9) eingegeben werden.
a An dieser Stelle ist ausschließlich ein alphanumerisches Zeichen erlaubt. Eine Eingabe ist jedoch nicht erforderlich.
C An dieser Stelle muß ein beliebiges Zeichen eingegeben werden.
c An dieser Stelle kann ein beliebiges Zeichen eingegeben werden. Eine Eingabe ist jedoch nicht erforderlich.
0 An dieser Stelle muß ein numerisches Zeichen eingegeben werden.

9 An dieser Stelle darf ausschließlich ein numerisches Zeichen angegeben werden. Eine Eingabe ist jedoch nicht erforderlich.
# An dieser Stelle darf ausschließlich ein numerisches Zeichen oder ein Plus- bzw. Minuszeichen eingegeben werden. Eine Eingabe ist jedoch nicht erforderlich.
: Das Zeichen : wird verwendet, um in Zeitangaben Stunden, Minuten und Sekunden zu trennen. Ist unter Ländereinstellungen in der Systemsteuerung ein anderes Trennzeichen eingestellt, wird dieses statt dessen verwendet.

/ Mit dem Zeichen / werden in einer Datumsangabe der Monat, der Tag und das Jahr voneinander getrennt. Ist unter Ländereinstellungen in der Systemsteuerung ein anderes Trennzeichen eingestellt, wird dieses statt dessen verwendet..
; Das Zeichen ; wird verwendet, um die drei Felder der Maske voneinander zu trennen.
_ Das Zeichen _ fügt automatisch Leerzeichen in den Text ein. Bei der Eingabe in das Feld werden diese Zeichen vom Cursor übersprungen.

Alle nicht in der Tabelle aufgeführten Zeichen können im ersten Feld der Maske als literale Zeichen angegeben werden. Literale Zeichen werden automatisch eingefügt und vom Cursor beim Bearbeiten übersprungen. Die speziellen Maskenzeichen können auch als Literale angegeben werden, sofern ihnen das Zeichen \ vorangestellt wird.
Das Zeichen im zweiten Feld der Maske gibt an, ob die in der Maske enthaltenen literalen Zeichen zusammen mit dem Text des Eingabefeldes gespeichert werden. So kann beispielsweise die Maske für eine Telefonnummer mit Vorwahl folgendermaßen angegeben werden:

(00000)_0000000;0;*

Der Wert 0 im zweiten Feld gibt an, daß die Eigenschaft Text des Steuerelements aus den 10 einzugebenden Ziffern besteht und nicht aus den 14 Zeichen, aus denen sich die Nummer im Eingabefeld zusammensetzt.
Eine 0 im zweiten Feld legt fest, daß Literale nicht gespeichert werden. Bei jedem anderen Zeichen werden sie als Teil des Textes behandelt. Dieser Wert kann mit der Eigenschaft EditMask im Objektinspektor oder im Programm durch Ändern der typisierten Konstante MaskNoSave eingestellt werden.

Das dritte Feld der Maske enthält das Zeichen, das im Eingabefeld für Leerstellen (nicht eingegebene Zeichen) angezeigt wird. In der Voreinstellung entspricht es dem für literale Leerzeichen verwendeten Zeichen. Beide Zeichen werden im Eingabefenster identisch angezeigt. Gibt der Benutzer jedoch Informationen in das Feld ein, werden die Leerstellen der Reihe nach ausgewählt, während die Leerzeichen übersprungen werden.
Bei Angabe eines leeren Strings für EditMask wird die Maske entfernt.

Hinweis

Bei Multibyte-Zeichensätzen wie dem japanischen Shift-JIS entspricht jedes Maskenzeichen einem einzelnen Byte. Zum Festlegen von Doppelbyte-Zeichen mit den Bezeichern L, l, A, a, C oder c müssen die Maskenzeichen auch verdoppelt werden. LL stellt beispielsweise zwei alphabetische Einzelbyte-Zeichen oder ein Doppelbyte-Zeichen dar. Es werden nur literale Einzelbyte-Zeichen unterstützt.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten