Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Öffnen einer txt datei funktioniert als Funktion nicht (https://www.delphipraxis.net/115540-oeffnen-einer-txt-datei-funktioniert-als-funktion-nicht.html)

punker-lili 13. Jun 2008 16:29


Öffnen einer txt datei funktioniert als Funktion nicht
 
Hi Leute!
Ich hatte folgenden Ablauf zum Öffnen einer Textdateiin meinem Programm. Da ich dieses jetzt öfters brauche, wollte ichs als Procedure speichern aber da meckert er rum, wenn ich die Länge der dynamischen arrays festlege. Wie kann man das beheben?

Der Quellcode:
Delphi-Quellcode:
procedure oeffnen(ort:string;var sd_takt,sd_v,sd_ende:integer;var sd_laenges,sd_hoehes:array of integer;var test_klick:boolean);
var sd_schnitt:Textfile;
    sd_hoehe,sd_laenge:array of integer;
    sd_ton:array of string;
    sd:integer;
begin
 AssignFile(sd_schnitt,ort);
 Reset (sd_schnitt);
 readln(sd_schnitt,sd_takt);
 readln(sd_schnitt,sd_v);
 readln(sd_schnitt,sd_ende);
 setlength(sd_ton,sd_ende);
 setlength(sd_laenge,sd_ende);
 setlength(sd_hoehe,sd_ende);
 for sd:=0 to sd_ende -1 do
  begin
   readln(sd_schnitt,sd_ton[sd]);
   sd_hoehe[sd]:=strtoint(copy(sd_ton[sd],1,2));
   sd_laenge[sd]:=strtoint(copy(sd_ton[sd],3,1));
  end;
closefile(sd_schnitt);
test_klick:=false;
end;
Danke!

mkinzler 13. Jun 2008 16:34

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Was bedeutet meckern?

punker-lili 13. Jun 2008 16:42

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
also delphi gibt einen fehler aus und complementiert nicht weiter. delphi meit, das diese beiden typen nicht übereinstimmen. Somit kann dem dynamischen array keinem wert zugewiesen weden.

mkinzler 13. Jun 2008 16:45

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Zitat:

also delphi gibt einen fehler aus
Ja welcher :zwinker:

punker-lili 13. Jun 2008 16:49

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
"Incompatible Types" bei
setlength(sd_laenge,sd_ende);
setlength(sd_hoehe,sd_ende);

Neutral General 13. Jun 2008 16:49

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hi,

Ich rate jetzt einfach mal und sage du musst es so machen:

Delphi-Quellcode:
type
  TIntArray: Array of Integer;

procedure oeffnen(ort:string;var sd_takt,sd_v,sd_ende:integer;var sd_laenges,sd_hoehes: TIntArray;var test_klick:boolean);
Wenn ich falsch liege, dann wäre wie gesagt eine genauere Fehlerbeschreibung nicht schlecht ;)

Klaus01 13. Jun 2008 16:50

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Delphi-Quellcode:
readln(sd_schnitt,sd_v);
readln(sd_schnitt,sd_ende); // sd_schnitt ist eine TextDatei
setlength(sd_ton,sd_ende);
setlength(sd_laenge,sd_ende);
setlength(sd_hoehe,sd_ende);
Du liest sd_ende als String aus, nicht als Integer.
Du hast sd_ende wohl als Integer deklariert aber willst es als String nutzen.
Also einen String einlesen, in einen Integer wandeln und weiterverwenden.

Grüße
Klaus

punker-lili 13. Jun 2008 16:54

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
das der fehler daran liegt, kann nicht sein, da genau dieser ablauf vorher ohne procedure deklerastion in einer neuen unit funktionier hat!
habs aber trotzdem probiert und er gibt immernoch den selbsen fehler aus!

marabu 13. Jun 2008 17:09

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hallo Anna,

dein Code aus Beitrag #1 lässt sich bei mir einwandfrei übersetzen.

Welche Delphi-Version verwendest du?

Grüße vom marabu

Klaus01 13. Jun 2008 17:12

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hallo,

gut, ich nehme alles zurück und behaupte das Gegenteil.

Bei mir funktioniert der Code:

Delphi-Quellcode:
procedure oeffnen(ort:string;var sd_takt,sd_v,sd_ende:integer;var sd_laenges,sd_hoehes:array of integer;var test_klick:boolean);
var sd_schnitt:Textfile;
    sd_hoehe,sd_laenge:array of integer;
    sd_ton:array of string;
    sd:integer;
begin
  AssignFile(sd_schnitt,ort);
  Reset (sd_schnitt);
  readln(sd_schnitt,sd_takt);
  readln(sd_schnitt,sd_v);
  readln(sd_schnitt,sd_ende);
  setlength(sd_ton,sd_ende);
  setlength(sd_laenge,sd_ende);
  setlength(sd_hoehe,sd_ende);
  for sd:=0 to sd_ende -1 do
    begin
      readln(sd_schnitt,sd_ton[sd]);
      sd_hoehe[sd]:=strtoint(copy(sd_ton[sd],1,2));
      sd_laenge[sd]:=strtoint(copy(sd_ton[sd],3,1));
    end;
  closefile(sd_schnitt);

end;
So rufe ich ihn auf:
Delphi-Quellcode:
 oeffnen('d:\test.txt',takt,v,ende,testArray1,testArray2,test_klick);
So sieht meine Typendeklaration aus:

Delphi-Quellcode:
type
  IArray = Array of Integer;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    testArray1: IArray;
    testArray2: IArray;
    takt,v,ende: Integer;
    test_klick: Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;
