Autor Beitrag
Jiss
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 18.11.09 23:39 
Hallo,

ich lese aus einer Txt-Datei Zeilen mit folgendem Format aus

ausblenden Quelltext
1:
2:
JUMP1 :U    E 1.1                                                                E 1.1    EING1    Kommentar_1
JUMP2 :UN    E 1.2                                                                E 1.2    EING2    Kommentar_2


Ich lese Zeile für Zeile aus und schreibe diese in das Memo "Form_HP.Memo_Quelldatei". Dort werden die Zeilen auch vollständig angezeigt, auch mit sämtlichen Umbrüchen usw. Also genau wie in der Datei selbst.
Aus diesem Memo lese ich dann anschließend die einzelnen Zeilen mit folgendem Befehl

ausblenden Quelltext
1:
s := Form_HP.Memo_Quelldatei.Lines[zeile]					


Nun habe ich das Problem, dass wenn ich mir mal via showmessage(s) die ausgelesene Zeile angucke, dass mit immer das letzte Zeichen fehlt.
Bei der ersten Zeile also wie folgt:

ausblenden Quelltext
1:
JUMP1 :U    E 1.1                                                                E 1.1    EING1    Kommentar_					


Ich versteh nicht woher das kommt und wende mich an euch. Wäre euch sehr dankbar, wenn ihr dafür eine Lösung habt.
Kann mir nur vorstellen, dass das irgendwas mit dem Zeilenumbruch zu tun hat am Ende. habe auch schon versucht via Pos die Position von #13 oder #10 ausfindig zu machen und zu löschen, aber #13 oder auch #10 kommen laut der Funktion "Pos" nicht vor (Rückgabecode 0).

Wenn ich die erste Zeile der Variable s als Text zuweise, dann funktioniert logischerweise alles.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 19.11.09 01:36 
user profile iconJiss hat folgendes geschrieben Zum zitierten Posting springen:
Ich lese Zeile für Zeile aus und schreibe diese in das Memo "Form_HP.Memo_Quelldatei".
Hat das einen Grund, dass du nicht direkt mit Lines.LoadFromFile alles lädst? :gruebel:

Zeig doch einfach einmal mehr Quelltext, denn grundsätzlich funktioniert alles was du geschrieben hast bei mir immer problemlos. :nixweiss:
Jiss Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 19.11.09 09:50 
Ja das hat einen Grund. Ich verändere Teile der Zeilen im voraus. Das Original in der Datei soll erhalten bleiben und ich wollte keine extra Datei zur Zwischenspeicherung erstellen, wenn ich mit dem Memo dieselben Funktionen habe.

Mit folgendem Code wird die Quelldatei in Memo.Quelldatei geladen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  // Quell- und Zieldatei öffnen
  AssignFile(gl_zeiger_quelldatei,gl_pfad_quelldatei);
  Reset(gl_zeiger_quelldatei);

  // Inhalt der Quelldatei in Memo_Quelldatei laden
  Memo_Quelldatei.Clear;                            // Memo_Quelldatei leeren
  while NOT EoF(gl_zeiger_quelldatei) do
  begin
    ReadLn(gl_zeiger_quelldatei,gelesene_zeile);
    Memo_Quelldatei.Lines.Add(gelesene_zeile);
  end;
  Memo_Fokus_ruecksetzen(Memo_Quelldatei);          // Erste Zeile fokussieren
  Memo_Zieldatei.Clear;                             // Memo_Zieldatei leeren

Der Zeiger auf die Datei wird später wieder geschlossen mit CloseFile.

Im weiteren Programmcode werden die Sprungmarken, die am Anfang stehen (JUMP1, JUMP2) durch JUP1 und JUP2 ersetzt. Dabei nutze ich die ersten 2 und die letzten 2 Buchstaben der Sprungmarke. Den Programmcode dafür poste ich jetzt mal nicht, da ich die Sprungmarken zunächst in ein Stringgrid einlese, sodass der Benutzer diese noch ändern kann. Anschließend werden diese aus dem Stringgrid gelesen und an die entsprechende Stelle am Anfang der Zeile geschrieben.

