Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi wie kann ich bestimmte Infos aus Textdokument einlesen? (https://www.delphipraxis.net/168443-wie-kann-ich-bestimmte-infos-aus-textdokument-einlesen.html)

Amateurprofi 29. Mai 2012 16:54

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Hallo Lee,

natürlich kriegst du eine Fehlermeldung, wenn du in einer Form namens "Form1" eine Prozedur hast, die "TMain.Test" heißt.

Benenne sie um in TForm1.Test oder nenne sie TForm1.Button2Click und alles wird gut.

Zur Access Violation.
Na klar kommt die.

Du hast das ja alles so schön vereinfacht und die Funktionen, die ursprünglich innerhalb von "Test" lagen, ausgelagert.

Dann hast du warscheinlich eine Fehlermeldung "list unbekannt" oder so erhalten und zur Abhilfe in den ausgelagerten Funktionen list noch einmal deklariert.
So funktioniert das halt nicht.

Mein Tipp:
Höre auf mit deinen Verschlimmbesserungen.
Nimm die Prozedur "TMain.Test", benenne sie um in "TForm1.Button2Click", und dann wird das funktionieren.

Boyington 31. Mai 2012 20:19

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Zitat:

Zitat von Amateurprofi (Beitrag 1168602)
Hallo Lee,

natürlich kriegst du eine Fehlermeldung, wenn du in einer Form namens "Form1" eine Prozedur hast, die "TMain.Test" heißt.

Benenne sie um in TForm1.Test oder nenne sie TForm1.Button2Click und alles wird gut.

Zur Access Violation.
Na klar kommt die.

Du hast das ja alles so schön vereinfacht und die Funktionen, die ursprünglich innerhalb von "Test" lagen, ausgelagert.

Dann hast du warscheinlich eine Fehlermeldung "list unbekannt" oder so erhalten und zur Abhilfe in den ausgelagerten Funktionen list noch einmal deklariert.
So funktioniert das halt nicht.

Mein Tipp:
Höre auf mit deinen Verschlimmbesserungen.
Nimm die Prozedur "TMain.Test", benenne sie um in "TForm1.Button2Click", und dann wird das funktionieren.

Guten Abend Klaus,
heute funktioniert nicht nur dein original Programm bei mir perfekt, sondern auch meine eigne "Verschlimmbessserung" 8-)

Nochmals vielen Dank für deine nette Hilfe!

Gruss
Lee

Boyington 2. Jun 2012 08:15

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Guten Morgen alle,
ich hab wieder ne Frage:
wie kann ich eine dynamische Array (hier z.B Dreiecke: array of TDreieck) in TList umwandeln?
Also alle gerade eingelesenen Koordinaten sollen in TList gespeichert werden, damit kann ich später eine vorhandene Funktion (z.B function Abstand(var MinAbstand: real; Messpos, Blick: TVektor; hList: TList): integer; ) verwenden.

Danke dafür!

Gruss
Lee

Bummi 2. Jun 2012 10:46

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Die Optionen hängen etwas von Deiner Delphiversion ab, ab 2009 kannst Du Records in Listen verwenden, vorher Klassen in TList oder TObjectList...
Delphi-Quellcode:

uses
  ......,Generics.Collections,Contnrs;

type
   TVektor = record
     x, y, z: real;
   end;
   TDreieck = record
     n: TVektor; // n ist Normalvektor
     p: array[1..3] of TVektor; //p hat Koordinaten von 3 Eckpunkten
   end;

   TDreieckOld = Class
     n: TVektor; // n ist Normalvektor
     p: array[1..3] of TVektor; //p hat Koordinaten von 3 Eckpunkten
   end;

  TDreieckListNew=TList<TDreieck>;
  TDreieckListOld=TObjectList;

Boyington 2. Jun 2012 15:39

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Zitat:

Zitat von Bummi (Beitrag 1169178)
Die Optionen hängen etwas von Deiner Delphiversion ab, ab 2009 kannst Du Records in Listen verwenden, vorher Klassen in TList oder TObjectList...
Delphi-Quellcode:

uses
  ......,Generics.Collections,Contnrs;

type
   TVektor = record
     x, y, z: real;
   end;
   TDreieck = record
     n: TVektor; // n ist Normalvektor
     p: array[1..3] of TVektor; //p hat Koordinaten von 3 Eckpunkten
   end;

   TDreieckOld = Class
     n: TVektor; // n ist Normalvektor
     p: array[1..3] of TVektor; //p hat Koordinaten von 3 Eckpunkten
   end;

  TDreieckListNew=TList<TDreieck>;
  TDreieckListOld=TObjectList;

