TFindDialog / Wortsuche im Memo1-Fenster...

Für Fragen von Einsteigern und Programmieranfängern...
Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

Hallo zusammen!

Im Fenster der TListBox habe ich ja die Möglichkeit, nach ein Klick in das Fenster, den Text-Inhalt (z.B. eine Telefonliste) nach Buchstaben zu "suchen" lassen... also z.B. bei drücken der Taste K, springt die Zeile DIREKT zur 1. Zeile, die mit K beginnt ...
- Diese Funktion würde im Grunde für mich schon ausreichen, allerdings kann ich in der TListBox leider kein Text heraus kopieren und wo anders einfügen, so wie es wiederum beim TMemo der Fall ist!

ABER, bei TMemo kann ich wiederum kein Text wie oben "suchen" lassen, was bei einer Telefonliste mit ca.120 Einträgen doch sehr praktisch wäre...
Daher dachte ich mir, mit dem Dialog+Befehl FindDialog1.execute; könnte ich evtl. DIREKT den Text in einem TMemo-Fenster suchen lassen... doch leider, bekomme ich das leider nicht hin... :(

FRAGE daher an die Könner:
Wie kann ich ein Text im Memo1 Fenster suchen lassen, daß die Sucheingabe einfach nur direkt zu dem Suchwort hin springt und somit die Zeile im Fenster anzeigt... ???!
- Sollte doch nicht so schwer sein... für baldige Hilfe, wäre ich sehr dankbar! :wink:

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Teekeks »

willst du den Text nur innerhalb des Programms Kopieren oder auch nach außen Kopieren?

Den Aktuell markierten eintrag bekommst du so:

Code: Alles auswählen

var s:string;
begin
  s:=ListBox1.items[Listbox1.itemindex];
end;


Nun könntest du diesen String auch ins Clipboard Kopieren, wenn du die zweite oben genannte Variante benötigst.

Gruß Teekeks

Achso:

Du könntest natürlich auch folgendes machen wenn du umbedingt ein Memo nutzen willst:
OnCreate folgendes schreiben:

Code: Alles auswählen

Memo1.readonly:=true;

Und dann OnKeyDown von dem Memo folgendes:

Code: Alles auswählen

var s:char;
    x:integer;
begin
  s:=Chr(Key);
  for x:=0 to Memo1.lines.count-1 do
    if Memo1.lines[x,1]=s then
      // diese Zeile Markieren.
end;

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

Hey, DANKE für die Antwort! :o

Hmm, in erster Linie wäre es prima, wenn ich nach einen Wort (Textsuche) innerhalb der Anzeige von z.B. TMemo1 machen könnte.

Bei meinem Telefonverzeichnis, gibt es auch Angaben von eMail-adressen ... und diese würde ich dann gerne markieren können, kopieren und wiederum in meinem eMail-programm bei Bedarf einfügen!
- Wenn möglich, wollte ich das aber nicht umständlich über das Clipboard machen...

Im TMemo Fenster geht das ja problemlos, allerdings kann ich da z.B. nicht bei einer Alphabetisch sortierten Namens-Tel-Liste Direkt von Listenanfang A zu Z springen, was bei 120 Einträge bedeudet, daß ich erst 120 Zeilen durch scrollen muss... das dauert viel zu lange!!
- Im TList-Fenster drücke ich die Taste Z und schwupps, bin ich schon razz-fatz von A bis nach Z gesprungen...

Ist mein Problem soweit klarer zu verstehen?

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Teekeks »

Hi!
Eine Textsuche in TMemo kann man so realisieren:

Zuerst (wie oben beschrieben) readonly auf true setzen.
Nun kann man nicht mehr von Hand darin Rum schreiben.

Nun machst du folgendes:

Code: Alles auswählen

uses LCLProc;
function Suchen(wort:string; m:TMemo):boolean;
var x:integer;
begin
  result:=false;
  for x:=0 to m.Lines.count-1 do
    if UTF8Pos(wort,m.lines[x])>0 then
    begin
      // diese Zeile musst du dann markieren.
      // ich weis aber gerade nicht wie, irgendwie mit M.selstart und m.sellength, wie genau musst du ausprobieren.
      result:=true;
      exit;
    end;
end;

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von hendy »

M.selstart und m.sellength

das gibt dir den anfang des ausgewählten textes zurück...
Aber selber hab ich auch keine Ahnung.
Dankt monta !!

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Teekeks »

@hendy:
Ja, aber das kannst du auch selbst setzen...

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von pluto »

Warum nutzt du Kein StringGrid bzw. ListView ? Vielleicht wäre auch die VST etwas... Wenn du Such-Funktionen suchst, findest du hier recht viele: http://www.delphipraxis.net/ auch welche die mit * umgehen können. Teilweise müssten die auch unter Lazarus Laufen.

Oder du könntest auch in einer ListBox ein TEdit Einblenden sobald Buchstaben eingetippt werden. Praktisch wie bei GTK2.
MFG
Michael Springwald

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

Hi Leute,

ich finde das ja echt super, daß ihr euch die Zeit nehmt und mir helfen wollt! :o

Allerdings hilft mir das bislang nicht wirklich weiter... zur Erinnerung, im Grunde bin ich als alter Wiedereinsteiger ein Anfänger, denn das Zeugs aus den 90er Jahren habe ich nicht mehr im Kopf...

OK, hier nochmal ein einfaches Aufbau-Beispiel als Bild, wie es funktionieren sollte... :wink:
- Ich denke, mit Hilfe von dem Dialog TFindDialog sollte das recht einfach machbar sein,
ich weiß leider nicht, wie ich den Inhalt des Memo1 an TFindDialog1 übergebe so daß die
Find-Funktion von TFindDialog mir entsprechend ein gefundenes Wort im Memo1-Fenster
dann anzeigt... :roll:

@Pluto:
Warum... weil ich "Blöd" bin! :mrgreen:
Mit TStringGrid hab ich mich auch schon etwas befasst, aber wie bekomme ich dort 120 TelefonNr. + eMail Zeilen mal eben hinein kopiert... und genauso blöd war die Abspeicherung in dem xml-Format... so konnte ich z.B. eine MS-Excel-Tabelle, die ich in xml-Format konvertiert hatte, mit TString-Grid nicht lesen... obwohl es eine ganz schlichte 3 Spalten-Tabelle im Excel-Format war... :roll:

Naja, vielleicht bekommt einer von euch mein Problem gebacken... wäre schön... :wink:
Dateianhänge
Memo1.jpg

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von pluto »

Du kannst mit memo1.lines.text den Gesamten Text als String übergeben.

Dein Problem ist Relativ einfach mit einer ListView zu lösen. Die kann verschiedene Spalten anzeigen. Jedoch dürfte es hier ein Problem mit der Menge an Daten geben. Probiere es mal einfach aus. Du müsstest dir eine eigene Lade Funktion schreiben. Leider bietet die ListView keine an. Besser wäre vermutlich eine VST(Virtuell String Tree). Gerade auch wenn es sich um viele Daten handelt. Eine ListBox sollte im Prinzip schon ausreichen:
01) Du fängst das Event OnKeyPress ab von der ListBox
02) Sobald der User anfängt zu Tippen blendest du eine TEdit ein, was du vorher erstellst hast und einfach nur Visible auf False geschaltet hast. Diese muss beim Sichtbar machen in einer Ecke Positioniert werden z.b. in der Rechten unteren Ecke.
3) Jetzt fügst du einfach beim Tippen alle Zeichen in das TEdit ein, Problem wird hier mit dem Focus sein. Am einfachsten ist wenn das TEdit einfach den Focus hat und bei jedem Eintippen eine "Sofort Suche" Startet wie z.b. bei einem Web Browser.
Ich hoffe du kannst mir so weit Folgen. Im TEdit kannst du dann bei onKeyPress eine Sofortige Suche Starten. Der Vorteil wäre: Du könntest nicht nur nach dem ersten Buchstaben suchen sondern auch nach einen beliebigen String. Du könntest auch eine ganze leiste einblenden. Für ein Telefonbuch würde sich das anbieten. Ich stelle mir das so ähnlich vor wie bei FireFox. Wenn du da Strg+F drückst. Ein Find Dialog würde ich an dieser stelle nicht nehmen.
MFG
Michael Springwald

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von shokwave »

