AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Text aus Textdatei in TEDIT auslesen und wieder speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Text aus Textdatei in TEDIT auslesen und wieder speichern

Ein Thema von Mirco · begonnen am 2. Jun 2006 · letzter Beitrag vom 3. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#1

Text aus Textdatei in TEDIT auslesen und wieder speichern

  Alt 2. Jun 2006, 13:23
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:
// 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;
Ich hoffe es kann mir jemand helfen.
Grüsse Mirco
Mirco Hallenga
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 2. Jun 2006, 17:15
Hallo Mirco,

deine beispielhaften Datenzeilen könnte man auch so auslesen:

Delphi-Quellcode:
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;
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.

Grüße vom marabu
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#3

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 2. Jun 2006, 23:36
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.
Delphi-Quellcode:
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;
Haut natürlich nicht hin, muss ich auch aOldData wie in meinem Beispiel (s.oben) speichern?

Viele Grüsse
Mirco
Mirco Hallenga
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 3. Jun 2006, 11:17
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
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#5

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 3. Jun 2006, 17:11
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
Mirco Hallenga
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 3. Jun 2006, 17:37
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:
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;
Die Speicherroutine möchtest du bestimmt selbst versuchen - oder?

marabu


Edit: Zwei überflüssige Var-Deklarationen entfernt.
Edit: Lines durch Strings ersetzt.
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#7

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 3. Jun 2006, 19:25
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
Mirco Hallenga
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 3. Jun 2006, 20:23
Und ich hatte gerade die passende Schreibroutine gebastelt:

Delphi-Quellcode:
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;
Die Routinen lassen sich aber leicht anpassen, damit sie nur die Zeilen der Form "define(...);" verarbeiten - wenn du dich auf den ValueListEditor einlassen kannst.

marabu
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#9

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 3. Jun 2006, 20:40
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
Mirco Hallenga
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Text aus Textdatei in TEDIT auslesen und wieder speiche

  Alt 3. Jun 2006, 20:48
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:54 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