Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

Boyington 5. Jun 2012 21:13

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

Zitat von Amateurprofi (Beitrag 1169609)
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 ' ^ ').

Abend Klaus, danke für deine nette und ausführliche Erklärung!
zu 1). Da hast du recht:-D "for i:=0 to High(Dreiecke) do" soll durch "for i:=0 to Dreiecke.Count-1 do" ersetzt werden, ich hab es in "FormDestroy" schon gemacht, bin doch blöd :(

zu 2). "with hDreieck(Dreiecke[i])^ do begin" schon in Programm geschrieben, aber leider hab ich wieder Fehlermeldung bekommen: Missing Operator or semicolon

Meine Frage: es ist ganz klar, dass Dreiecke[i] ein Zeiger auf ein TDreieck ist. Aber was ist denn hDreieck(Dreiecke[i])? Also hDreieck(ein Zeiger auf ein TDreieck ) ist auch ein Zeiger auf ein TDreieck? Ich bin verwirrt.

Gruss
Lee

Amateurprofi 6. Jun 2012 02:19

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

tja, dann fehlt da vielleicht irgendwo ein Semikolon.

Ich habe das mal getestet mit nachstehender Prozedur.
Wundere dich nicht, dass die auch Test heißt. (Bei mir gibt es in jedem Projekt eine Prozedur "Test" (zum Testen, wie der Name sagt.)).

Zu
Meine Frage: es ist ganz klar, dass Dreiecke[i] ein Zeiger auf ein TDreieck ist. Aber was ist denn hDreieck(Dreiecke[i])? Also hDreieck(ein Zeiger auf ein TDreieck ) ist auch ein Zeiger auf ein TDreieck? Ich bin verwirrt.

Nein, es ist eben nicht ganz klar, dass Dreiecke[i] ein Zeiger auf ein TDreieck ist.
Das weißt du, nicht aber der Compiler, denn TList ist einfach nur eine Liste mit Pointern.
Dadurch dass du die TList "Dreiecke" nennst, wird Dreiecke[i] für den Compiler nicht zu einem Zeiger auf ein TDreieck.
Erst durch hDreieck(Dreiecke[i]) wird der Pointer zu einem Pointer auf ein TDreieck.
Und mit dem ' ^ ' dahinter 'weiß' der Compiler, dass er auf einen Record TDreieck zugreifen soll.

OT : Wenn du die Variable "Dreiecke" umbenennst in "Kirchturmuhr" wird daraus ja auch kein Zeiger einer Uhr.

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;
   hDreieck=^TDreieck;

var
   Dreiecke:TList;

PROCEDURE TMain.Test;
var i,j:integer; pDreieck:hDreieck; list:TStrings; s:string;
begin
   Dreiecke:=TList.Create;
   for i:=1 to 3 do begin
      New(pDreieck);
      pDreieck.n.x:=i*100+1;
      pDreieck.n.y:=i*100+2;
      pDreieck.n.z:=i*100+3;
      for j:=1 to 3 do begin
         pDreieck.p[j].x:=i*100+j*10+1;
         pDreieck.p[j].y:=i*100+j*10+2;
         pDreieck.p[j].z:=i*100+j*10+3;
      end;
      Dreiecke.Add(pDreieck);
   end;
   list:=TStringList.Create;
   for i:=0 to Dreiecke.Count-1 do
      with hDreieck(Dreiecke[i])^ do begin
         list.Add('n     '+
                  FloatToStr(n.x)+' '+FloatToStr(n.y)+' '+FloatToStr(n.z));
         for j:=1 to 3 do
            list.Add('p['+IntToStr(j)+'] : '+
                     FloatToStr(p[j].x)+' '+FloatToStr(p[j].y)+' '+FloatToStr(p[j].z));
         list.Add('');
      end;
   list.SaveToFile('Log.txt');
   list.Free;
   for i:=0 to Dreiecke.Count-1 do Dispose(Dreiecke[i]);
   Dreiecke.Free;
end;
Das Ergebis in Log.txt :
Code:
n     101 102 103
p[1] : 111 112 113
p[2] : 121 122 123
p[3] : 131 132 133

n     201 202 203
p[1] : 211 212 213
p[2] : 221 222 223
p[3] : 231 232 233

