Array of Char in anderer Funktion prüfen

Rund um die LCL und andere Komponenten
Antworten
cbd-amin
Beiträge: 7
Registriert: Fr 18. Aug 2017, 17:35

Array of Char in anderer Funktion prüfen

Beitrag von cbd-amin »

Hallo zusammen,
vom Aufbau sieht es so aus, dass ich mehrere Textfelder habe und möchte den Eintrag ('0'..'9';' ,' ;' .') in einer Funktion prüfen um Code zu sparen.
In der Funktion kommt "TTranslateString" statt "PWideChar" an.
1. Wie wandel ich den String wieder um?
2. Kann ich den Code in Edit1 noch kürzen oder so schreiben, das damit mehrere Textfelder geprüft werden?

Die Variablen im interface:

Code: Alles auswählen

 
Eingabe: array[0..99] of char;
CharStr: string;
 


Meine Funktion:

Code: Alles auswählen

// Prüfen ist Zahl?
function TForm1.IstNum(Eingabe: array of char; Antwort: boolean): boolean;
  begin
  //Key := Eingabe[High(Eingabe)];
  if not (Eingabe in ['0'..'9', ',']) then
  begin
    ShowMessage('Nur Zahlen sind zulässig');
    Antwort:= false;
    end
    else
    begin
    Antwort:= true;
    end;
end;   