ausblenden Quelltext
1:
"JUMP1 :" wird z.B. durch "JUP1  :" ersetzt. Vor dem ":"-Zeichen stehen immer 6 Buchstaben, d.h. es wird mit Leerzeichen aufgefüllt, bis 6 Zeichen vorhanden sind.					


Anschließend möchte ich sämtliche Elemente der Zeile in dynamische Stringarrays lesen.

ausblenden Quelltext
1:
JUP1  :U    E 1.1                                                                E 1.1    EING1    Kommentar 1					


So sollen die ersten Elemente des Arrays aussehen. Ich fange immer bei 1 an und nicht beim Element 0.

sprungmarken[1] = JUP1
operatoren[1] = U
signale[1] = E 1.1
abs_adress[1] = E1.1
abs_sym[1] = EING1
kommentare[1] = Kommentar 1


Gibt es vielleicht auch eine Möglichkeit mehrdimensionale dynamische Arrays zu erstellen, sodass ich nicht alle Werte in extra Arrays speichern muss?


Programmcode dafür: pcode_anfang und pcode_ende definieren die Stelle im Quelltext, an denen ausgelesen werden soll.
Der Programmcode steht dabei nur in den Zeilen pcode_anfang bis pcode_ende-1 (also bis zur vorletzten Zeile des Bereichs)
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
procedure programmcode_konvertieren(pcode_anfang,pcode_ende:integer);
var lauf_zeile, lauf_var                  : integer;
    anz_zeilen, dim_array                 : integer;
    s                                     : string;
    sprungmarken, operatoren, signale     : array of string;
    abs_adress, sym_adress, kommentare    : array of string;