n     301 302 303
p[1] : 311 312 313
p[2] : 321 322 323
p[3] : 331 332 333

DeddyH 6. Jun 2012 07:14

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Der Vorteil von TList ist die Flexibilität, da sie untypisierte Pointer enthält. Der Nachteil ist ihre Flexibilität, da sie nur untypisierte Pointer enthält :mrgreen:. Um ein Mindestmaß an Typsicherheit zu erreichen, könnte man eine eigene Liste von TList ableiten, die dann nur typsierte Pointer eines bestimmten Typs verarbeitet, in aktuellen Delphi-Versionen auf eine generische Liste umsteigen, oder aus den Records Klassen machen und in einer TObjecList verwalten, dann hat man zumindest die Möglichkeit, die Einträge mittels is und as auf ihren Typ zu untersuchen (oder man leitet auch hier wieder eine spezialisierte Liste ab).

Boyington 6. Jun 2012 10:32

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Guten Tag Zusammen,
die original Ausgabe-Code (in Log.txt) von Klaus funktioniert jetzt schon (besonders "with hDreieck(Dreiecke[i])^ do begin""), hab ich gerade schon probiert, jedoch muss man hDreieck = ^TDreieck; am Anfang des Programms unter Type erklären, aber nicht innerhalb von Ausgabe-Code, also nicht innerhalb von procedure CopyDreiecke(tofile:boolean)
Delphi-Quellcode:
procedure CopyDreiecke(tofile:boolean);
var list:TStrings;

function ToStr(v:real):String;
begin
   result:=FloatToStrF(v,ffExponent,7,3)+' ';
   if result[1]<>'-' then result:=' '+result;
end;

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
            raise Exception.Create('Dreiecke ist leer.');
         //for i:=0 to High(Dreiecke) do
           for i:=0 to Dreiecke.Count-1 do
            //with Dreiecke[i] do begin
             with hDreieck(Dreiecke[i])^ do begin
               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;
Nun neue Probleme: die in Log.txt ausgegebenen/gespeicherten Koordinaten stimmen mit original Koordinaten in *.stl nicht überein, wo können die Fehler liegen?
Delphi-Quellcode:
.
.
.
PROCEDURE ReadRecord;
var i:integer;
begin
   //ReadLine(data.n);
   ReadLine(hDreieck^.n); //von mir umgeschrieben!!!
   for i:=1 to 3 do begin
      FindLine(recline,true);
      //ReadLine(data.p[i]);
      ReadLine(hDreieck^.p[i]); //von mir umgeschrieben!!!
   end;
   //SetLength(Dreiecke,Length(Dreiecke)+1);
   //Dreiecke[High(dreiecke)]:=data;
   Dreiecke.Add(hDreieck); //von mir umgeschrieben!!! Vielleicht HIER fehlt noch etwas
end;

begin
   //Dreiecke:=nil; //von mir gelöscht, sonst kriege ich "Access Violation..."
   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;
         end;
      end;
   finally
      list.free;
   end;
end;
Gruss
Lee

Amateurprofi 6. Jun 2012 10:46

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Was bedeutet "stimmen nicht überein" ?
Zeige doch mal die Original-Daten und was dann in Log.txt ankam.
(Nicht alle 10000. Nur 2 bis 3 bitte)

DeddyH 6. Jun 2012 10:50

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Welche Werte sind denn im Debugger zu sehen? Da ich weder ReadLine noch FindLine kenne, kann ich Dir auch nicht sagen, ob die korrekt arbeiten.

p80286 6. Jun 2012 10:52

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

Zitat von Boyington (Beitrag 1169666)
Nun neue Probleme: die in Log.txt ausgegebenen/gespeicherten Koordinaten stimmen mit original Koordinaten in *.stl nicht überein, wo können die Fehler liegen?

Aller Wahrscheinlichkeit nach in Deinem Programm!

Wie unterscheiden sich die Werte denn?
werden sie verschoben, wird einer ausgelassen oder wo klemmt es?

Gruß
K-H

Boyington 6. Jun 2012 10:53

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

Zitat von Amateurprofi (Beitrag 1169667)
Was bedeutet "stimmen nicht überein" ?
Zeige doch mal die Original-Daten und was dann in Log.txt ankam.
(Nicht alle 10000. Nur 2 bis 3 bitte)

original Koordinaten von *.stl Datei:
Code:
solid ascii
  facet normal 2.445222e-016 0.000000e+000 1.000000e+000
    outer loop
      vertex  -2.007874e+000 1.968504e+000 5.905512e-002
      vertex  -2.007874e+000 -1.968504e+000 5.905512e-002
      vertex  -1.574803e-001 -1.968504e+000 5.905512e-002
    endloop
  endfacet
  facet normal 2.445222e-016 -5.090141e-032 1.000000e+000
    outer loop
      vertex  -1.574803e-001 -1.968504e+000 5.905512e-002
      vertex  -1.574803e-001 1.968504e+000 5.905512e-002
      vertex  -2.007874e+000 1.968504e+000 5.905512e-002
    endloop
  endfacet
  facet normal -3.209883e-031 -1.000000e+000 2.312965e-015
    outer loop
      vertex  -2.007874e+000 -1.968504e+000 -5.905512e-002
      vertex  -3.937008e-002 -1.968504e+000 -5.905512e-002
      vertex  -1.574803e-001 -1.968504e+000 5.905512e-002
    endloop
  endfacet
  facet normal 1.476360e-016 -1.000000e+000 -3.414769e-031
    outer loop
      vertex  -1.574803e-001 -1.968504e+000 5.905512e-002
      vertex  -2.007874e+000 -1.968504e+000 5.905512e-002
      vertex  -2.007874e+000 -1.968504e+000 -5.905512e-002
    endloop
  endfacet
  facet normal 0.000000e+000 1.000000e+000 0.000000e+000
    outer loop
      vertex  -2.007874e+000 1.968504e+000 -5.905512e-002
      vertex  -2.007874e+000 1.968504e+000 5.905512e-002
      vertex  -1.574803e-001 1.968504e+000 5.905512e-002
    endloop
  endfacet
  facet normal 0.000000e+000 1.000000e+000 0.000000e+000
    outer loop
      vertex  -1.574803e-001 1.968504e+000 5.905512e-002
      vertex  -3.937008e-002 1.968504e+000 -5.905512e-002
      vertex  -2.007874e+000 1.968504e+000 -5.905512e-002
    endloop
  endfacet
  facet normal -1.000000e+000 0.000000e+000 2.312965e-015
    outer loop
      vertex  -2.007874e+000 -1.968504e+000 -5.905512e-002
      vertex  -2.007874e+000 -1.968504e+000 5.905512e-002
      vertex  -2.007874e+000 1.968504e+000 5.905512e-002
    endloop
  endfacet
  facet normal -1.000000e+000 0.000000e+000 2.312965e-015
    outer loop
      vertex  -2.007874e+000 1.968504e+000 5.905512e-002
      vertex  -2.007874e+000 1.968504e+000 -5.905512e-002
      vertex  -2.007874e+000 -1.968504e+000 -5.905512e-002
    endloop
  endfacet
  facet normal 1.387779e-016 0.000000e+000 -1.000000e+000
    outer loop
      vertex  -2.007874e+000 1.968504e+000 -5.905512e-002
      vertex  -3.937008e-002 1.968504e+000 -5.905512e-002
      vertex  -3.937008e-002 -1.968504e+000 -5.905512e-002
    endloop
  endfacet
  facet normal 1.387779e-016 0.000000e+000 -1.000000e+000
    outer loop
      vertex  -3.937008e-002 -1.968504e+000 -5.905512e-002
      vertex  -2.007874e+000 -1.968504e+000 -5.905512e-002
      vertex  -2.007874e+000 1.968504e+000 -5.905512e-002
    endloop
  endfacet
  facet normal 7.071068e-001 0.000000e+000 7.071068e-001
    outer loop
      vertex  -3.937008e-002 -1.968504e+000 -5.905512e-002
      vertex  -3.937008e-002 1.968504e+000 -5.905512e-002
      vertex  -1.574803e-001 1.968504e+000 5.905512e-002
    endloop
  endfacet
  facet normal 7.071068e-001 -1.471962e-016 7.071068e-001
    outer loop
      vertex  -1.574803e-001 1.968504e+000 5.905512e-002
      vertex  -1.574803e-001 -1.968504e+000 5.905512e-002
      vertex  -3.937008e-002 -1.968504e+000 -5.905512e-002
    endloop
  endfacet

Koordinaten von Log.txt
Code:
 1.476983E-311  0.000000E+000  0.000000E+000 
 0.000000E+000  0.000000E+000  0.000000E+000 
 0.000000E+000  0.000000E+000  0.000000E+000 
-1.473896E+000 -6.222585E-001 -1.159190E+000 

 6.281842E-312  0.000000E+000  0.000000E+000 
 0.000000E+000  0.000000E+000  0.000000E+000 
 0.000000E+000  0.000000E+000  0.000000E+000 
 3.305282E-001  2.457197E+000  1.327775E+000 

 6.773484E-311  5.330479E+228  1.591497E-312 
 1.251978E-312  5.738129E+180  2.473799E-091 
 3.699094E-057  8.242291E-072  3.272333E+179 
-1.473896E+000 -6.222585E-001 -1.159190E+000 

 5.771902E-311  1.397371E-076  1.396426E-076 
 6.530859E-038  1.398037E-076  1.200317E-071 
 1.723460E-311  3.705492E-322  6.013469E-154 
-2.337179E+000  1.018424E+000 -1.187628E+000 

 4.999496E-311  1.748032E+000 -2.062994E+000 
-1.016916E-012 -1.748032E+000 -2.062994E+000 
 1.016916E-012  1.748032E+000 -2.062993E+000 
 1.255161E+000  8.556853E-001  1.263198E+000 

 4.362897E-311  2.527831E-052  1.207374E-153 
 1.200317E-071  3.098513E-311  3.705492E-322 
 6.013469E-154  9.067593E+271  1.397371E-076 
 3.918780E-001  2.496368E+000  1.234760E+000 

 3.369803E-311  3.705492E-322  6.013469E-154 
 9.067593E+271  1.397371E-076  1.396426E-076 
 2.527831E-052  1.207374E-153  1.200317E-071 
 3.305282E-001  2.457197E+000  1.327775E+000 

 2.521004E-311  0.000000E+000  5.263544E-315 
 7.812500E-003  0.000000E+000  5.263544E-315 
 1.587352E-314 -7.812501E-003  4.388941E-120 
-2.337179E+000  1.018424E+000 -1.187628E+000 

 1.672206E-311  1.397371E-076  1.396426E-076 
 6.530859E-038  1.398037E-076  1.200317E-071 
 5.823156E-311  3.705492E-322  6.013469E-154 
-1.353527E+000 -6.853117E-001 -1.256328E+000 

 8.234078E-312  1.269314E-076  1.591497E-312 
 1.251978E-312  5.738129E+180  2.473799E-091 
 3.699094E-057  8.242291E-072  3.272333E+179 
 3.918780E-001  2.496368E+000  1.234760E+000 

 6.994172E-311  7.259042E-043  1.398037E-076 
 1.832558E-076  8.450653E-053  2.948785E+179 
 5.981315E-154  8.429613E+252  3.654820E-086 
 1.255161E+000  8.556853E-001  1.263198E+000 

 6.145373E-311  1.085864E-042  4.581108E-072 
 3.272333E+179  2.908879E-033  1.269314E-076 
 6.013470E-154  6.017568E-244  1.574079E+161 
-1.353527E+000 -6.853117E-001 -1.256328E+000

p80286 6. Jun 2012 11:25

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
 
Sieht nicht so schön aus,
wie wäre es direkt in Readline ein Protokoll der gelesenen Daten anzufertigen?

ansonsten der Debugger ist wirklich ein tolles Fehersuchundbehebewerkzeug.

Gruß
K-H

Amateurprofi 6. Jun 2012 11:56

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

Ich hab die Daten eingelesen (mit der Original-Routine aus #2) und dann in die Datei Log.txt geschrieben (mit der Original-Routine aus #5).
Die Daten stimmen 100 %ig überein.

Das läßt mich vermuten, dass durch eine deiner Vereinfachungen etwas durcheinander gebracht wurde.

Poste doch noch einmal die Typ-Deklarationen und die Routinen, mit denen du eingelesen und ausgegeben hast.

Ohne die, kann das hier niemand prüfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr.
Seite 3 von 4     123 4      

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