Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Laden und Speichern von Kommazahlen möglich? (https://www.delphipraxis.net/100753-laden-und-speichern-von-kommazahlen-moeglich.html)

Delphianfaenger 3. Okt 2007 14:15


Laden und Speichern von Kommazahlen möglich?
 
Hallo,

ich habe ein Problem:

Ich habe ein kleines Programm gebastelt, dass bestimmte werte in einer Textdatei speichert. Wenn ich diese Werte wieder laden möchte funktioniert das nur dann, wenn die Zahlen ganze Zahlen sind, also ohne Komma. Handelt es sich um Kommazahlen, dann gibt es eine Fehlermeldung "Project PorjektTest.exe raised exeption class EInOutError with message 'Invalid numeric input'. Process stopped. Use Step or Run to continue." Wenn ich in der Textdatei das Komma durch einen Punkt ersetze funktioniert es den Wert zu laden, sogar als Komma wird er ausgegeben. Allerdings kann ich Werte nicht als Zahl mit Punkt als Trennungszeichen eingeben, da sonst die Berechnungen nicht mehr funktionieren, weil das Programm auf Komma als Trennzeichen bei der Eingabe besteht. Wäre schön, wenn jemand einen Lösungsansatz für das Problem hätte.

Achja ich benutze Delphi7.

Gruß ein absoluter Delphineuling

Jürgen Thomas 3. Okt 2007 14:33

Re: Laden und Speichern von Kommazahlen möglich?
 
Hallo,

um Dir eine passende Empfehlung zu geben, benötigen wir Deinen bisherigen Code:
  • Woher kommt der (bisherige) Wert?
  • Wie speicherst Du ihn in der Textdatei?
  • Wie willst Du den gespeicherten Text wieder einlesen und in eine Zahl verwandeln?
Es gibt verschiedene Verfahren zur Formatierung einer Zahl als String (unter Verwendung von DecimalSeparator) und zum Konvertieren "zurück" - Stichwort u.a. Parse. Dein Problem klingt, als ob die Konvertierungsmethoden "hin" und "zurück" nicht zusammenpassen.

Jürgen

patti 3. Okt 2007 14:38

Re: Laden und Speichern von Kommazahlen möglich?
 
Ich würde die Daten mit einem Punkt speichern, dann wäre das Auslesen wohl kein Problem mehr.
Einfach die Zahl in einen String umwandeln (machst du wahrscheinlich sowieso irgendwo) und dann z.B. so eine Funktion nutzen:

Delphi-Quellcode:
procedure umwandeln(var s : string);
var p : integer;
begin
    p := Pos(',',s);
    if p > 0 then s[p] := '.';
end;
Die Funktion wandelt in dem String das Komma in einen Punkt um (ungetestet).

P@Tti

DeddyH 3. Okt 2007 14:42

Re: Laden und Speichern von Kommazahlen möglich?
 
Also, ich würde eher eine typisierte Datei nehmen, dann entfällt die komplette Konvertierung.

Delphianfaenger 3. Okt 2007 15:04

Re: Laden und Speichern von Kommazahlen möglich?
 
Wie benutze ich denn eine typisierte Datei? Ist damit gemeint, dass ich eine Datei mit bestimmter Endung .Beispiel verwende?

Hier erstmal die Codeteile:
Delphi-Quellcode:

{-------------------------------------------------------------------------------
  Speicherung der Ein- und Ausgabewerte
-------------------------------------------------------------------------------}

procedure TFormPalettierung.Speichern1Click(Sender: TObject);
var Datei : TextFile;

begin

   //Eingabewerte

 if MessageDlg('Klicken Sie Ja, wenn Sie die Eingabewerte speichern möchten.',
    mtInformation,[mbYes,mbNo],0) = mrYes then
    begin
     if SaveDialog1.Execute then
     begin
      AssignFile(Datei,SaveDialog1.FileName);
      Rewrite(Datei);
      WriteLN(Datei,EditL.Text);
      WriteLN(Datei,EditB.Text);
      WriteLN(Datei,EditH.Text);
      WriteLN(Datei,EditM.Text);
      WriteLN(Datei,ComboBoxStandflaeche.itemindex);
      WriteLN(Datei,EditA.Text);
      WriteLN(Datei,ComboBoxPalette.itemindex);
      WriteLN(Datei,EditG.Text);
      WriteLN(Datei,EditGH.Text);
      WriteLN(Datei,EditPG.Text);
      WriteLN(Datei,EditN.Text);
      WriteLN(Datei,ComboBoxBlockstruktur.itemindex);
      WriteLN(Datei,EditSF.Text);

      CloseFile(Datei);
     end;

    end;

    // Ausgabewerte

 if MessageDlg('Klicken Sie Ja, wenn Sie die Ausgabewerte speichern möchten.',
    mtInformation,[mbYes,mbNo],0) = mrYes then
    begin

     if SaveDialog2.Execute then
     begin
      AssignFile(Datei,SaveDialog2.FileName);
      Rewrite(Datei);
      WriteLN(Datei,LabelAPL.Caption);
      WriteLN(Datei,LabelLagenP.Caption);
      WriteLN(Datei,LabelAnzahlP.Caption);
      WriteLN(Datei,LabelRest.Caption);
      WriteLN(Datei,LabelStapel.Caption);
      WriteLN(Datei,LabelStauch.Caption);
      CloseFile(Datei);
     end;
    end;

end;

{-------------------------------------------------------------------------------
  Laden der Ein- und Ausgabewerte
-------------------------------------------------------------------------------}

procedure TFormPalettierung.Laden1Click(Sender: TObject);
var Datei: TextFile;
    x : Single;
    y : integer;
    Button : Integer;
begin
  Button := Application.MessageBox('Klicken Sie OK, wenn Sie'#13#10'die Koordinaten einlesen möchten',
           'Koordinaten einlesen', mb_OKCancel+mb_DefButton1);
  if Button = IDOK then
  begin
    if OpenDialog1.Execute then
    begin
    AssignFile(Datei,OpenDialog1.Filename);
    Reset (Datei);
    ReadLn(Datei,x);
    EditL.Text := FloatToStr(x);
    ReadLn(Datei,x);
    EditB.Text := FloatToStr(x);
    ReadLn(Datei,x);
    EditH.Text := FloatToStr(x);
    ReadLn(Datei,x);
    EditM.Text := FloatToStr(x);
    ReadLn(Datei,y);
    ComboBoxStandflaeche.itemindex := y;
    ReadLn(Datei,x);
    EditA.Text := FloatToStr(x);
    ReadLn(Datei,y);
    ComboBoxPalette.itemindex := y;
    ReadLn(Datei,x);
    EditG.Text := FloatToStr(x);
    ReadLn(Datei,x);
    EditGH.Text := FloatToStr(x);
    ReadLn(Datei,x);
    EditPG.Text := FloatToStr(x);
    ReadLn(Datei,x);
    EditN.Text := FloatToStr(x);
    ReadLn(Datei,y);
    ComboBoxBlockstruktur.itemindex := y;
    ReadLn(Datei,x);
    EditSF.Text := FloatToStr(x); //Kommazahl


    CloseFile(Datei);
    end;

    if OpenDialog2.Execute then
    begin
    AssignFile(Datei,OpenDialog2.Filename);
    Reset (Datei);
    ReadLn(Datei,x);
    LabelAPL.Caption := FloatToStr(x);
    ReadLn(Datei,x);
    LabelLagenP.Caption := FloatToStr(x);
    ReadLn(Datei,x);
    LabelAnzahlP.Caption := FloatToStr(x);
    ReadLn(Datei,x);
    LabelRest.Caption := FloatToStr(x);
    ReadLn(Datei,x);
    LabelStapel.Caption := FloatToStr(x); //Kommazahl
    ReadLn(Datei,x);
    LabelStauch.Caption := FloatToStr(x); //Kommazahl
    CloseFile(Datei);
    end;

  end;
  if Button = IDCANCEL then ShowMessage('Kein Wunsch zum Lesen.');
end;

in sämtliche Edit-Felder werden nur Zahlen eingetragen kein Text. Bei Patties Code sehe ich leider nicht durch : /

DeddyH 3. Okt 2007 15:18

Re: Laden und Speichern von Kommazahlen möglich?
 
Eine typisierte Datei ist eine Datei, die Elemente eines bestimmten Typs aufnimmt (wer hätte das gedacht? :D ). Mal ein Beispiel:
Delphi-Quellcode:
type TMyRecord = record
  einString: string[40];
  eineInteger: integer;
  eineDouble: Double;
end;

const sFileName = 'C:\test.rec';

procedure TFormMain.btnSpeichernClick(Sender: TObject);
var MyRec: TMyRecord;
    MyFile: file of TMyRecord; //das ist eine Deklaration einer typisierten Datei
begin
  FillChar(MyRec,SizeOf(MyRec),#0);
  with MyRec do
    begin
      einString := 'String';
      eineInteger := 123;
      eineDouble := 3.1415927;
    end;
  AssignFile(MyFile,sFileName);
  rewrite(MyFile);
  write(MyFile,MyRec);
  CloseFile(MyFile);
end;

procedure TFormMain.btnLesenClick(Sender: TObject);
var MyRec: TMyRecord;
    MyFile: file of TMyRecord;
begin
  if not FileExists(sFileName) then exit;
  FillChar(MyRec,SizeOf(MyRec),#0);
  AssignFile(MyFile,sFileName);
  Reset(MyFile);
  read(MyFile,MyRec);
  CloseFile(MyFile);
  ShowMessage('Daten:'+#13#10+MyRec.einString+#13#10+
              inttostr(MyRec.eineInteger)+#13#10+
              FloatToStr(MyRec.eineDouble));
end;
Getippt und nicht getestet, aber alles Weitere zu Records und typisierten Dateien sollte sich in der Hilfe finden lassen.


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