Im Exitereigniss eines Textfeldes (wobei mir der Code noch zu lang ist und ich überlege den Code einzusparen.

Code: Alles auswählen

 
procedure TForm1.Edit1Exit(Sender: TObject);
var
  Antwort: boolean;
begin
  strpcopy(Edit1.Caption, CharStr);
  Eingabe:= CharStr;
  IstNum(Eingabe, Antwort);
     if Antwort = false then
          begin
          Edit1.SetFocus;
          Edit1.SelectAll;
          end;
end;


Freue mich über jeden Tipp und Hilfe zur Selbsthilfe.

Viele Grüsse
Marco

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Array of Char in anderer Funktion prüfen

Beitrag von m.fuchs »

Tja, ein paar Tipps für dich:

  1. Wenn du den Parameter Antwort als Ausgabe nutzen möchtest, dann muss das Schlüsselwort out davor. Ansonsten wird nichts herauskommen.

    Code: Alles auswählen

    function TForm1.IstNum(Eingabe: array of char; out Antwort: boolean): boolean;


  2. Du brauchst diesen Parameter aber gar nicht, du hast ja eine Funktion und kannst deren Rückgabewert nutzen.

    Code: Alles auswählen

    function TForm1.IstNum(Eingabe: array of char): boolean;
    begin
      //Key := Eingabe[High(Eingabe)];
      if not (Eingabe in ['0'..'9', ',']) then begin
        ShowMessage('Nur Zahlen sind zulässig');
        Result= false;
      end else begin
        Result := True;
      end;
    end;

    Aufruf und Auswertung erfolgt dann so:

    Code: Alles auswählen

    ;if IstNum(Eingabe, Antwort) = false then

    besser noch mit:

    Code: Alles auswählen

    ;if not IstNum(Eingabe, Antwort) then


  3. Abgesehen davon funktioniert deine Methode auch nicht, weil das Eingabe in so nicht verwendet werden kann. Der Compiler sollte daher auch meckern. Du müsstest hier per for..in durch die Eingabe durchgehen.

  4. Dein Herumkopieren von String zu Array of Char ist auch völlig unnötig, man kann direkt den String benutzen.

  5. Diese Funktion brauchst du aber sowieso nicht, es gibt nämlich schon eine: IsNumber.

Soviel erstmal dazu, wichtig für dich auf alle Fälle: Grundlagen anschauen und fragen. Und zwar nicht nur uns, sondern auch den Compiler. Der antwortet nämlich auch, mit mehr oder weniger hilfreichen Fehlermeldungen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

cbd-amin
Beiträge: 7
Registriert: Fr 18. Aug 2017, 17:35

Re: Array of Char in anderer Funktion prüfen

Beitrag von cbd-amin »

Hallo,

vielen Dank für die erste Hilfe. Arbeitete vorher mit VB als Hobby seit Jahren und bin nun seit einer Woche mit Lazarus am probieren. Auf die Hinweise vom Compiler achte ich und verstehe diese auch meist umzusetzen.
Die Funktion IsNumber konnte ich nicht finden, habe mit IsNum probiert und viel gegooglet und kam meist auf selbstgestrickte Funktionen.

Werde es nun mal IsNumber probieren und mich nochmals melden.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Array of Char in anderer Funktion prüfen

Beitrag von m.fuchs »

Achso, was ich natürlich noch vergessen habe: http://wiki.lazarus.freepascal.org/TSpinEdit

Dann brauchst du nicht einmal eine Prüfroutine.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

cbd-amin
Beiträge: 7
Registriert: Fr 18. Aug 2017, 17:35

Re: Array of Char in anderer Funktion prüfen

Beitrag von cbd-amin »

Leider bekomme ich das mit IsNumber nicht hin, die Funktion wird nicht erkannt. Soweit ich gelesen hatte, sollte das in der rtl vorhanden sein? Meldung "Identifier not found".

Sollte doch eigentlich so gehen(?):

Code: Alles auswählen

 
procedure TForm1.Edit1Exit(Sender: TObject);
var
Num1: string;
begin
    Num1 := edit1.Caption;
    IsNumber(Num1)
end;
 


SpinEdit möchte ich hier nicht verwenden.

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

Re: Array of Char in anderer Funktion prüfen

Beitrag von wp_xyz »

Das wäre mein Vorschlag (benötigt die Standardunit SysUtils):

Code: Alles auswählen

uses
  SysUtils;
 
function TForm1.IstNum(Eingabe: String): boolean;
var
  x: Double;
begin
  Result := TryStrToFloat(Eingabe, x);
  // Versucht den String "Eingabe" in eine Gleitkommazahl x umzuwandeln
  // und gibt true/false zurück, wenn dies gelingt oder nicht
end;
 
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if not IstNum(Edit1.Text) then
    ShowMessage('Hoppla - da wird eine Zahl erwartet.');
end;

cbd-amin
Beiträge: 7
Registriert: Fr 18. Aug 2017, 17:35

Re: Array of Char in anderer Funktion prüfen

Beitrag von cbd-amin »

Herrrlich! Danke das geht ja wunderbar, das habe ich nicht gefunden. Kann ich ausser in Lazarus (und google) noch irgendwo nach Funktionen und deren units suchen?
Möchte ich ja noch verstehen weshalb IsNumber einen Fehler anzeigt... Muss ich noch eine Funktion erstellen?

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

Re: Array of Char in anderer Funktion prüfen

Beitrag von wp_xyz »

cbd-amin hat geschrieben:Kann ich ausser in Lazarus (und google) noch irgendwo nach Funktionen und deren units suchen?

Die online-Hilfe? In Lazarus "Hilfe" > "CHM Hilfe". Du siehst nun die Dokumentation zu Free Pascal. In diesen Fenster kannst du weitere Hilfe-Dateien öffnen: "File" > "Open". Wähle eine der chm-Dateien aus, z.B. rtl (hier findest du die FPC-Befehle, die automatisch zur Verfügung stehen), oder fcl für die Befehle, die nach Angabe der rechts oben genannten Unit zur Verfügung stehen. Oder lcl für die Lazarus-Standardkomponenten, die aber nur in GUI-Programmen Sinn machen und zur Verfügung stehen. Das ganze gibt es, etwas schöner formatiert auch online unter http://lazarus-ccr.sourceforge.net/docs/ und in den dort weiterführenden Links.

Darin zu blättern ist aber relativ ineffektiv. Vieles ist besser (aber auch wiederum schlechter) dokumentiert im Wiki - als Einstiegsseite könntest du z.B. http://wiki.freepascal.org/Lazarus_Documentation/de book-marken, besser, weil es einfacher zu schreiben ist (von jedermann), schlechter, weil vieles veraltet ist und sich niemand darum kümmert (das ist der Preis, dafür dass Lazarus/FPC kostenlose Community-Projekte sind). Ich habe mir im Lauf der Zeit im Firefox eine relativ lange Liste von Wiki-Seiten gebookmarkt, die ich immer wieder brauche (z.B. http://wiki.lazarus.freepascal.org/Category:Tutorials für Fragen wie diese).

cbd-amin hat geschrieben:Möchte ich ja noch verstehen weshalb IsNumber einen Fehler anzeigt... Muss ich noch eine Funktion erstellen?

Klicke auf den Link zu IsNumber, der von mschnell etwas weiter oben angegeben ist. Der öffnet dir die FPC-Online-Hilfeseite zu dieser Funktion. Rechts oben findest du die Unit, in der diese Funktion vorkommt, hier: Character. Diese musst du in die uses-Zeile aufnehmen, wenn die sie benutzen willst. Aber wenn du dir links den Funktionsaufruf ansiehst, denn steht da der Datentyp UnicodeChar. Du bist Anfänger, und da würde ich von sowas die Finger lassen, bleibe einfach bei dem Typen String, dann geht vieles automatisch.

Antworten