| Autor |
Beitrag |
wisler
Hält's aus hier
Beiträge: 9
|
Verfasst: Sa 18.12.04 22:30
hi,
ich möchte in einem Memofeld nach einem bestimmten Text suchen, aber ohne Dialog, der Text ist bekannt.
Der Text steht irgendwo am Zeilenanfang, danach kommt bis Zeilenende ein Dateiname. Der soll ersetzt werden durch Caption von TForm1 wobei die Dateiendung z.B.".txt" erhalten bleiben soll.
Es soll also nach einem bestimmten Text gesucht werden, und der nachfolgende Text bis auf die letzten 4 Zeichen bis Zeilenende ersetzt werden durch den Namen der geöffneten Datei ausser deren Endung.
Hat jemand einen Tip?
Mfg
wisler
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 18.12.04 22:34
Da sollten die String-Funktionen: Pos, Delete und Insert helfen. Sieh dir mal die OH dazu an. Ist eigentlich ganz einfach.
|
|
wisler 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 19.12.04 18:35
Das klappt so nicht richtig. Ich müsste schon Kontrolle über die einzelnen Zeilen im Memo haben. Vielleicht die Positon finden in welcher Zeile mein Text steht, dann die ganze Zeile auslesen, löschen und dann eine entsprechende einfügen.
Leider weiss ich nicht wie. Hab es mal mit Memo1.Lines.IndexOf versucht, find aber auch keine richtigen Beispiele dazu.
Ein wenig Programm-Code wäre nicht schlecht.
Mfg
wisler
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: So 19.12.04 19:02
| wisler hat folgendes geschrieben: | Ein wenig Programm-Code wäre nicht schlecht.
|
Dito.
Zeige du, was du schon hast und beschreibe kurz, wo genau es hakt. Dann kann man wunderschön helfen.
Ansonsten bist du mit der Online-Hilfe ja schon auf die richtige Spur gebracht worden. Was man da nicht sofort versteht, muss man eben mit kleinen Testprogrämmchen "live und in Farbe" anschaulich machen. Memo-Felder und String-Verarbeitung z.B. lassen sich so bestimmmt erlernen.
Aber wie gesagt: Zeige, was du schon hast. Dann kann man schauen, was falsch ist.
Zuletzt bearbeitet von IngoD7 am So 19.12.04 19:05, insgesamt 1-mal bearbeitet
|
|
Basti
      
Beiträge: 345
Windows Vista
D2005 Pers, D7 Pers
|
Verfasst: So 19.12.04 19:04
Geh jede Zeile einzeln in einer Schleife durch (=> Memo.Lines.Count).
Für jede Zeile machst du folgendes:
1.) Prüfen ob gesuchter Text enthalten ist:
| Zitat: | function Pos(Substr: string; S: string): Integer;
Die Funktion gibt den Indexwert des ersten Zeichens innerhalb des angegebenen Teil-Strings zurück, der in einem String vorkommt. |
2.) Wenn Text gefunden (ergebnis<>0), dann den Text aus der Zeile löschen:
| Zitat: | procedure Delete(var S: string; Index, Count:Integer);
Die Prozedur entfernt einen Teilstring aus einem String. |
S ist logischerweise die Zeile, der Index das Ergebnis von Pos (liefert ja den Index des 1. Zeichens des gesuchten Strings) und Count ist die Länge des gesuchten Textes.
Wenn du das nun rausgeschnitten hast, bleibt laut deiner Beschreibung ja bloß noch der Dateiname über.
Ist übrigens genau das, was jasocul beschrieben hat.
Das ist das was du suchst, du musst es halt bloß wie oben richtig anwenden.
_________________ Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: So 19.12.04 19:07
Quelltext 1: 2:
| for i := 1 to memo1.lines.count -1 do if pos('mein Suchtext',memo1.lines[i]) > 0 then dosomething; |
oder 0 to ...count
|
|
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: So 19.12.04 21:11
| retnyg hat folgendes geschrieben: | Quelltext 1: 2:
| for i := 1 to memo1.lines.count -1 do if pos('mein Suchtext',memo1.lines[i]) > 0 then dosomething; |
oder 0 to ...count |
nö. 0 to ...count-1!
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
wisler 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 19.12.04 22:21
Man dankt,
es klappt schon fast, habe folgendes gemacht:
Habe zuerst den gleichbleibenden Suchtext, mit dem Dateinamen von form1.Caption zusammengefügt, dann die Dateiendung abgschnitten und durch eine andere(immer gleich) ersetzt.
Quelltext 1: 2: 3: 4: 5:
| datei_name:= 'Suchtext'+ form1.Caption;//Anfangtext+Datei_name i:= Pos('.txt', datei_name);//sucht die Datei-Endung if i > 0 then Delete(datei_name, i, 5);//löscht sie(keine Ahnung wozu die 5 ist,so übernommen) Insert('.hnc', datei_name, i);//fügt eine andere ein |
Habe jetzt die Zeile mit dem Suchtext ermittelt, und durch den vorher zusammengesetzten String ersetzt.
Quelltext 1: 2: 3:
| for i := 0 to Memo1.Lines.Count -1 do If Pos('Suchtext: ', Memo1.lines.Strings[i]) > 0 then Memo1.Lines[i]:= datei_name;//fügt neue Zeile ein, andere wird gelöscht | Habe jetzt nur noch das Problem das der zu suchende Anfangstext unterschiedlich groß und klein geschrieben ist, manchmal sind es nur einige Zeichen, dann klappt es aber nicht.
Kann man mit "Pos" unberücksichtigt dieser schreibweise suchen?
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mo 20.12.04 05:07
das ganze kannst du auch abkürzen...
codeteil 1:
Quelltext 1:
| datei_name:= 'Suchtext'+ copy(form1.Caption,1,pos('.',form1.caption)) + 'hnc'; |
bei codeteil 2 musst du so vorgehen:
Quelltext 1:
| If Pos('SUCHTEXT: ', uppercase(Memo1.lines.Strings[i])) > 0 then |
ahja und bezüglich //keine ahnung wozu die 5 is
kann ich dur empfehlen den Cursor mal auf Delete zu bewegen und die Taste F1 zu drücken... dann weisst du warum
|
|
wisler 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 20.12.04 13:54
Echt super: Der erste Teil ist jetzt viel kürzer und klappt.
Das mit dem uppercase geht leider nicht.
Quelltext 1:
| If Pos('SUCHTEXT: ', uppercase(Memo1.lines.Strings[i])) > 0 then |
In der Hilfe steht zwar <Die Groß/Kleinschreibung wird von Pos nicht berücksichtigt.>
Bei mir ist das aber nicht so.
Ich überleg schon die Zeilen einzeln in einen String zu kopieren, dort in groß zu wandeln und mit einem "großen" Suchtext zu vergleichen. Normal ist das wohl nicht...?! 
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 20.12.04 14:32
Die Delphi-Hilfe ist dort seit Jahren schon falsch.
Wenn du auch Umlaute haben könntest, solltest du aber besser AnsiUpperCase benutzen. 
|
|
wisler 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 20.12.04 15:18
Jetzt geht es,
Quelltext 1:
| If Pos(AnsiUpperCase('Suchtext'), AnsiUpperCase(Memo1.lines.Strings[i])) > 0 then |
vielen Dank
|
|