Grüße
Klaus

punker-lili 13. Jun 2008 17:26

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
hmm... du machst aus dem dynamischen integer array nen neuen typ... warum sollte es aufeinmalk damit funktionieren?

Klaus01 13. Jun 2008 17:36

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hallo,

weil der var Parameter einen solchen Typen erwartet.
Wenn Du nur eine Variable IntArray: Array of Integer übergibst
mosert der Compiler.
Wenn Du aber eine Variable IntArray: TIntArray übergibst
und TIntArray = Array of Integer ist dann mosert der Compiler nicht.
Warum dem so ist, kann ich nicht genau erklären.

Grüße
Klaus

marabu 13. Jun 2008 17:45

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hallo Klaus,

hat dein Compiler sich wirklich beschwert? Verwechselst du das nicht mit Arrays als Funktionstyp?

Ich hatte geschrieben, dass es bei mir keine Übersetzungsprobleme gibt. Allerdings ist das Array sd_ton überflüssig:

Delphi-Quellcode:
procedure oeffnen(
  ort: string;
  var sd_takt, sd_v, sd_ende: Integer;
  var sd_laenges, sd_hoehes: array of Integer;
  var test_klick: Boolean
);
var
  sd_schnitt: Textfile;
  sd_hoehe, sd_laenge: array of Integer;
  //sd_ton: array of string;
  sd, n: Integer;
begin
  AssignFile(sd_schnitt, ort);
  Reset(sd_schnitt);
  ReadLn(sd_schnitt, sd_takt);
  ReadLn(sd_schnitt, sd_v);
  ReadLn(sd_schnitt, sd_ende);
  //SetLength(sd_ton, sd_ende);
  SetLength(sd_laenge, sd_ende);
  SetLength(sd_hoehe, sd_ende);
  for sd := 0 to sd_ende - 1 do
  begin
    ReadLn(sd_schnitt, n {sd_ton[sd]});
    sd_hoehe[sd] := n div 10; //StrToInt(Copy(sd_ton[sd], 1, 2));
    sd_laenge[sd] := n mod 10; //StrToInt(Copy(sd_ton[sd], 3, 1));
  end;
  CloseFile(sd_schnitt);
  test_klick := False;
end;
Freundliche Grüße

punker-lili 13. Jun 2008 17:50

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
ich habs ausprobiert.. es funktioniert immer noch nicht :oops: ... jetzt gibnt er mir den fehlr: "Types of actual and formal var parameters must be identical"

Klaus01 13. Jun 2008 18:00

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hallo Achim,
Zitat:

Zitat von marabu
hat dein Compiler sich wirklich beschwert? Verwechselst du das nicht mit Arrays als Funktionstyp?

Ich habe es nicht so ausprobiert:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    takt,sd,ende: Integer;
    testArray1,testArray2: Array of Integer;
    test_klick: Boolean;
  public
    { Public declarations }
  end;
Es geht auch so.
Ja ich hatte da etwas im Kopf mit der Paramterübergabe von Array.
Da habe ich dann wohl etwas ganz gut durcheinander gebracht.

Für heute schweige ich dann mal, ist nicht so ganz mein Tag.

Schönen Abend noch.
Grüße
Klaus

mkinzler 13. Jun 2008 18:02

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Wenn du einen Typ für den array deklarierst hast, musst du diesen auch als Typ bei der Parameterübergabe nehmen

FAlter 13. Jun 2008 18:05

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hi,

bitte verwechsle keine dynamischen Arrays mit Open-Array-Parametern!

Delphi-Quellcode:
procedure oeffnen(ort:string;var sd_takt,sd_v,sd_ende:integer;var sd_laenges,sd_hoehes: TIntegerDynArray{array of integer};var test_klick:boolean);
Natürlich muss dann auch beim Aufrufen der Typ TIntegerDynArray verwendet werden. Er ist in der Unit Types als "array of Integer" definiert.

Steht in der Parameterliste ein array of Integer, so handelt es sich um einen Open-Array-Parameter (d. h., du kannst ein beliebiges array übergeben --> offen für alle Arrays des Typen). Allerdings ist dies dann nicht zwingend ein dynamisches array (es kann auch statisch sein), und SetLength geht dann logischerweise nicht.

Mfg
FAlter

SirThornberry 13. Jun 2008 18:12

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
die aktuelle Fehlermeldung sagt aus das du die Funktion mit falschen Parametern aufrufen willst. Zeig doch mal deinen Aufruf und den aktuellen Stand deiner Funktion.

punker-lili 13. Jun 2008 18:16

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Aber er erkennt diesen Typ nicht... "TintegerDynArray"...

mkinzler 13. Jun 2008 18:17

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Hast du Types eingebunden?

FAlter 13. Jun 2008 18:17

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Zitat:

Zitat von punker-lili
Aber er erkennt diesen Typ nicht... "TintegerDynArray"...

Hi,

ich schrieb, dass er in der Unit Types steht.

Delphi-Quellcode:
uses
  Types;
Mfg
FAlter

[edit] Der rote Kasten ist ja tatsächlich Kaputt. [/edit]

punker-lili 13. Jun 2008 18:26

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
danke jungs es klappt! ihr seit supi!!!

MfG Anna :thumb:

Luckie 13. Jun 2008 19:11

Re: Öffnen einer txt datei funktioniert als Funktion nicht
 
Und irgendwie wäre ein bißchen Fehlerbhandlung auch nicht schlecht. :?

DP-Maintenance 13. Jun 2008 22:28

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz