Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wort aus Textdatei laden (https://www.delphipraxis.net/128719-wort-aus-textdatei-laden.html)

BullsEye 4. Feb 2009 16:24


Wort aus Textdatei laden
 
Hallo DP'ler,

Ich hab ein kleines Problem, beim "herausfiltern" eines Wortes aus einer Textdatei!

Prinzip:

1) Textdatei in RichEdit laden
2) Einzelne Worte aus dem RichEdit in das Memo laden

Delphi-Quellcode:
procedure TfrmEditor.btnLadenClick(Sender: TObject);
begin
  IF OpenDialog.Execute THEN BEGIN
    RichEdit.Lines.LoadFromFile(OpenDialog.FileName);
    laden;
  END;
end;
Delphi-Quellcode:
PROCEDURE laden;
VAR
    name: String;
BEGIN
  // Name
  name := frmEditor.mConfig.Lines[235];
  Delete(name,1,Pos(#32,name));
  name := trim(name);
  Delete(name,Pos(#32,name),Length(name));
  frmEditor.edtName.text := name;
END;
soweit so gut. Funktionier an sich auch wohl super. ABER!
Die Zeile aus dem Richedit sieht so aus:
Zitat:

name "BullsEye"
Das Problem ist, mit dem oben genannten Code wird das so in das Edit geladen:

Zitat:

"BullsEye"
Ich will aber nur " BullsEye " (also ohne die " ) in dem Editfeld stehen haben. Wie kann man das machen? Ich hab nicht so das richtige gefunden. Rumprobiert habe ich auch schon viel.

Das hat folgende Gründe:

1) Optisch ist das net so dolle
2) Beim Speichern erhalte ich dann folgende Zeile:

Zitat:

name ""BullsEye""
Somit summieren sich die ""

DeddyH 4. Feb 2009 16:27

Re: Wort aus Textdatei laden
 
Entferne doch mit StringReplace die Anführungszeichen einfach.

scrat1979 4. Feb 2009 16:35

Re: Wort aus Textdatei laden
 
Hallo!!

Dann lass die Anführungszeichen beim Auslesen doch einfach weg:

Delphi-Quellcode:
PROCEDURE laden;
VAR
    name: String;
BEGIN
  // Name
  name := frmEditor.mConfig.Lines[235];
  Delete(name,1,Pos(#32,name)+1); // +1
  name := trim(name);
  Delete(name,Pos(#32,name)-1,Length(name)); // -1
  frmEditor.edtName.text := name;
END;
.. oder gleich mit COPY(...)
Delphi-Quellcode:
PROCEDURE laden;
VAR
    name: String;
BEGIN
  // Name
  name := copy(frmEditor.mConfig.Lines[235], pos('"', frmEditor.mConfig.Lines[235])+1, length(frmEditor.mConfig.Lines[235]));
  name := copy(name, 1, pos('"', name)-1);
  frmEditor.edtName.text := name;
END;
Grüße,
SCRaT

BullsEye 4. Feb 2009 16:40

Re: Wort aus Textdatei laden
 
Zitat:

Zitat von DeddyH
Entferne doch mit StringReplace die Anführungszeichen einfach.

Deddy mein Held :thumb:

Mit StringReplace geht das.

Delphi-Quellcode:
  // Name
  name := frmEditor.mConfig.Lines[235];
  Delete(name,1,Pos(#32,name));
  name := StringReplace(name, '"', '' , []);
  name := trim(name);
  Delete(name,Pos(#32,name),Length(name));
  name := StringReplace(name, '"', '' , []);
  frmEditor.edtName.text := name;
Allerdings ist der Lösungsvorschlag von scrat1979 kürzer und funktioniert ebenfals.

Aber kann man das ganze nun noch weiter kürzen? Sonst müsste ich allein den Code:
Delphi-Quellcode:
  // Vorwärts
  vor := frmEditor.mConfig.Lines[30];
  Delete(vor,1,Pos(#32,vor)+1);
  vor := trim(vor);
  Delete(vor,Pos(#32,vor)-1,Length(vor));
  frmEditor.edtVor.text := vor;
an die 30x haben, wegen der ganzen Variablen etc die ich laden möchte.

DeddyH 4. Feb 2009 16:42

Re: Wort aus Textdatei laden
 
Mach doch einfach 'ne Funktion draus, der Du die Zeilennummer übergibst und die Dir dann den gekürzten String zurückgibt.

scrat1979 4. Feb 2009 16:43

Re: Wort aus Textdatei laden
 
... hab grad meinen Post oben noch editiert....

noch ein Tip für die häufige Nutzung:


Delphi-Quellcode:
function laden(Quelle : String) : String;
VAR
    temp: String;
BEGIN
  temp := copy(Quelle, pos('"', Quelle)+1, length(Quelle));
  temp := copy(temp, 1, pos('"', temnp)-1);
 
  result := temp;
END;
Aufruf z.B. mit

Delphi-Quellcode:
   frmEditor.edtVor.text := laden(frmEditor.mConfig.Lines[30]);
... alles ungetestet!

SCRaT

BullsEye 4. Feb 2009 16:50

Re: Wort aus Textdatei laden
 
Zitat:

Zitat von scrat1979
... hab grad meinen Post oben noch editiert....

noch ein Tip für die häufige Nutzung:


Delphi-Quellcode:
function laden(Quelle : String) : String;
VAR
    temp: String;
BEGIN
  temp := copy(Quelle, pos('"', Quelle)+1, length(Quelle));
  temp := copy(temp, 1, pos('"', temnp)-1);
 
  result := temp;
END;
Aufruf z.B. mit

Delphi-Quellcode:
   frmEditor.edtVor.text := laden(frmEditor.mConfig.Lines[30]);
... alles ungetestet!

SCRaT

Hey, danke! So gefällt mir das viel besser ;)

Hm naja ich weiß gerade net so ganz, Deddy. Ab und zu muss ich ja net von der selben Stelle lesen

DeddyH 4. Feb 2009 16:53

Re: Wort aus Textdatei laden
 
Na, das ist doch fast das, was ich gesagt hatte, nur wird hier der komplette String übergeben, das geht natürlich auch.

BullsEye 4. Feb 2009 18:39

Re: Wort aus Textdatei laden
 
Also, Danke nochmals!

Ich hab das mit der Funktion gemacht!

Aber wie sieht das nun aus, wenn ich folgendes lesen möchte?

Zitat:

bind "o" "say Delphi Praxis ist super!"
Das o les ich ja mit der Funktion von oben aus. Aber wie kann ich jetzt alles hinter dem say lesen? Sprich ich möchte. das im Editfeld dann folgendes steht:


Delphi Praxis ist super!

Hinter say ist ein Leerzeichen, von da bis vor dem " am Ende.

Hatte da erst an den alten Code gedacht:

Delphi-Quellcode:
  say1 := frmEditor.mConfig.Lines[315];
  Delete(say1,1,Pos(#32,say1)+9);  
  say1 := trim(say1);
  Delete(vor,Pos(#32,say1)-1,Length(say1));
  frmEditor.edtSay1.text := say1;
Allerdings liest der dann nur das erste Wort "Delphi"

DeddyH 4. Feb 2009 18:41

Re: Wort aus Textdatei laden
 
Das ist nun eine Sache des Eingangsformates. Dementsprechend müsstest Du die Funktion aufbauen. Wie kann so ein String denn aussehen, d.h. welche Randbedingungen sind vorgegeben?

BullsEye 4. Feb 2009 18:49

Re: Wort aus Textdatei laden
 
Zitat:

Zitat von DeddyH
Das ist nun eine Sache des Eingangsformates. Dementsprechend müsstest Du die Funktion aufbauen. Wie kann so ein String denn aussehen, d.h. welche Randbedingungen sind vorgegeben?


Eigentlich nur, die unterschiedliche Länge!

Sprich:
Zitat:

bind "o" "say Delphi Praxis ist super!"
kann auch so aussehen

Zitat:

bind "KP_MINUS" "say Hallo! Besucht mich doch einfach mal!"

DeddyH 4. Feb 2009 18:52

Re: Wort aus Textdatei laden
 
Der Teil, der Dich interessiert, steht aber immer zwischen den letzten beiden Anführungszeichen?

BoolString 4. Feb 2009 18:53

Re: Wort aus Textdatei laden
 
Delphi-Quellcode:
StringReplace (aProblemString, '"', '', [rfReplaceAll]);
Oder hab ich was übersehen?

Jan

-> Fettdruck in Delphitags scheint nicht zu klappen ;-)

BullsEye 4. Feb 2009 20:26

Re: Wort aus Textdatei laden
 
Zitat:

Zitat von DeddyH
Der Teil, der Dich interessiert, steht aber immer zwischen den letzten beiden Anführungszeichen?

Ich weiß zwar nicht, ob dich der interessiert, mich aber schon ;) Ja, genau den Teil.
Allerdings ohne die ersten drei Buchstaben (say)



Zitat:

Zitat von BoolString
Delphi-Quellcode:
StringReplace (aProblemString, '"', '', [rfReplaceAll]);
Oder hab ich was übersehen?

Jan

-> Fettdruck in Delphitags scheint nicht zu klappen ;-)

Das ist nicht das, was ich will. Somit erhalte ich nur den Inhalt der ersten beiden ". Gefragt ist nun aber der des zweiten "

scrat1979 4. Feb 2009 20:33

Re: Wort aus Textdatei laden
 
Das Prinzip ist das selbe:

1. Kopiere String bis auf das letzte Zeichen (= Anführungszeichen)
2. Mit einer Schleife von HINTEN nach dem ersten Treffer auf Anführungszeichen testen
3. Den String von Position 2.) bis zum Ende Kopieren.... Fertig!


... so aus dem Kopf:
Delphi-Quellcode:
 [...]
 test := 'bind "o" "say Delphi Praxis ist super!"';

 var2 := copy(test, 1, length(test)-1);

 for i := length(var2) downto 1 do
   if var2[i] = '"' then begin;
       zeichen := i;
       break;
   end;

 ergebnis := copy(var2, zeichen+1, length(var2));
Vielleicht statt einer FOR-Schleife eine "while"-Schleife verwenden und damit break; vermeiden...


SCRaT

DeddyH 4. Feb 2009 20:45

Re: Wort aus Textdatei laden
 
Und das Semikolon hinter dem begin weglassen :zwinker:

scrat1979 4. Feb 2009 21:26

Re: Wort aus Textdatei laden
 
Stimmt auch wieder :-)

Aber Du solltest Dir - wie DeddyH es bereits gesagt hat - Gedanken über ein einheitliches Format zum einlesen machen. Das erspart Dir viel Ärger.

Und zweitens solltest Du in diesem speziellen Falle die Anführungszeichen als Teil des auszulesenden Textes verbieten, sonst kommt es zu falschen "Werten". Möchtest Du die Zeichen auch erlauben, dann ist das Einlesen nicht mehr ganz so trivial und Du müsstest Dir einen Parser basteln...

Grüße,
SCRaT

BullsEye 4. Feb 2009 21:31

Re: Wort aus Textdatei laden
 
Zitat:

Zitat von scrat1979
Stimmt auch wieder :-)

Aber Du solltest Dir - wie DeddyH es bereits gesagt hat - Gedanken über ein einheitliches Format zum einlesen machen. Das erspart Dir viel Ärger.

Und zweitens solltest Du in diesem speziellen Falle die Anführungszeichen als Teil des auszulesenden Textes verbieten, sonst kommt es zu falschen "Werten". Möchtest Du die Zeichen auch erlauben, dann ist das Einlesen nicht mehr ganz so trivial und Du müsstest Dir einen Parser basteln...

Grüße,
SCRaT

Ich habe eigentlich alles einheitlich mit der Funktion. Bloß ist das hier ein "Sonderfall". Der kommt auch nur bei 5 Werten vor.

Ich hatte eigentlich nicht vor, das ganze Unterfangen komplizierter zu machen, als es schon ist. Ich bin noch dabei, das ganze mit dem Textauslesen etc so richtig zu kapieren.^^

BullsEye 6. Feb 2009 15:45

Re: Wort aus Textdatei laden
 
Wie kann ich das denn am besten machen, wenn ich das ganze denn jetzt wieder in das RichEdit haben will?

Also ich lade ja ein Textdokument in das Richedit und dann die einzelnen Werte in die dazugehörigen Editfelder. Nachdem ich den Wert in dem Editfeld gespeichert habe, muss ich das ja wieder im RichEdit ändern.

Bisher habe ich das so:

EDIT: Habs hinbekommen. Ist nur die Frage, ob das ein "guter" Code ist:

Delphi-Quellcode:
function speichern(Zeile: Integer; Edit: TEdit; AltText: String; Befehl: String) : String;
var erg : String;
begin
  erg := frmEditor.mConfig.Lines[Zeile];
  IF (Edit.Text <> '') THEN BEGIN
    frmEditor.mConfig.Lines[Zeile] := '';
    frmEditor.mConfig.Lines[Zeile] := AltText + Edit.Text + Befehl;
  END;
end;
Aufruf so:

Delphi-Quellcode:
procedure TfrmEditor.btnOKClick(Sender: TObject);
begin
  speichern(30, edtVor, 'bind "', '" "+forward"');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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