Hallo,

schau doch mal in deinen Lazarusordner unter Examples. Da findest du ein Beispiel Address_book.

Die Anbindung an einen EMailclient steht dagegen auf einem ganz anderen Blatt. Da helfen dir TProcess und Google sicher weiter.
mfg Ingo

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

pluto hat geschrieben:Du kannst mit memo1.lines.text den Gesamten Text als String übergeben.

OK, das geht und somit wäre ich dann erst mal soweit:

Code: Alles auswählen

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
var
 Textinhalt: String;
begin
  Textinhalt:= memo1.lines.text;
  Edit1.Visible:=true;
  Edit1.Focused;
  // und wie gehts weiter?
 
end;


Dein Problem ist Relativ einfach mit einer ListView zu lösen. Die kann verschiedene Spalten anzeigen. Jedoch dürfte es hier ein Problem mit der Menge an Daten geben. Probiere es mal einfach aus. Du müsstest dir eine eigene Lade Funktion schreiben. Leider bietet die ListView keine an. Besser wäre vermutlich eine VST(Virtuell String Tree). Gerade auch wenn es sich um viele Daten handelt. Eine ListBox sollte im Prinzip schon ausreichen:

Sorry, ListView hab ich zwar gefunden, aber absolut kein Plan davon... von VST mag ich Depperl erst gar nicht anfangen... :oops:
01) Du fängst das Event OnKeyPress ab von der ListBox
02) Sobald der User anfängt zu Tippen blendest du eine TEdit ein, was du vorher erstellst hast und einfach nur Visible auf False geschaltet hast. Diese muss beim Sichtbar machen in einer Ecke Positioniert werden z.b. in der Rechten unteren Ecke.

