AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Laden und Speichern von Kommazahlen möglich?
Thema durchsuchen
Ansicht
Themen-Optionen

Laden und Speichern von Kommazahlen möglich?

Ein Thema von Delphianfaenger · begonnen am 3. Okt 2007 · letzter Beitrag vom 3. Okt 2007
Antwort Antwort
Delphianfaenger

Registriert seit: 3. Okt 2007
2 Beiträge
 
#1

Laden und Speichern von Kommazahlen möglich?

  Alt 3. Okt 2007, 14:15
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
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: Laden und Speichern von Kommazahlen möglich?

  Alt 3. Okt 2007, 14:33
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Laden und Speichern von Kommazahlen möglich?

  Alt 3. Okt 2007, 14:38
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
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Laden und Speichern von Kommazahlen möglich?

  Alt 3. Okt 2007, 14:42
Also, ich würde eher eine typisierte Datei nehmen, dann entfällt die komplette Konvertierung.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphianfaenger

Registriert seit: 3. Okt 2007
2 Beiträge
 
#5

Re: Laden und Speichern von Kommazahlen möglich?

  Alt 3. Okt 2007, 15:04
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 : /
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Laden und Speichern von Kommazahlen möglich?

  Alt 3. Okt 2007, 15:18
Eine typisierte Datei ist eine Datei, die Elemente eines bestimmten Typs aufnimmt (wer hätte das gedacht? ). 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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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