danke für die Antwort, Bummi:)
Aber ich verwende und besitze im Moment nur Delphi7, wie kann ich dynamischen Array mit so alter Delphiversion in TList einfach umwandeln?

Gruss
Lee

Bummi 2. Jun 2012 16:03

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  TVektor = record
    x, y, z: real;
  end;
  TDreieck = Class
    n: TVektor; // n ist Normalvektor
    p: array[1..3] of TVektor; //p hat Koordinaten von 3 Eckpunkten
  end;

  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FList:TList;
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
 i:Integer;
 d:TDreieck;
begin
    FList:=TList.Create;
    for I := 0 to 10 do
       begin
          d :=TDreieck.Create;
          d.n.x := Random(100);
          d.n.y := i;
          FList.Add(d);
       end;
    Showmessage(FloatToStr(TDreieck(Flist[5]).n.y));
    for I := Flist.Count-1 to 0 do TDreieck(Flist[i]).Free;
    FList.Free;

end;

end.

Boyington 4. Jun 2012 23:08

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Guten Abend Leute und danke für die Codes, Bummi.
Um Parameter "Dreiecke" (array of TDreieck) von dynamischem Array in Typ von "TList" umzuwandeln, habe ich original code von Klaus wie folgendes umgeschrieben:

Delphi-Quellcode:
type
   TVektor = record
     x, y, z: real;
   end;
   TDreieck = record
     n: TVektor; // n ist Normalvektor
     p: array[1..3] of TVektor; //p hat Koordinaten von 3 Eckpunkten
   end;
Var
   hDreieck:^TDreieck; //von mir zugefügt!!!
   //Dreiecke:Array of TDreieck;
   Dreiecke: TList; //von mir zugefügt!!!

PROCEDURE TMain.Test;
const
   recstart='facet normal';
   recline='vertex';
var list:TStrings; line:integer; data:TDreieck;

FUNCTION FindLine(const s:string; raiseerr:boolean):boolean;
begin
   while (line<list.count) and (Copy(Trim(list[line]),1,Length(s))<>s) do inc(line);
   if line<list.count then result:=true
      else if not raiseerr then result:=false
         else raise Exception.Create(s+' nicht gefunden.');
end;

FUNCTION ReadNumber(const s:string; var i:integer):real;
var j:integer;
begin
   j:=i;
   while s[j]<>' ' do dec(j);
   result:=StrToFloat(Copy(s,j+1,i-j));
   while s[j]=' ' do dec(j);
   i:=j;
end;

PROCEDURE ReadLine(var v:TVektor);
var s:string; i:integer;
begin
   s:=Trim(list[line]);
   i:=Length(s);
   v.z:=ReadNumber(s,i);
   v.y:=ReadNumber(s,i);
   v.x:=ReadNumber(s,i);
   inc(line);
end;

PROCEDURE ReadRecord;
var i:integer;
begin
   //ReadLine(data.n);
   ReadLine(hDreieck^.n); //von mir zugefügt!!!
   for i:=1 to 3 do begin
      FindLine(recline,true);
      //ReadLine(data.p[i]);
      ReadLine(hDreieck^.p[i]); //von mir zugefügt!!!
   end;
   //SetLength(Dreiecke,Length(Dreiecke)+1);
   //Dreiecke[High(dreiecke)]:=data;
   Dreiecke.Add(hDreieck); //von mir zugefügt!!!
end;

// var f:TextFile; i,j:integer; // nur zur Kontrolle benutzt
begin
   //Dreiecke:=nil; //von mir gelöscht
   list:=TStringList.Create;
   try
      try
         list.text:=Clipboard.AsText;
         // oder List.LoadFromFile('Filename');
         line:=0;
         while FindLine(recstart,false) do ReadRecord;
      except
         On E:Exception do begin
            ShowMessage(E.Message);
            //Dreiecke:=nil; //von mir gelöscht
         end;
      end;
   finally
      list.free;
   end;
end;
Ich bin nicht sicher, ob das Programm richtig ist, und evtl. s.g "Memory Leaks" vorhanden ist, weil the Codes der Ausgabe in Log.txt ich noch nicht umgeschrieben habe und auch nicht probieren kann.

Ich bin sehr dankbar für weitere Hilfe und nützliche Hinweise:)

Gruss
Lee

Amateurprofi 5. Jun 2012 00:36

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Hallo Lee,
hast du schon mal probiert, das laufen zu lassen ?

