![]() |
RichEdit Wort finden, Farbig und Fett markieren
Hi,
wie kann ich im RichEdit ein Wort finden und es farbig und fett markieren ? Mit SelAttributes markiere ich das gesuchte Wort zwar, aber wie finde ich es überhaupt ? |
Re: RichEdit Wort finden, Farbig und Fett markieren
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Wo ist denn von einem Dialog die Rede? Hast Du dir ![]() |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Dann probiers doch einfach mal aus und dann wirst du wahrscheinlich sehen das, das kein Dialog ist :roll: ;)
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Delphi-Quellcode:
Und das soll kein Dialog sein ?
FindDialog1.Execute
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Sag ma wer redet bittesehr von FindDialog ??
von FindText ist die Rede -.- |
Re: RichEdit Wort finden, Farbig und Fett markieren
Das zeigt mir Delphi an:
Delphi-Quellcode:
Was ist FindText eigentlich, Delphi kennt es nicht.
procedure TForm1.Button1Click(Sender: TObject);
begin FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top); FindDialog1.Execute; end; procedure TForm1.FindDialog1Find(Sender: TObject); var FoundAt: LongInt; StartPos, ToEnd: Integer; begin with RichEdit1 do begin { Suche hinter aktueller Markierung beginnen (falls vorhanden), } { andernfalls am Textanfang starten. } if SelLength <> 0 then StartPos := SelStart + SelLength else StartPos := 0; { ToEnd ist die Länge von StartPos bis zum Textende im RTF-Eingabefeld } ToEnd := Length(Text) - StartPos; FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]); if FoundAt <> -1 then begin SetFocus; SelStart := FoundAt; SelLength := Length(FindDialog1.FindText); end; end; end; |
Re: RichEdit Wort finden, Farbig und Fett markieren
Bist du so beschränkt oder tust du nur so?
Wenn du FindText in deine Unit schreibst und F1 drückst, kommen da 4 Möglichkeiten: FINDTEXT FindText FindText (Eigenschaft von TFindDialog) (VCL-Referenz) FindText (Eigenschaft von TCustomRichEdit) (VCL-Referenz) Welche passt wohl? :roll: |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
(C++ Beispiel) (Delphi-Beispiel) TCustomRichEdit TFindDialog TCustomRichEdit trifft wohl am ehsten zu. Und welchen COde kriege ich da ? Den oben !! Die Beschimpfung ignoriere ich jetzt mal einfach. |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Ich habe Delphi 7 Personal mit keinen zusätzlich installierten Komponenten, also müsste das bei dir auch vorhanden sein. //edit: Oha, da hat jemand oben editiert. |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Zitat:
Delphi-Quellcode:
oder so ?
if FindDialog1.FindText = 'START' then
begin with Memo1.SelAttributes do begin Color := clRed; Height := Height + 5; end; end;
Delphi-Quellcode:
procedure TForm1.FindDialog1Find(Sender: TObject);
begin with Memo1.SelAttributes do begin Color := clRed; Height := Height + 5; end; end; |
Re: RichEdit Wort finden, Farbig und Fett markieren
Nils,
Du hast was übersehen: Die Stelle, an der in dem Beispiel der Text nach dem Suchwort durchsucht wird heisst:
Delphi-Quellcode:
FindDialog1.FindText bedeutet nur, dass in diesem Beispiel das Suchwort über einen Dialog, nämlich "FindDialog1" einegeben wurde. Du kannst an derselben Stelle aber auch Deinen Suchstring direkt oder als string-Variable einstellen. Etwa so:
FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
Delphi-Quellcode:
oder
FoundAt := FindText('suchmal', StartPos, ToEnd, [stMatchCase]);
Delphi-Quellcode:
FindText ist eine Methode der Klasse TCustomRichEdit. Wenn Du in Deinem Programm folgende Variablen einführst:
suchString:='suchmal';
FoundAt := FindText(suchString, StartPos, ToEnd, [stMatchCase]);
Delphi-Quellcode:
dann kannst Du anschliessend in diesem Dokument z.B. mit folgender Anweisung die Suche durchführen:
meinTextDocument : TcustomRichEdit
fundStelle : integer;
Delphi-Quellcode:
Näheres findest Du in der Delphi-Hilfe unter TcustomRichEdit.
fundStelle:=meinTextDokument.findText('suchmal',StartPos,ToEnd,[stMatchCase]);
Alles klar? mare_crisium |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Egal wie schwer sich jemand mit den Tips gibt ist dies kein Grund für persönliche Anfeindungen. Betrachte dies bitte als sehr ernsthafte Ermahnung :!: |
Re: RichEdit Wort finden, Farbig und Fett markieren
Ich konnte nicht nachvollziehen, dass er das nicht findet. Zumal er ja auch noch die gleiche Delphi-Version verwendet und ich sozusagen eine Step-by-Step-Anleitung gepostet hab.
Mag sein, dass das mit knappen 40 anders ist. Man wird ja auch ruhiger. Ich überlege gerade, ob man wirklich alles, was man schreibt in erhöhtem Grade mit Smilies übersäen muss, damit man auch ganz bestimmt erkennt, wie was gemeint ist. Ich kann hier im Forum mittlerweile eigentlich alle recht gut leiden. Und meinst du allen Ernstes, ich beleidige jemanden ernsthaft, den ich recht gut leiden kann? Dieser Text wurde vorsätzlich ohne jegliche Emoticons verfasst, damit sich jeder die Sinnrichtung rauspicken kann, die ihm gerade passt |
Re: RichEdit Wort finden, Farbig und Fett markieren
Delphi-Quellcode:
Dieser Code von mare_crisium markiert das gesuchte Wort schwarz. Aber wie kriege ich es jetzt noch hin, so dass es fett und grün dargestellt wird ?
procedure TForm1.Button1Click(Sender: TObject);
var StartPos, ToEnd, foundAt: integer; suchText: String; begin suchText:='START'; foundAt := Memo1.findText(suchText,0,length(Memo1.text),[stMatchCase]); if FoundAt <> -1 then begin Memo1.SetFocus; Memo1.SelStart := FoundAt; Memo1.SelLength := Length(suchText); end; end; |
Re: RichEdit Wort finden, Farbig und Fett markieren
Öhm...
Zitat:
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Hallo!
Also wirklich, ich hab diese Funktion noch nie gebraucht und hab sie sogar ohne Delphi-Hilfe ausfündig gemacht. Da gibt es so eine coole Funktion namens Codevervollständigung. ;) Etwas mehr Engagement deinerseits würde nicht schaden. :zwinker:
Delphi-Quellcode:
Grüße
MyRichEdit.SelAttributes.Color := clGreen;
MyRichEdit.SelAttributes.Style := [fsBold]; Faux |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Das geht übrigens nur bei RichEdit. Bei Memo wirst du hier nicht weit kommen. Grüße Faux |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
|
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Und bevor du fragst. Mit SynEdit kann man auch eigene Highlighter machen. |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Wisst ihr warum bei diesem Code von mare_crisium nichts mehr markiert wird ?
Delphi-Quellcode:
Der Übrsprüngliche Code sah so aus, aber da wurde halt nur ein Wort markiert, obwohl es mehrfach dastand:
procedure TForm1.FormCreate(Sender: TObject);
begin Button1.Click; searchStart := 0; end; procedure TForm1.Button1Click(Sender: TObject); var StartPos, ToEnd, foundAt: integer; lsuchText : string; lfundStelle : integer; begin lsuchText :='START'; lfundStelle := Memo1.FindText(lsuchText,searchStart,length(Memo1.text),[]); if (lfundStelle > 0) then begin Memo1.SetFocus; Memo1.SelStart := lfundStelle; Memo1.SelLength := Length(lsuchText); searchStart := Memo1.selStart + Memo1.selLength+1; if ( searchStart > length(Memo1.text)) then searchStart:=0; end else searchStart:=0; if (Memo1.selLength > 0) then begin Memo1.SelAttributes.color := clBlue; Memo1.SelAttributes.style := [fsBold]; end; end;
Delphi-Quellcode:
Evtl. liegt der Code-Schnipsel
suchText:='START';
foundAt := Memo1.findText(suchText,0,length(Memo1.text),[stMatchCase]); if FoundAt <> -1 then begin Memo1.SelStart := FoundAt; Memo1.SelLength := Length(suchText); if (Memo1.selLength > 0) then begin Memo1.SelAttributes.color := clBlue; Memo1.SelAttributes.style := [fsBold]; end; //Memo1.SelAttributes.Color := clGreen; //Memo1.SelAttributes.Style := [fsBold]; end;
Delphi-Quellcode:
an der falschen Stelle, aber ich habe schon alles durchprobiert, auch wie es mare_crisium gemacht hat mit zwei Buttons, es läuft nicht, egal wohin das
if (Memo1.selLength > 0)
then begin Memo1.SelAttributes.color := clBlue; Memo1.SelAttributes.style := [fsBold]; end;
Delphi-Quellcode:
kommt.
if (Memo1.selLength > 0)
then begin Memo1.SelAttributes.color := clBlue; Memo1.SelAttributes.style := [fsBold]; end; |
Re: RichEdit Wort finden, Farbig und Fett markieren
Hallo Nils,
auch mit deinem Code würde, wenn er funktionieren würde, nur die erste Fundstelle markiert - du hast schließlich keine Schleife drin. Auch hast du die Bedingung für FindText() falsch abgeändert - nicht > 0 sondern >= 0 müsstes du abfangen. Die nächste Suche würde in deinem Code eine Stelle auslassen, so dass du direkt hintereinander stehende Fundstellen nicht erkennst. Ich habe keine weiteren Fehler gesucht, aber es können durchaus noch weitere in deinem Code stecken.
Delphi-Quellcode:
Grüße vom marabu
uses
Types; function FindTextAll(re: TRichEdit; sText: string; options: TSearchTypes): TIntegerDynArray; var iStart, iFound, iLength: integer; begin SetLength(Result, 0); iStart := 0; iLength := Length(re.Lines.Text); while iStart < (iLength - Length(sText)) do begin iFound := re.FindText(sText, iStart, iLength - iStart, options); if iFound = -1 then Exit; SetLength(Result, Succ(Length(Result))); Result[High(Result)] := iFound; iStart := iFound + Length(sText); end; end; procedure TDemoForm.FindButtonClick(Sender: TObject); var ida: TIntegerDynArray; i: integer; sText: string; begin sText := FindEdit.Text; ida := FindTextAll(RichEdit, sText, []); for i := Low(ida) to High(ida) do with RichEdit do begin SelStart := ida[i]; SelLength := Length(sText); SelAttributes.Color := clBlue; SelAttributes.Style := [fsBold]; end; RichEdit.SetFocus; end; |
Re: RichEdit Wort finden, Farbig und Fett markieren
Danke, allgemein läuft es jetzt, aber wenn ich etwas editiere, wird sText schwarz markiert, wie kann ich das noch verhindern. Aber sonsten schon mal danke :-D
Es soll ja ein Highlighter werden, also habe ich in OnChange den Button aufruf drinnen. |
Re: RichEdit Wort finden, Farbig und Fett markieren
Hallo Nils,
wenn du bestimmte Schlüsselwörter hervorheben möchtest, dann solltest du meinen Beispiel-Code nicht einsetzen, sonst wird ja für jedes Schlüsselwort der gesamte Text erneut durchsucht. Da ist ein Parser die einzig richtige Lösung. Nur über einen Parser erhältst du Kontextinformation, anhand der du entscheiden kannst, ob ein Schlüsselwort wirklich ein Schlüsselwort ist oder nur ein einfaches Literal. marabu |
Re: RichEdit Wort finden, Farbig und Fett markieren
Zitat:
Als Alternative zu Synedit gibts auch noch Scintella. Dieses benötigt aber eine DLL, die immer mitgeliefert werden muss. |
Re: RichEdit Wort finden, Farbig und Fett markieren
Ich habe aus irgendeinem thread noch einen Parser, das hier ist jetzt das gesamte Programm:
Delphi-Quellcode:
Ich wäre euch für Hilfe sehr dankbar :-D
unit miniprog_u;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, info_u, LMDControl, LMDBaseControl, LMDBaseGraphicControl, LMDBaseLabel, LMDCustomLabel, LMDCustomLabelFill, LMDLabelFill, SynEdit, SynMemo, XPMan, ComCtrls, LMDCustomControl, LMDCustomPanel, LMDCustomBevelPanel, LMDCustomParentPanel, LMDBackPanel, ExtCtrls, Types; type TForm1 = class(TForm) OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Memo2: TMemo; errormemo: TSynMemo; XPManifest1: TXPManifest; FindDialog1: TFindDialog; Memo1: TRichEdit; Panel1: TPanel; infoButton: TButton; oeffnenButton: TButton; speichernButton: TButton; parseButton: TButton; Button1: TButton; endeButton: TButton; ColorBox1: TColorBox; function FindTextAll(re: TRichEdit; sText: string; options: TSearchTypes): TIntegerDynArray; procedure parseButtonClick(Sender: TObject); procedure endeButtonClick(Sender: TObject); procedure infoButtonClick(Sender: TObject); procedure oeffnenButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure CodingChange(Sender: TObject); procedure speichernButtonClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure Button1Click(Sender: TObject); procedure Memo1Change(Sender: TObject); private { Private-Deklarationen } dateiname: string; searchStart: integer; geaendert: boolean; public { Public-Deklarationen } end; var Form1: TForm1; Document: TCustomRichEdit; ida: TIntegerDynArray; i: integer; sText: string; implementation uses options; {$R *.DFM} CONST signs: SET OF CHAR = ['+', '-']; ziffern: SET OF CHAR = ['0' .. '9']; procedure parse (s: string); var sym: string; c: char; c_pos: integer; abbruch: boolean; function next: char; begin inc (c_pos); if c_pos > length (s) then next := #0 else next := s [c_pos] end; { next } { function nextsym: string; begin result := ''; while (c=' ') or (c=#10) or (c=#13) do c:=next; if c in [';', ',', '.', '(', ')', '+'] then result := c else if c=':' then begin result := c; c := next; if c='=' then begin result := result+c; c := next; end; end else if c in ziffern then begin result := c; c := next; while c in ziffern do begin result := result + c; c := next end; end else begin while c In ['A'..'Z', 'a'..'z'] Do Begin result := result + upcase(c); c:=next; end; end; form1.memo2.lines.add(result); end; { nextsym } function nextSym: string; var symbol: string; begin while (c = ' ') or (c = #10) or (c = #13) do c := next; if c in ['.', ';', ',', '(', ')', '+'] then begin symbol := c; c := next end else if c = ':' then begin symbol := c; c := next; if c = '=' then begin symbol := ':='; c := next end end else if c in ziffern then begin symbol := c; c := next; while c in ziffern do begin symbol := symbol + c; c := next end end else if upcase (c) in ['A'..'Z'] then begin symbol := c; c := next; while upcase (c) in ['A'..'Z'] do begin symbol := symbol + c; c := next end end; symbol := uppercase (symbol); form1.Memo2.Lines.Add (symbol); result := symbol end; { nextSym } PROCEDURE error (m: STRING); BEGIN abbruch := true; Form1.errormemo.Lines.Add(m) END; { error } function Programm: boolean; function Bezeichner: boolean; var i: integer; begin result := true; for i:=1 to length(sym) do if not (sym[i] in ['A'..'Z']) then result := false; if result then result := (sym <> 'PROGRAM') and (sym <> 'VAR') and (sym <> 'INTEGER') and (sym <> 'PROCEDURE') and (sym <> 'BEGIN') and (sym <> 'END') and (sym <> 'WRITELN') and (sym <> 'READLN'); if result then sym := nextsym else error('Ungültiger Bezeichner gefunden!'); end; // Bezeichner function Programm_Kopf: boolean; begin result := true; If sym <> 'START' then begin result := false; error ('"START" erwartet!'); end else sym := nextsym; If result then result := Bezeichner; If result and (sym <> ';') then begin result := false; error ('";" erwartet!'); end else sym := nextsym; end; // Programm_Kopf function Block: boolean; function Variablen_Deklarationsteil: boolean; begin result := (sym = 'VAR'); if result then begin sym := nextsym; result := Bezeichner; while result and (sym = ',') do begin sym := nextsym; result := Bezeichner; end; if result then begin if sym <> ':' then begin result := false; error (' ":" erwartet!'); end else begin sym := nextsym; If sym <> 'INTEGER' then begin result := false; error ('"INTEGER" erwartet!'); end else begin sym := nextsym; if sym <> ';' then begin result := false; error ('";" erwartet!'); end else sym := nextsym; end; end; end; end else error ('Variablen-Deklarationsteil erwartet!') end; // Variablen_Deklarationsteil function Prozeduren_Deklarationsteil: boolean; begin result := (sym='PROCEDURE'); if result then begin sym := nextsym; if Bezeichner then begin if not (sym = ';') then begin result := false; error ('";" erwartet!'); end else begin sym := nextsym; if Block then begin if not (sym = ';') then begin result := false; error ('";" erwartet!'); end else sym := nextsym; end else result := false; end; end; end else begin result := false; error ('Prozeduren-Deklarationsteil erwartet!'); end; end; // Prozeduren_Deklarationsteil function Anweisungsteil: boolean; function Anweisung: boolean; function Zuweisung: boolean; function Konstante: boolean; begin end; // Konstante function Summe: boolean; begin end; // Summe begin if Bezeichner then if sym = ':=' then begin sym := nextsym; if Bezeichner then begin result := true; if sym = '+' then if Bezeichner then result := true else result := false; end else result := false; end else begin result := false; error ('":=" erwartet!'); end else result := false; end; // Zuweisung begin if (sym = 'WRITELN') Or (sym = 'READLN') then begin sym := nextsym; if sym = '(' then begin sym := nextsym; if Bezeichner then if sym = ')' then begin result := true; sym := nextsym; end else begin result := false; error ('")" erwartet!'); end; end else begin result := false; error ('"(" erwartet!'); end; end else result := Zuweisung; end; // Anweisung begin result := false; if sym = 'BEGIN' then begin result := true; sym := nextsym; if Anweisung then begin while result and (sym = ';') do begin sym := nextsym; result := Anweisung; end; if result then begin if sym = 'END' then begin result := true; sym := nextsym; end else begin result := false; error ('"END" erwartet!') end; end; end else begin result := false; error ('Anweisung erwartet!'); end; end else begin result := false; error ('Anweisungsteil erwartet!'); end; end; // Anweisungsteil begin if sym = 'VAR' then result := Variablen_Deklarationsteil else result := true; while result and (sym = 'PROCEDURE') do result := Prozeduren_Deklarationsteil; if result then result := Anweisungsteil; end; // Block begin Result := false; If Programm_Kopf then If Block then If sym='.' then result := true; end; // Programm begin c_pos := 0; abbruch := false; c := next; sym := nextsym; If Programm Then begin Form1.errormemo.Clear; Form1.errormemo.Visible := False; end Else begin Form1.errormemo.Visible := True; end; // If Programm Then Form1.Labeltest.Caption := '#' // Else Showmessage ('Fehler im Programm!') end; { parse } procedure TForm1.parseButtonClick(Sender: TObject); begin memo2.lines.Clear; parse (memo1.text) end; { TForm1.testButtonClick } procedure TForm1.endeButtonClick(Sender: TObject); begin close end; { TForm1.endeButtonClick } procedure TForm1.infoButtonClick(Sender: TObject); begin form2.showModal end; procedure TForm1.oeffnenButtonClick(Sender: TObject); begin if openDialog1.Execute then begin dateiname := openDialog1.FileName; memo1.lines.LoadFromFile (dateiname); form1.Caption := dateiname end; end; procedure TForm1.FormCreate(Sender: TObject); begin // Button1.Click; searchStart := 0; forceCurrentDirectory := true; geaendert := false; end; procedure TForm1.CodingChange(Sender: TObject); begin geaendert := true end; procedure TForm1.speichernButtonClick(Sender: TObject); begin if saveDialog1.Execute then begin dateiname := saveDialog1.FileName; memo1.lines.savetoFile (dateiname); form1.Caption := dateiname; geaendert := false; end; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var antwort: integer; begin if geaendert then begin antwort := messagebox(0, 'Die Datei wurde verändert. Soll sie gespeichert werden?', 'Parser', MB_YESNOCANCEL+MB_ICONQUESTION); if antwort = 6 then begin speichernButtonClick(Sender); canclose := true; end else if antwort = 7 then canclose := true else canclose := false; end else canclose := true; end; function TForm1.FindTextAll(re: TRichEdit; sText: string; options: TSearchTypes): TIntegerDynArray; var iStart, iFound, iLength: integer; begin SetLength(Result, 0); iStart := 0; iLength := Length(re.Lines.Text); while iStart < (iLength - Length(sText)) do begin iFound := re.FindText(sText, iStart, iLength - iStart, options); if iFound = -1 then Exit; SetLength(Result, Succ(Length(Result))); Result[High(Result)] := iFound; iStart := iFound + Length(sText); end; end; procedure TForm1.Button1Click(Sender: TObject); begin sText := 'start'; ida := FindTextAll(Memo1, sText, []); for i := Low(ida) to High(ida) do with Memo1 do begin SelStart := ida[i]; SelLength := Length(sText); SelAttributes.Color := clBlue; //SelAttributes.Color := ColorBox1.Selected; // SelAttributes.Color := optionform.ColorBox1.Selected; SelAttributes.Style := [fsBold]; end; end; procedure TForm1.Memo1Change(Sender: TObject); begin // ida := FindTextAll(Memo1, sText, []); // Button1.Click; end; end. Evtl. steckt es ja in der
Delphi-Quellcode:
Unit drinnen.
procedure parse (s: string);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 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