Soweit, sogut... das hab ich verstanden! :wink:
Hier habe ich aber Visible auf True belassen, wäre ja auch OK, einfach in TEdit1 rein klicken und Suchwort schreiben... die Vorgehensweise find ich schon mal gut! :o
3) Jetzt fügst du einfach beim Tippen alle Zeichen in das TEdit ein

Du meinst damit, wenn ich z.B. einen Namen "Schulze" suchen möchte, gebe ich im TEdit1 Schulze ein... (das steht dann für "alle Zeichen") ... ?!!
, Problem wird hier mit dem Focus sein. Am einfachsten ist wenn das TEdit einfach den Focus hat und bei jedem Eintippen eine "Sofort Suche" Startet wie z.b. bei einem Web Browser.
Ich hoffe du kannst mir so weit Folgen.

Ich GLAUBE, bis hier hin, kann ich es gerade noch so mit ja beantworten???!
- Den Focus setze ich doch wie oben getan, mit TEdit1.focused; ... oder?!?

Im TEdit kannst du dann bei onKeyPress eine Sofortige Suche Starten. Der Vorteil wäre: Du könntest nicht nur nach dem ersten Buchstaben suchen sondern auch nach einen beliebigen String. Du könntest auch eine ganze leiste einblenden. Für ein Telefonbuch würde sich das anbieten. Ich stelle mir das so ähnlich vor wie bei FireFox. Wenn du da Strg+F drückst. Ein Find Dialog würde ich an dieser stelle nicht nehmen.

Und da hört es auch leider schon auf bei mir!
Ich weiss nicht, wie ich die Eingabe von Edit1 auf das Memo1 (oder auch TListBox) Fenster reagieren lasse, d.h., daß quasi mir der Cursor zur Zeile im Memo1 hin springt oder mir das gesuchte Wort im Fenster invertiert da stellt... :(

Im Grunde müsste die Abfrage bei Edit1KeyPress in etwa lauten:
Wenn Inhalt von Edit1 = identisch mit Wort von Memo1 ist,
dann springe/ scrolle automatisch zu der Zeile im Memo1 Text und zeige sie dort an.

Viel mehr muss das Programm in einem Memo1 Fenster ja nicht machen, da ich dort ja sowieso copy and paste machen kann...

@shokwave:
Danke für den Hinweis, wusste nicht, daß es dort auch einpaar Examples gibt! :o
- Allerdings will ich es bei weiten nicht so kompliziert haben... das was ich will (Suchfunktion mit Buchstaben-Tastendruck bei Klick in das TList-Fenster...), bietet mir im Grunde ja schon die TListBox "serienmäßig"... leider fehlt mir bei der TListBox die Möglichkeit von copy and paste, die wiederum nur im Memo Fenster gegeben ist, dort es aber wiederum keine wie o.g. Suchfunktion gibt...)

Hätte nicht gedacht, daß es doch soooo schwierig ist... naja, noch gebe ich nicht auf und probier mal weiter mit meinen alten, hohl gewordenen Kopp... :mrgreen: :wink:

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von pluto »

