![]() |
DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bins wieder.
Hab ein kleines Problem. Ich hab ein speziäles Format erstellt. Nun wollte ich zu dieses Format in verschiedene Edits auslesen. Hier mal das Format:
Code:
(Die erste Zeile ist nicht vorhanden!)
#####Intra.drpqmat#######
8,16,19,22,26,27,29,34, 16,16,22,24,27,29,34,35, 19,22,26,27,29,34,35,38, 22,22,26,27,29,34,35,40, 22,26,27,29,32,35,40,48, 26,27,29,32,35,40,48,50, 26,27,29,35,40,48,50,60, 27,29,35,40,48,50,60,62
Code:
Diese Zwei Dateien sollen ausgelesen werden
#####Inter.drpqmat#######
16,20,24,28,32,36,40,44, 20,24,28,32,36,40,44,48, 24,28,32,36,40,44,48,52, 28,32,36,40,44,48,52,56, 32,36,40,44,48,52,56,58, 36,40,44,48,52,56,58,60, 40,44,48,52,56,58,60,62, 44,48,52,56,58,60,62,62 und jede Zahl kommt in eine andere Edit. Beim speichern sollte dann wieder das Format ausgegeben werden. So sieht der Teil des Programms aus: ![]() Die Edits sind wie folgt nummerriert: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 57 58 59 60 61 62 63 64 und 65 66 67 68 69 70 71 72 ... 121 122 123 124 125 126 127 128 Eigentlich müsste es simple sein, ich aber hab schon geschlagene 3 Stunden mit dem Problem gekämpft. Könnte mir einer von Euch erklären, wie ich das hinbekomme? Danke schon mal. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
![]() |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
bzw. Erstell die Edit's dynamisch.
Delphi-Quellcode:
Und dann sollte das Lesen mittels
type
TForm = ... private aM1 : array [0..?, 0..?] of TEdit; ... end; FormCreate begin for y := 0 to ? do for x := 0 to ? do begin fTmp := TEdit.Create(Self); fTmp.Parent := Self; fTmp.SetBounds( ??? ); aM1[x, y] := fTmp; end; end; GetLine <- Muss selbst geschrieben werden SplitLine <- Muss selbst geschrieben werden in einer geschachtelte For to do lösbar sein. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Hi,
erst mal tief durchathmen. Ich weiß ja nicht, wie viel du weißt. Du könntest z. B. die Dateien zuerst in ein TStringList laden und anschließend aus dieser, Zeile für Zeile, die Zahlen auslesen.
Delphi-Quellcode:
Zum Auslesen verwendest du am Besten "AnsiPos" und ermittelst damit die einzelnen Zahlen. Anschließend löscht du mit "Delete" den bereits eingelesenen Wert aus der aktuellen Zeile, damit du "AnsiPos" für die nächste Zahl verwenden kannst. Das ganze muss auch noch in einer Schleife für jede Zeile geschehen.
var
myList: TStringList; begin myList := TStringList.Create; try myList.LoadFormFile('Dateiname'); // Zeilen auslesen finally myList.Free; end; end; Übrigens kannst du mit [] auf die einzelnen Zeilen zugreifen z. B. myList[0] für die erste Zeile. Allerdings versuchts du dein Problem sehr umständlich zu lösen, lass es doch erst gar nicht so weit kommen und verwende die Komponente TStringGrid. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Die Edits sind ja steigend nummeriert.
Kann man nicht irgendwie Zeichen 1 ist Edit1, Zeichen 3 ist Edit2, Zeichen 5 ist Edit 3 etc. lesen und Edit1 ist Zeichen 1 + ',', Edit2 ist Zeichen 3 +',', Edit 3 ist Zeichen 5 + ',' etc schreiben? |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Suche mal in der OH nach
![]() Das löschen des zuvor gefundenen Teilstrings ist doch vollkomen unnötig. Du lädst dir die Datei in eine ![]() Pro Zeile suchst du dir mit PosEx das ',' und gibst dem 3. Parameter die zuvor gefundene Position. Wenn du für jeden gefundenen Wert eine numerische Variable hochzählst, hast du gleich den Name des Edits. Mit ![]() ![]() Den vorherigen Absatz kannst du dir aber sparen indem du ein ![]() |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Liste der Anhänge anzeigen (Anzahl: 1)
Stringgrid ... :wall:
Ich hab mal das Project mit zwei Stringgrids ausgestattet. Nur kann ich da überhaupt nichts editieren gar was in die Zellen schreiben. Vieleicht könntest Du mir ein Beispiel erstellen, damit ich weis, wie ich es umsetzen könnte. Denke so an ein Project mit dieser abgespeckten DRPQMAT:
Code:
Die dann wie auch immer eingelesen wird.
1,2,
3,4 Ich werde mir morgen die Tips und Links aus deinem letzen Post anschauen und sehen ob ichs auf die Reihe bekomme. Hier noch mal das Project mit Stringgrids. (Hatte ich auch zuerst im Sinn, konnte aber wie gesagt doch nichts damit anfangen...) Gute Nacht Euch allen. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Liste der Anhänge anzeigen (Anzahl: 1)
Das mit dem Speichern hab ich gelöst. Nun fehlt mir noch das Laden...
Mit diesem Code bekomm ich alle in eine Zeile ohne den , und Leerzeichen.
Delphi-Quellcode:
Nun müsste es doch einfacher sein die einzelnen Zeichen den Edit zuzuordnen.
(Trim(StringReplace(form1.ListInter.Items.Text, #13#10, '', [rfReplaceAll]))
Zeichen1:=Edit1.text; Zeichen2:=Edit2.text; ... Zeichen64:=Edit64.text; Die Frage ist noch wie... |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Liste der Anhänge anzeigen (Anzahl: 1)
Editieren der Werte im Grid ist doch easy!
Schau dir mal die Options des StringGrids im OI an. Da wirst du über goEditing & goAlwaysShowEditor stolpern. Das sind genau die Optionen, die dich interessieren. Hier noch ein wenig code, der dir Laden & Speichern im Grid zeigen soll.
Delphi-Quellcode:
Procedure load_Grid(Grid: TStringGrid);
Var X, Y, ActPos, PrevPos : Integer; sl : TStrings; Begin If Not OpenDialog1.Execute Then Exit; sl := TStringList.Create; Try // Öffne Datei in StringList sl.LoadFromFile(OpenDialog1.FileName); // laufe durch die sl For Y := 0 To pred(sl.Count) Do Begin // Spalte 0 X := 0; PrevPos := 1; // suche das erste "," ActPos := PosEx(',', Sl[Y], PrevPos); // verlasse die Schleife wenn kein "," mehr gefunden wurde While ActPos > 0 Do Begin // schreibe in die Zelle den Text zwischen dem vorherigen "," und dem gefundenen "," Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, (ActPos - PrevPos)); // Postion des letzten Kommas PrevPos := succ(ActPos); // suche das nächste "," ActPos := PosEx(',', Sl[Y], PrevPos); inc(X); End; // zum Schluss noch den Text ab dem zuletzt gefundenen Komma in die Zelle Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, Length(sl[Y])); End; Finally // Freigeben der sl FreeAndNil(SL); End; End; Procedure save_Grid(Grid: TStringGrid); Var X, Y : Integer; sl : TStrings; TempStr : String; Begin If Not SaveDialog1.Execute Then Exit; sl := TStringList.Create; Try With Grid Do For Y := 0 To pred(Grid.RowCount) Do Begin // Leeren des TempStr vor jeder Zeile TempStr := ''; For X := 0 To pred(Grid.ColCount) Do TempStr := TempStr + Trim(Cells[X, Y]) + ','; // Hinzufügen von TempStr zur sl // in der letzten Zeile muss das letzte Komma abgeschnitten werden If Y = pred(Grid.RowCount) Then sl.Add(Copy(TempStr, 1, Length(TempStr) - 1)) Else sl.Add(TempStr); End; // Speichern der StringList sl.SaveToFile(SaveDialog1.FileName); Finally // Freigeben der sl FreeAndNil(SL); End; End; |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Delphi-Quellcode:
Erzeugt eine Edit mit folgendem Inhalt:
if not OpenDialog1.execute then Exit;
Listintrain.Items.LoadFromFile(OpenDialog1.FileName); Edit129.text:=(Trim(StringReplace(Listintrain.Items.Text, #13, '', [rfReplaceAll]))) ; 1,2,3,4,5,6,...,64 Nun müsste ich die einzelnen Zahlen vor jedem , in eine Edit schreiben können. Muss mir mal PosEx näher anschauen... |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
@ Robert_G: Schönes Foto!
Hab aber bei mir noch ein paar Probleme Deinen Code einzubauen. Er meckert bei PosEx und Grind. Hier ist mein Ansatz, denke aber, dass diese komplett falsch ist:
Delphi-Quellcode:
unit MatGrind;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls; type TForm1 = class(TForm) StringGrid1: TStringGrid; GroupBox1: TGroupBox; GroupBox2: TGroupBox; StringGrid2: TStringGrid; Button1: TButton; Button2: TButton; Button3: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); Var X, Y, ActPos, PrevPos : Integer; sl : TStrings; Begin If Not OpenDialog1.Execute Then Exit; sl := TStringList.Create; Try // Öffne Datei in StringList sl.LoadFromFile(OpenDialog1.FileName); // laufe durch die sl For Y := 0 To pred(sl.Count) Do Begin // Spalte 0 X := 0; PrevPos := 1; // suche das erste "," ActPos := PosEx(',', Sl[Y], PrevPos); // verlasse die Schleife wenn kein "," mehr gefunden wurde While ActPos > 0 Do Begin // schreibe in die Zelle den Text zwischen dem vorherigen "," und dem gefundenen "," Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, (ActPos - PrevPos)); // Postion des letzten Kommas PrevPos := succ(ActPos); // suche das nächste "," ActPos := PosEx(',', Sl[Y], PrevPos); inc(X); End; // zum Schluss noch den Text ab dem zuletzt gefundenen Komma in die Zelle Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, Length(sl[Y])); End; Finally // Freigeben der sl FreeAndNil(SL); End; End; procedure TForm1.Button2Click(Sender: TObject); Var X, Y : Integer; sl : TStrings; TempStr : String; Begin If Not SaveDialog1.Execute Then Exit; sl := TStringList.Create; Try With Grid Do For Y := 0 To pred(Grid.RowCount) Do Begin // Leeren des TempStr vor jeder Zeile TempStr := ''; For X := 0 To pred(Grid.ColCount) Do TempStr := TempStr + Trim(Cells[X, Y]) + ','; // Hinzufügen von TempStr zur sl // in der letzten Zeile muss das letzte Komma abgeschnitten werden If Y = pred(Grid.RowCount) Then sl.Add(Copy(TempStr, 1, Length(TempStr) - 1)) Else sl.Add(TempStr); End; // Speichern der StringList sl.SaveToFile(SaveDialog1.FileName); Finally // Freigeben der sl FreeAndNil(SL); End; End; end. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Zitat:
|
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Werd ich machen ...
|
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Code:
Das hab ich gefunden. Nur wenn ich Deinen Code einbinde meckert Delphi wegen dem OpenDialog1. Wieso eigentlich?
Returns the index value of a substring.
Unit StrUtils Category string handling routines Delphi syntax: function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; C++ syntax: extern PACKAGE int __fastcall PosEx(const AnsiString SubStr, const AnsiString S, unsigned Offset = 1); Description PosEx returns the index of SubStr in S, beginning the search at Offset. If Offset is 1 (default), PosEx is equivalent to Pos. PosEx returns 0 if SubStr is not found, if Offset is greater than the length of S, or if Offset is less than 1. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Delphi-Quellcode:
Nun hab ich zwar keinen Fehler mehr, aber die Function ist ohne Function... Desweiteren musste ich die Load und Savefunctionen ausschalten. Irgendwie bekomme ich die Produce load/save_Grind nicht in mein Brain.
procedure TForm1.Button3Click(Sender: TObject);
begin Close; end; procedure TForm1.Button1Click(Sender: TObject); begin If Not OpenDialog1.Execute Then Exit; end; procedure TForm1.Button2Click(Sender: TObject); begin If Not SaveDialog1.Execute Then Exit; end; function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; begin // end; Procedure load_Grid(Grid: TStringGrid); Var X, Y, ActPos, PrevPos : Integer; sl : TStrings; Begin //If Not OpenDialog1.Execute Then Exit; sl := TStringList.Create; Try // Öffne Datei in StringList //sl.LoadFromFile(OpenDialog1.FileName); // laufe durch die sl For Y := 0 To pred(sl.Count) Do Begin // Spalte 0 X := 0; PrevPos := 1; // suche das erste "," ActPos := PosEx(',', Sl[Y], PrevPos); // verlasse die Schleife wenn kein "," mehr gefunden wurde While ActPos > 0 Do Begin // schreibe in die Zelle den Text zwischen dem vorherigen "," und dem gefundenen "," Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, (ActPos - PrevPos)); // Postion des letzten Kommas PrevPos := succ(ActPos); // suche das nächste "," ActPos := PosEx(',', Sl[Y], PrevPos); inc(X); End; // zum Schluss noch den Text ab dem zuletzt gefundenen Komma in die Zelle Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, Length(sl[Y])); End; Finally // Freigeben der sl FreeAndNil(SL); End; End; Procedure save_Grid(Grid: TStringGrid); Var X, Y : Integer; sl : TStrings; TempStr : String; Begin //If Not SaveDialog1.Execute Then Exit; sl := TStringList.Create; Try With Grid Do For Y := 0 To pred(Grid.RowCount) Do Begin // Leeren des TempStr vor jeder Zeile TempStr := ''; For X := 0 To pred(Grid.ColCount) Do TempStr := TempStr + Trim(Cells[X, Y]) + ','; // Hinzufügen von TempStr zur sl // in der letzten Zeile muss das letzte Komma abgeschnitten werden If Y = pred(Grid.RowCount) Then sl.Add(Copy(TempStr, 1, Length(TempStr) - 1)) Else sl.Add(TempStr); End; // Speichern der StringList //sl.SaveToFile(SaveDialog1.FileName); Finally // Freigeben der sl FreeAndNil(SL); End; End; end. Kannst Du mir ein Bespiel posten? |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Delphi-Quellcode:
Die komplette Function hab ich jetzt gefunden. Nur wie bring ich load/save_Grind die Open/Save Dialoge bei?
function PosEx(Substr: string; S: string; P: Integer): Integer;
begin if P <= 0 then Result := 0 else Result := Pos(Substr, Copy(S, P, Length(S))); if Result <> 0 then Result := Result + P - 1; end; |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Indem du sie einfach auf's Form ziehst.
|
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Liste der Anhänge anzeigen (Anzahl: 1)
K, nochmal von vorne.
So bin ich vorgegangen: Neue Application erstellt. Zwei groupboxes mit titel 'Intra Matrix:' und 'Inter Matrix:' erstellt. Dort hinein jeweils eine StringGrind. Fünf Buttons erstellt. Auf jeden doppelgeklickt. Zwei Open und zwei SaveDialoge auf die Form geklatscht. Diese mit den Save und Load Buttons verknüpft. Die anderen mit // dummies ausgestattet. PosEx Function in den Quellcode kopiert. Deinen Quellcode hineinkopiert. Resultat: Findet die Save und Load Dialoge nicht. Wenn ich die jeweiligen Zeilen in Deinem Code deactiviere kann ichs compilen. Kannst Du mir nun sagen, wo ich was falschgemacht habe? Weil irgendwie tut das ganze :wall: schon weh... |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Kannst du .rar oder .zip archive anhängen? Ich kriege von selbstentpackenden immer Ausschlag. :?
|
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Liste der Anhänge anzeigen (Anzahl: 1)
Du brauchst nur einen SaveDialg & einen OpenDialog!
Ich habe sie bei mir einfach SaveDialog1 & OpenDialog1 genannt, du kannst doch den Code soweit anpassen, oder nicht? Edit: ich habe dir das Projekt angehängt. Falls du dich mit den beiden Dialogen nicht auskennst, schau dir mal im OI die Einstellungen Filter, FilterIndex & DefaultExt an (natürlich auch in der OH :wink: ). Schaden kann's nix... |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Liste der Anhänge anzeigen (Anzahl: 1)
OK, wenns Dir lieber ist. Ich hab nochmal das gemacht, was ich Dir beschrieben hatte.
Gleiche Resultat. Ergo hab ich Deinen Code komplett mit {} deaktiviert. Schaus Dir an. Ich währe Dir sehr dankbar. P.S. komme auch aus München... [Edit] Gleiches Problem, auch wenn ich nur einen Open und SaveDialog einbaue. Schau Dir meine Source an und sag mir, was ich falsch gemacht habe. ggf. pack Deine Source in ein rar und hänge sie bei Deinem nächsten Post mit an. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Dank Dir. Das mit den Dialogen DefaultEx usw. hab ich drauf. Nun muss ich dein Project nachbauen. Will ja auch was dazu lernen.
K, was ich gefunden hab ist, dass Du was in die Private Declarations getextest hast. Dies hab ich zum beispiel nicht drin. Ich sag Dir bescheid, wenn ichs habe. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Ich habe es gerade gesehen... :oops:
Ic hatte deinen Code vorher nur kurz überflogen, der Bug war ganz einfach: es waren keine Methoden von dem Form! Sie konnten deshalb die Dialoge nicht kennen. |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Manchmal sind es die kleinen Dinge die Einen nerven können...
Delphi-Quellcode:
Procedure Form1.save_Grid(Grid: TStringGrid);
Var X, Y : Integer; sl : TStrings; TempStr : String;
Delphi-Quellcode:
Findet hier einer den Fehler? :shock:
Procedure TForm1.save_Grid(Grid: TStringGrid);
Var X, Y : Integer; sl : TStrings; TempStr : String; Robert_G ich dank Dir nochmal für Deine Hilfe :cheers: |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Im oberen fehlt das "T" -> Es muss doch als Methode einer Klasse deklariert werden nicht einer Variable.
|
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Das war doch nur Spass! Ich weis doch das das T fehlt. Das wars ja auch, was nicht bei mir funktionierte.
Also bis dann... :cheers: |
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
:mrgreen:
|
Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
Hallo,
ich bin hier zwar nur Quereinsteiger/Querleser, aber
Code:
sollte der Vollständigkeit halber SL nicht vom Typ TStringList sein?
Var
X, Y : Integer; sl : [b][color=red]TStrings[/color][/b]; TempStr : String; Begin //If Not SaveDialog1.Execute Then Exit; sl := [b][color=red]TStringList[/color][/b].Create; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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