Ich würde mal vermuten, dass in der Zeile
Delphi-Quellcode:
v.z:=ReadNumber(s,i);
in der Prozedur ReadLine eine Exception (Access Violation) kommt.

Warum?:
hDreieck ist ein Zeiger auf TDreieck und er ist = Nil, zeigt also ins Nichts.
Ins "Nichts" kannst du aber keine Daten schreiben.
Abhilfe:
Delphi-Quellcode:
New(hDreieck)
als erste Zeile in die Prozedur ReadRecord einfügen.

Dann wirst du in der Zeile
Delphi-Quellcode:
Dreiecke.Add(hDreieck);
in der Prozedur ReadRecord eine Exception Exception (Access Violation) kriegen.
Warum?!
Die TList Dreiecke existiert noch nicht.
Abhilfe:
Delphi-Quellcode:
Dreiecke:=TList.Create
als erste Zeile in der Prozedur Test einfügen.

Und wenn du dann irgendwann Dreiecke nicht mehr brauchst musst du erstens für alle Einträge in Dreiecke ein Dispose machen und anschließend ein Dreiecke.Free.

Letzteres solltest auch im except Block in Test machen.

Alternativ kannst du es so machen, wie Bummi es vorschlug.

Boyington 5. Jun 2012 10:40

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Danke dafür, Klaus!
Ich hab gerade das Programm wieder korrigiert, und die Compile scheint in Ordnung zu sein, aber ohne Ausgabe in Log.txt kann ich nun leider nicht überprüfen, ob das Ergebnis richtig ist.

Memory freemachen (am Anfang des Programms unter Type "procedure FormDestroy(Sender: TObject);" zugefügt):
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
var hDreieck:^TDreieck;
    i:integer;
begin
  for i:= 0 to Dreiecke.Count-1 do
  begin
    hDreieck:=Dreiecke[i];
    Dispose(hDreieck);
  end;
  Dreiecke.Free;
end;

Die original Ausgabe-Code von dir hab ich auch umgeschrieben:
Delphi-Quellcode:
procedure AddVector(const v:TVektor);
type TxVector=Array[0..2] of real;
var s:string; i:integer;
begin
   for i:=0 to High(TxVector) do s:=s+ToStr(TxVector(v)[i]);
   list.Add(s);
end;

var i,j:integer;
begin
   list:=TStringList.Create;
   try
      try
         //if Length(Dreiecke)=0 then
         if Dreiecke.count=0 then //von mir umgeschrieben
            raise Exception.Create('Dreiecke ist leer.');
         //for i:=0 to High(Dreiecke) do //wie ist entsprechende Code für TList???
            //with Dreiecke[i] do begin //record,objetc or class type required
               AddVector(n);
               for j:=Low(p) to High(p) do AddVector(p[j]);
               list.Add('');
            end;
         if tofile then list.SaveToFile(ExtractFilePath(ParamStr(0))+'Log.txt');
            //else Clipboard.AsText:=List.Text;
         ShowMessage('fertig.');
      except
         On E:Exception do ShowMessage(E.Message);
      end;
   finally
      list.free;
   end;
end;

Amateurprofi 5. Jun 2012 17:57

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Hallo Lee,

zu
Delphi-Quellcode:
for i:=0 to High(Dreiecke) do //wie ist entsprechende Code für TList???

Ich bin sicher, dass du das auch ohne Hilfe herausbekommst.
Schau doch mal, wie du das in deinem "FormDestroy" machst.


Zu
Delphi-Quellcode:
with Dreiecke[i] do begin //record,objetc or class type required

Die Fehlermeldung sagt doch was fehlt.
Erwartet wird ein Rekord-, Objekt- oder Klassentyp, Dreiecke[i] ist keines davon sondern ein Zeiger auf ein TDreieck. Wenn ich das richtig sehe, ist das dem Compiler aber nicht bekannt, für den ist Dreiecke[i] nur ein Zeiger auf einen Speicherbereich.
Wenn du schreibst with
Delphi-Quellcode:
hDreieck(Dreiecke[i]) do begin
dann weiß er zumindest, dass es sich um einen Zeiger auf ein TDreieck handelt, was aber das Problem nicht heilt, denn es wird ja ein Rekord-, Objekt- oder Klassentyp erwartet.
Mit
Delphi-Quellcode:
with hDreieck(Dreiecke[i])^ do begin
sollte es funktionieren (Beachte das ' ^ ').


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