begin
  // Anzahl der Zeilen des zu konvertierenden Programmcodes
  anz_zeilen := pcode_ende-pcode_anfang;
  // Array Dimension festlegen (Array's sind nullbasiert)
  dim_array  := anz_zeilen+1;

  // Dimension der dynamischen Arrays festlegen
  // Array um 1 größer, da nullbasiert
  SetLength(sprungmarken, dim_array);
  SetLength(operatoren,   dim_array);
  SetLength(signale,      dim_array);
  SetLength(abs_adress,   dim_array);
  SetLength(sym_adress,   dim_array);
  SetLength(kommentare,   dim_array);

  // Auslesen der Sprungmarken und Operationen
  // Speicherung in dynamischen Array's
  for lauf_zeile := pcode_anfang to pcode_ende-1 do
  begin
    // aktuelle Programmzeile auslesen
    s := quelle_lesen(lauf_zeile);
    showmessage('x_' + s + '_');  // HIER FEHLT IMMER DAS LETZTE ZEICHEN!!!
    // Sprungmarke herauskopieren
    sprungmarken[lauf_zeile-pcode_anfang+1] := Trim(Copy(s,1,4));
    // Teil der Sprungmarke bis zum ':' löschen
    Delete(s,1,7);
    // Operator auslesen
    operatoren[lauf_zeile-pcode_anfang+1] := '';
    while (s[1] <> ' ') do
    begin
      operatoren[lauf_zeile-pcode_anfang+1] :=
        operatoren[lauf_zeile-pcode_anfang+1] + s[1];
      Delete(s,1,1);
    end;
    // Leerzeichen bis zum Signal löschen
    while (s[1] = ' ') do
      Delete(s,1,1);
    // Signale speichern
    lauf_var := 1;
    signale[lauf_zeile-pcode_anfang+1] := '';
    while NOT ( (lauf_var > length(s)) OR
              ( (s[lauf_var] = ' ') AND (s[lauf_var+1] = ' ') ) ) do
    begin
      signale[lauf_zeile-pcode_anfang+1] := signale[lauf_zeile-pcode_anfang+1] + s[lauf_var];
      inc(lauf_var);
    end;
    // Signal löschen
    Delete(s,1,length(signale[lauf_zeile-pcode_anfang+1]));
    // Zum nächsten Schleifendurchlauf, wenn keine absolute Adressierung vorhanden
    if NOT (length(s) > 0) then Continue;
    // Leerzeichen bis zur absoluten Adressierung löschen
    while (s[1] = ' ') do
      Delete(s,1,1);
    // Absolute Adressierung auslesen
    lauf_var := 1;
    abs_adress[lauf_zeile-pcode_anfang+1] := '';
    while NOT ( (lauf_var > length(s)) OR
              ( (s[lauf_var] = ' ') AND (s[lauf_var+1] = ' ') ) ) do
    begin
      abs_adress[lauf_zeile-pcode_anfang+1] := abs_adress[lauf_zeile-pcode_anfang+1] + s[lauf_var];
      inc(lauf_var);
    end;
   // Absolute Adressierung löschen
    Delete(s,1,length(signale[lauf_zeile-pcode_anfang+1]));
    // Zum nächsten Schleifendurchlauf, wenn keine symbolische Adressierung vorhanden
    if NOT (length(s) > 0) then Continue;

    // Leerzeichen bis zur symbolischen Adressierung löschen
    while (s[1] = ' ') do
      Delete(s,1,1);
    // Symbolische Adressierung auslesen
    sym_adress[lauf_zeile-pcode_anfang+1] := '';
    while (s[1] <> ' ') do

    begin
      sym_adress[lauf_zeile-pcode_anfang+1] :=
        sym_adress[lauf_zeile-pcode_anfang+1] + s[1];
      Delete(s,1,1);
    end;
    // Zum nächsten Schleifendurchlauf, wenn keine Kommentar vorhanden
    if NOT (length(s) > 0) then Continue;
    // Leerzeichen zur Trennung von symb. Adressierung und Kommentar löschen
    while (s[1] = ' ') do
      Delete(s,1,1);
    // Kommentar auslesen
    kommentare[lauf_zeile-pcode_anfang+1] := s;

  end;






  // Arrays anzeigen
  Form_HP.StringGrid1.Cells[0,0] := 'Sprungmarken';
  Form_HP.StringGrid1.Cells[1,0] := 'Operationen';
  Form_HP.StringGrid1.Cells[2,0] := 'Signale';
  Form_HP.StringGrid1.Cells[3,0] := 'Absolute Adressierung';
  Form_HP.StringGrid1.Cells[4,0] := 'Symbolische Adressierung';
  Form_HP.StringGrid1.Cells[5,0] := 'Kommentar';

  for lauf_zeile := 1 to anz_zeilen do
  begin
    Form_HP.StringGrid1.Cells[0,lauf_zeile] := sprungmarken[lauf_zeile];
    Form_HP.StringGrid1.Cells[1,lauf_zeile] := operatoren[lauf_zeile];
    Form_HP.StringGrid1.Cells[2,lauf_zeile] := signale[lauf_zeile];
    Form_HP.StringGrid1.Cells[3,lauf_zeile] := abs_adress[lauf_zeile];
    Form_HP.StringGrid1.Cells[4,lauf_zeile] := sym_adress[lauf_zeile];
    Form_HP.StringGrid1.Cells[5,lauf_zeile] := kommentare[lauf_zeile];
  end;


  // Dynamische Arrays freigeben
  sprungmarken := nil;
  operatoren   := nil;
end;


Das Lesen einer Zeile aus dem Memo erfolgt mit der Funktion quelle_lesen[zeile]
ausblenden Quelltext
1:
2:
3:
4:
function quelle_lesen(zeile:integer):string;
begin
  result := Form_HP.Memo_Quelldatei.Lines[zeile-1];
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Jiss Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 19.11.09 19:25 
Hab den Fehler gefunden. Hatte was mit den Sprungmarken zu tun, wo ich die ganze Zeile auslese und ein Zeichen vergessen habe.