Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Record in Datei speichern (https://www.delphipraxis.net/172223-record-datei-speichern.html)

EMS 19. Dez 2012 13:44

AW: Record in Datei speichern
 
So die Procedure geht jetzt da passte die end nicht ganz
So jetzt geht aber das nicht mit dem Button?
Ich hab das Gefühl das da eine Variable unter button1 fehlt?
Oder was mach ich jetzt wieder falsch?

Fehler sind:

unit1.pas(81,3) Error: Wrong number of parameters specified for call to "ZieleErfassen"
unit1.pas(49,11) Hint: Found declaration: ZieleErfassen(var TZielListe);
unit1.pas(85) Fatal: There were 1 errors compiling module, stopping

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

  TZiel = record
    Ort:String[20];
    Preis: real;
  end;


  TZielListe = record
    Ziele: array[1..100] of TZiel;
    ZielZahl: integer;
  end;

TZielFile = file of TZiel;


var
  Form1: TForm1;
  ZielListe: TZielListe;
  ZielFile: TZielFile;
  I: Integer;

implementation

{$R *.lfm}

{ TForm1 }

procedure ZieleErfassen(var Liste: TZielListe);
begin
     with Liste do
       begin
       Ziele[1].Ort:='Dresden';
       Ziele[1].Preis:=16.00;
       with Ziele[2] do
          begin
          Ort := 'Berlin';
          Preis := 43.00;
          end;
             with Ziele[3] do
             begin
             Ort :='Aachen';
             Preis := 155.00;
             end;
        ZielZahl :=3;
       end;

ZieleErfassen(ZielListe);
Assign(Zielfile, 'C:\Users\Desktop\adress.dat');
Rewrite(Zielfile);
   with ZielListe do
      for I := 1 to ZielZahl do
      begin
      write(ZielFile, Ziele[I]);
      Close(ZielFile);
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ZieleErfassen;
end;
end.

Volker Z. 19. Dez 2012 14:09

AW: Record in Datei speichern
 
Zitat:

So die Procedure geht jetzt da passte die end nicht ganz
Da passt mehr noch nicht ganz.
Zitat:

unit1.pas(81,3) Error: Wrong number of parameters specified for call to "ZieleErfassen"
Du musst schon in TForm1.Button1Click den Parameter mitgeben: also
Delphi-Quellcode:
ZieleErfassen (ZielListe);

Dann wird die procedure ZieleErfassen in der procedure selbst nochmals aufgerufen, was dann zu einem Stackowerflow führen wird.

Und Du solltest noch das CloseFile(); aus der for-Schleifen nehmen!

Gruß

EMS 19. Dez 2012 14:21

AW: Record in Datei speichern
 
So der Compiler läuft jetzt durch

Beim klicken des Buttons kommt nun ein Fenster

Projekt projekt1 hat Exception-Klasse>>External:
SIGSEGV<< ausgelöst.

In Datei'unit1.pas' in Zeile 50:
begin

Das ist nach der procedure Zieleerfassen




Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

  TZiel = record
    Ort:String[20];
    Preis: real;
  end;


  TZielListe = record
    Ziele: array[1..100] of TZiel;
    ZielZahl: integer;
  end;

TZielFile = file of TZiel;


var
  Form1: TForm1;
  ZielListe: TZielListe;
  ZielFile: TZielFile;
  I: Integer;

implementation

{$R *.lfm}

{ TForm1 }

procedure ZieleErfassen(var Liste: TZielListe);
begin
     with Liste do
       begin
       Ziele[1].Ort:='Dresden';
       Ziele[1].Preis:=16.00;

       with Ziele[2] do
          begin
          Ort := 'Berlin';
          Preis := 43.00;
          end;

             with Ziele[3] do
             begin
             Ort :='Aachen';
             Preis := 155.00;
             end;

        ZielZahl :=3;
       end;

ZieleErfassen(ZielListe);
Assign(Zielfile, 'C:\Users\Desktop\adress.dat');
Rewrite(Zielfile);
   with ZielListe do
      for I := 1 to ZielZahl do
      begin
      write(ZielFile, Ziele[I]);
      end;
Close(ZielFile);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Zielliste:TZielliste;
begin
  ZieleErfassen(Zielliste);
end;
end.

Volker Z. 19. Dez 2012 14:36

AW: Record in Datei speichern
 
Zitat:

Projekt projekt1 hat Exception-Klasse>>External:
SIGSEGV<< ausgelöst.
Innerhalb der procedure ZieleErfassen steht noch immer der erneute Aufruf ZieleErfassen. Endlos-Rekusrsion und damit die Exception.

Gruß

Bjoerk 19. Dez 2012 14:38

AW: Record in Datei speichern
 
Du produzierst eine Stackoverflow. Schmeiß das ZieleErfassen(ZielListe) in ZieleErfassen raus. Und die überflüssigen Variablen gleich mit. :-D Und das with auch, wurde dir schon gesagt, ist schlechter Stil.

Volker Z. 19. Dez 2012 14:41

AW: Record in Datei speichern
 
Habe ich vorhin noch übersehen: Der zweite with-Block kann mit "ZielListe" nichts anfangen, wenn dann muss es schon
Delphi-Quellcode:
[B]with[/B] Liste [B]do[/B]
heißen.

Gruß

EMS 19. Dez 2012 14:52

AW: Record in Datei speichern
 
ah sehr gut danke euch
jetzt geht es.

Mhh jetzt sieht die Datei aber so aus:
DresdenðÊÙ4ê†àÙ0è 0@Berlin*Š X:Ýìé €E@AachenÔ:Ý  „ê `c@

ist das richtig?
müsste das nicht
Dresden
16.00
Berlin
43.00
Aachen
155.00
aussehen?

was muss ich denn machen damit das wieder so wird?

DeddyH 19. Dez 2012 14:54

AW: Record in Datei speichern
 
Wieso wirfst Du das with nicht raus? Wie Du siehst, stiftet es nur Verwirrung. Aber AssignFile und CloseFile sehe ich ja auch noch nicht, was soll's also :?

EMS 19. Dez 2012 14:59

AW: Record in Datei speichern
 
ich weiß nicht genau welche with du meinst?
Das mit dem Assignfile, closefile habe ich gerade geändert

DeddyH 19. Dez 2012 15:09

AW: Record in Datei speichern
 
Na, alle with.
Delphi-Quellcode:
procedure ZieleErfassen(var Liste: TZielListe);
begin
  Liste.Ziele[1].Ort:='Dresden';
  Liste.Ziele[1].Preis:=16.00;
  Liste.Ziele[2].Ort := 'Berlin';
  Liste.Ziele[2].Preis := 43.00;
  Liste.Ziele[3].Ort :='Aachen';
  Liste.Ziele[3].Preis := 155.00;
  ZielZahl := 3;
end;
So siehst Du doch gleich, was passiert und musst nicht überlegen, in welchem with Du gerade bist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr.
Seite 2 von 4     12 34      

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