AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi wie kann ich bestimmte Infos aus Textdokument einlesen?

wie kann ich bestimmte Infos aus Textdokument einlesen?

Ein Thema von Boyington · begonnen am 21. Mai 2012 · letzter Beitrag vom 6. Jun 2012
Antwort Antwort
Seite 3 von 4     123 4   
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#21

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 5. Jun 2012, 22:13
Hallo Lee,

zu 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 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 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 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 "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
Do the best job, leave the rest in the hands of God!

Geändert von Boyington ( 5. Jun 2012 um 22:18 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#22

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 03:19
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
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 08:14
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 . 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).
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
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#24

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 11:32
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
Do the best job, leave the rest in the hands of God!

Geändert von Boyington ( 6. Jun 2012 um 12:02 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#25

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 11:46
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)
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 11:50
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.
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
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#27

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 11:52
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#28

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 11:53
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
Do the best job, leave the rest in the hands of God!
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#29

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 12:25
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#30

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 6. Jun 2012, 12:56
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:23 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