![]() |
Text aus Textdatei in TEDIT auslesen und wieder speichern
Hallo
Ich komme einfach nicht weiter. ich möchte Text aus bestimmten Bereichen einer Textdatei auslesen und in Edit's anzeigen und auch wieder speichern. Das Auslesen und das Speichern klappt nicht ganz weil in dem ausgelesen Text ein Komma vorkommt. So sieht die Textdatei aus define('TEXT_MAINA', 'Test1, Test A, Test AB, <>,0'); define('TEXT_MAINB', 'Test2 , Test B, Test BA," ", 1'); Der gesuchte Text wäre dann: Code: Test1, Test A, Test AB, <>,0 Test2 , Test B, Test BA," ", 1 Hier der Sourcecode (Danke an s-off)
Delphi-Quellcode:
***** Einen String von bis extrahieren
function TForm1.ExtractString(sSource, sStart, sStop: string; a: Integer): string; var SubStr, bck: string; Pos1, Pos2, i: Integer; begin i := 0; while i < a do begin Pos1 := Pos(sStart, sSource); Pos2 := Pos(sStop, sSource); SubStr := Copy(sSource, Pos1 + Length(sStart), Pos2 - Pos1 - Length(sStart)); Delete(sSource, Pos1, Pos2 - Pos1 + Length(sStop)); if SubStr = '' then {nothing} else if bck = '' then bck := SubStr else bck := bck + #13#10 + SubStr; i := i + 1; end; Result := bck; end; function TForm1.WhatsInBrackets(sString: string): string; begin Result := ExtractString(sString, '(', ')', 1); end; //Einen String parsen function TForm1.ParseString(sTrenner, sString: string; iCount: Integer): string; var i: Integer; sErgebnis: string; begin Result := ''; if Length(sString) > 0 then begin if sString[Length(sString)] <> sTrenner then begin sString := sString + sTrenner; end; for i := 1 to iCount do begin sErgebnis := Copy(sString, 0, Pos(LowerCase(sTrenner), LowerCase(sString)) - 1); //showmessage(sErgebnis); sString := Copy(sString, Pos(LowerCase(sTrenner), LowerCase(sString)) + 1, Length(sString)); end; Result := sErgebnis; end; end;
Delphi-Quellcode:
//Auslesen
Code: procedure TForm1.Button1Click(Sender: TObject); var i: integer; sEditBox: string; sText: string; comp: TComponent; begin memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName) + 'daten.txt'); for i := 0 to memo1.Lines.Count do begin if Pos('define', LowerCase(memo1.Lines.Strings[i])) > 0 then begin sEditBox := ParseString(',', WhatsInBrackets(memo1.Lines.Strings[i]), 1); sText := Trim(ParseString(',', WhatsInBrackets(memo1.Lines.Strings[i]), 2)); end else Continue; comp := FindComponent(StringReplace(sEditBox, #039, '', [rfReplaceAll])); if comp <> nil then begin TEdit(comp).Text := (StringReplace(sText, #039, '', [rfReplaceAll])); SetLength(aOldData, Length(aOldData) + 1); //Länge des Arrays um eins erhöhen aOldData[Length(aOldData) - 1] := TEdit(comp).Name + ',' + TEdit(comp).Text; //Namen des Edits und alten Text speichern end; end; end;
Delphi-Quellcode:
Ich hoffe es kann mir jemand helfen.
// Speichern
Code: procedure TForm1.Button2Click(Sender: TObject); var i: Integer; j: Integer; EditText: String; Edit: TComponent; begin for i := 0 to Length(aOldData) - 1 do begin //für alle Edits Edit := FindComponent(ParseString(',', aOldData[i], 1)); //Finde Edit EditText := ParseString(',', aOldData[i], 2); //wie ist der alte Text des Edits for j := 0 to memo1.Lines.Count - 1 do begin //alle Zeilen des Memos durchgehen, so lange bis if (Pos(Edit.Name, memo1.Lines.Strings[j]) > 0) and //der Editname gefunden wurde und (Pos(EditText, memo1.Lines.Strings[j]) > 0) then begin //der alte Text gefunden wurde memo1.Lines.Strings[j] := StringReplace(memo1.Lines.Strings[j], EditText, TEdit(Edit).Text, [rfIgnoreCase]); //dann den alten Text durch den neuen ersetzen aOldData[i] := TEdit(Edit).Name + ',' + TEdit(Edit).Text; //die alten Daten im Array aktualisieren Break; //und mit der nächsten Schleife fortfahren end; end; end; memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'daten.txt'); //Memo in Datei speichern end; Grüsse Mirco |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Hallo Mirco,
deine beispielhaften Datenzeilen könnte man auch so auslesen:
Delphi-Quellcode:
Wenn das Speicherformat von dir frei gewählt werden kann, dann solltest du das INI-Format in Erwägung ziehen. Der Code vereinfacht sich dann noch weiter.
uses
StrUtils; procedure TDemoForm.LoadButtonClick(Sender: TObject); const S_DEF = 'define('; var i: Integer; line, sName, sText: String; pc: PChar; c: TComponent; begin with Memo do for i := 0 to Pred(Lines.Count) do begin line := Lines[i]; if AnsiStartsText(S_DEF, line) then begin pc := PChar(line); Inc(pc, Length(S_DEF)); sName := AnsiExtractQuotedStr(pc, ''''); c := self.FindComponent(sName); if Assigned(c) then begin Inc(pc, 2); sText := AnsiExtractQuotedStr(pc, ''''); TEdit(c).Text := sText; end; end; end; end; Grüße vom marabu |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Hallo Marabu,
Danke. ich bin noch nicht so lange am "Programmieren", habe mir angesehen und teilweise ausprobiert was Pred - AnsiStartsText - AnsiExtractQuotedStr so alles macht. Vom Verstand her kein Problem, nur bei der Umsetztung gibts noch große Schwierigkeiten. Ich dachte mir das ich beim Speichern folgendes machen muss. Jetzt bitte nicht lachen. :wall:
Delphi-Quellcode:
Haut natürlich nicht hin, muss ich auch aOldData wie in meinem Beispiel (s.oben) speichern?
procedure TForm1.Button4Click(Sender: TObject);
const S_DEF = 'define('; var i, j: Integer; line, sName, sText: string; pc: PChar; c: TComponent; begin with Memo1 do for i := 0 to Pred(Lines.Count) do begin line := Lines[i]; if AnsiStartsText(S_DEF, line) then begin pc := PChar(line); Inc(pc, Length(S_DEF)); sName := AnsiExtractQuotedStr(pc, ''''); c := self.FindComponent(sName); if Assigned(c) then begin Inc(pc, 2); memo1.Lines.Strings[i] := StringReplace(memo1.Lines.Strings[j], sText, TEdit(c).Text, [rfIgnoreCase]); end; end; end; memo1.Lines.savetoFile(ExtractFilePath(Application.ExeName) + 'daten.txt'); end; Viele Grüsse Mirco |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Hallo Mirco,
besser wäre, du würdest erstmal mit ein paar Worten beschreiben, was du da vorhast - sonst geht jeder Rat am Thema vorbei. Grüße vom marabu |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Hallo marabu
ein Freund von mir bat mich ihm so ein Tool zu schreibn (haha), er hat ein Meßgerät welches eine Datei mit dieser Struktur erzeugt. Es geht ihm um eine Übersichtlichere Darstellung seiner Daten. Evt werden kleine Änderungen in den Edits vorgenommen, deshalb muss diese Datei auch wieder gespeichert werden. (später dann evt. auch in anderen Dateiformaten, Html oder Xls) momentan reicht es einfach die Edit's in der alten Datei zu speichern. Das mit den Dateiformaten bekomm ich dann schon iregndwie hin. Viele Grüße Mirco |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Hallo Mirco,
wenn die Datei mit den zu ändernden Werten nur aus solchen Zeilen besteht wie du sie gezeigt hast, dann würde ich diese Daten in einem ValueListEditor zum Bearbeiten anbieten.
Delphi-Quellcode:
Die Speicherroutine möchtest du bestimmt selbst versuchen - oder?
procedure TDemoForm.LoadFile(fn: TFileName);
const S_DEF = 'define('; var i: Integer; line, sName, sText: String; pc: PChar; begin with TStringList.Create do begin LoadFromFile(fn); VLE.Strings.Clear; for i := 0 to Pred(Count) do begin line := Strings[i]; if AnsiStartsText(S_DEF, line) then begin pc := PChar(line); Inc(pc, Length(S_DEF)); sName := AnsiExtractQuotedStr(pc, ''''); Inc(pc, 2); sText := AnsiExtractQuotedStr(pc, ''''); VLE.Values[sName] := sText; end; end; Free; end; end; marabu Edit: Zwei überflüssige Var-Deklarationen entfernt. Edit: Lines durch Strings ersetzt. |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Du hast mich bestimmt falsch verstanden, dein 1. Beispiel funktioniert doch, mir ging es ums speichern, das krieg ich nicht hin
Ich hab mich wohl falsch ausgedrückt. Ich guck mal vielleicht krieg ich es ja auch hin. [edit]Es kommen auch andere Zeilen drinnen vor, ich muss schon dein 1. Beispiel nehmen. Damit krieg ich das speichern nicht hin, magst du mir nochmal helfen? Ohje ich sollte mal in Ruhe lesen bevor ich antworte. Grüße Mirco |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Und ich hatte gerade die passende Schreibroutine gebastelt:
Delphi-Quellcode:
Die Routinen lassen sich aber leicht anpassen, damit sie nur die Zeilen der Form "define(...);" verarbeiten - wenn du dich auf den ValueListEditor einlassen kannst.
procedure TDemoForm.SaveFile(fn: TFileName);
const S_FMT = 'define(%s, %s);'; var i: Integer; sName: String; begin with TStringList.Create do begin for i := 1 to VLE.Strings.Count do begin sName := VLE.Keys[i]; Add(Format(S_FMT, [AnsiQuotedStr(sName, ''''), AnsiQuotedStr(VLE.Values[sName], '''')])); end; SaveToFile(fn); Free; end; end; marabu |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Hallo marabu
Leider kann ich keinen ValueListEditor nehmen, es ist manchmal soviel Text drinnen das ich auch Memos verwenden muss. Mit dem ValueListEditor wirds dann schnell zu unübersichtlich, ansonsten funktioniert dein ValueListEditor-Beispiel ja SUPER. Ich dachte ich frag nach einem TEdit-Beispiel ich hab mal wieder nicht soweit gedacht. Viele Grüsse und Danke für deine Hilfe Mirco |
Re: Text aus Textdatei in TEDIT auslesen und wieder speiche
Jetzt wäre es doch ganz gut den Aufbau der Datei zu kennen. Wenn du den Aufbau nicht formal beschreiben kannst, dann genügt vielleicht auch eine Beispieldatei mit ein paar Erläuterungen.
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 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