Sorry, ListView hab ich zwar gefunden, aber absolut kein Plan davon... von VST mag ich Depperl erst gar nicht anfangen...

01: ListView Platzieren
02: Die Style Eigenschaft auf vsReport stellen
03: Die EIgenschaft Colums Doppelt anklicken, es kommt ein Fenster
04: In diesem Fenster die Gewünschten "Spalten" hinzufügen.
05: Jetzt kannst du per Code Einträge hinzufügen:

Code: Alles auswählen

with ListView1.Items.Add do begin
  Caption:='Die erste Spalte';
  SubItems.Add('Die zweite Spalte');
end;


Du meinst damit, wenn ich z.B. einen Namen "Schulze" suchen möchte, gebe ich im TEdit1 Schulze ein... (das steht dann für "alle Zeichen") ... ?!!

Ja z.b. du könntest auch noch ein Button hinzufügen und dann bei Enter den Button Klick ausführen, wenn keine Sofortige Suche Stattfinden soll.

Ich GLAUBE, bis hier hin, kann ich es gerade noch so mit ja beantworten???!
- Den Focus setze ich doch wie oben getan, mit TEdit1.focused; ... oder?!?

Ich meinte das so: Wenn du das Edit Feld nicht immer Sichtbar machen möchtest, Müsstest du wenn der User mit dem Tippen Anfängt einfach das TEdit Sichtbarmachen und den Focus mit SetFocus setzten.

Und da hört es auch leider schon auf bei mir!
Ich weiss nicht, wie ich die Eingabe von Edit1 auf das Memo1 (oder auch TListBox) Fenster reagieren lasse, d.h., daß quasi mir der Cursor zur Zeile im Memo1 hin springt oder mir das gesuchte Wort im Fenster invertiert da stellt...

Ein Einfaches Beispiel:
Memo1.SelStart:=Pos(Edit1.Text);
Memo1.SelLenght:=Lenght(Edit1.Text);
Das müsstest du an einer Passenden Stelle ausführen, kann sein das die Eigenschaft Namen nicht 100%ig stimmen. aber so ähnlich sollte es gehen.

Wenn das immer noch nicht klappt Bau ich ein kleines Beispiel.... Was wäre dir Lieber? Auf bases von einem Memo ?, ListView, ListBox ? VST ? TreeView ? Kannst dir eins davon aussuchen.....
MFG
Michael Springwald

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

pluto hat geschrieben:Wenn das immer noch nicht klappt Bau ich ein kleines Beispiel.... Was wäre dir Lieber? Auf bases von einem Memo ?, ListView, ListBox ? VST ? TreeView ? Kannst dir eins davon aussuchen.....

He super!!!

Jetzt hab ich erst mal wieder etwas zu ausprobieren... aber falls Du magst, wäre mir das mit dem Memo1, wie ich es oben schon als Bild gepostet habe, mit der Wortsuche am liebsten, da ich hier ja dann automatisch in der gefundenen Zeile die Funktion COPY and PASTE bei Bedarf anwenden kann, was ich mit ListBox wohl nicht machen kann... ?! :wink:

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von pluto »

gefundenen Zeile die Funktion COPY and PASTE bei Bedarf anwenden kann, was ich mit ListBox wohl nicht machen kann... ?!

Doch das geht auch. Du musst nur das Event onKeyDown auswerten... Ich nehme an du möchtest einfach das Gefunden Wort in die Zwischenablage Kopieren...
MFG
Michael Springwald

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

pluto hat geschrieben:Ich nehme an du möchtest einfach das Gefunden Wort in die Zwischenablage Kopieren...

Nein, das wäre eher sekundär...

primär (mein Hauptanliegen) würde ich gerne in einem Memo1 Fenster, bei der ich ein Text wie oben im Beispiel angezeigt bekomme, eine Suche starten können die mir automatisch im Memo1 Fenster zu der Zeile des Suchwortes bringt!
- Das mit dem copy and paste wäre erst mal nicht wichtig, denn hierfür gibt es ja auch Befehle, z.B. StringSaveToFile beim einen oder CopyToClipboard beim anderen oder so...

Wie gesagt, ich will aber nichts dergleichen machen, NUR im Memo1 Fenster ein Wort suchen/ finden können, was dann auch im Memo1 Fenster an die gefundene Stelle springt und diese z.B. Markiert, eben einfach nur anzeigt... mehr brauch es nicht sein... :wink:

Antworten