![]() |
nicht nur erstes Vorkommnis in Memo markieren
Hallo,
markiere mit
Code:
einen ausgewaehlten Eintrag in einem Memo.
procedure Tfmain.tv_listChange(Sender: TObject; Node: TTreeNode);
begin memo.SelStart:= pos(node.Text,memo.Lines.Text); memo.SelLength:= length(node.text); end; Ich wuerde jetzt gerne alle Vorkommnise und nicht nur das Erste Auftreten markieren. Wie geht dies? Gruss und Dank lkz633 |
Re: nicht nur erstes Vorkommnis in Memo markieren
Delphi-Quellcode:
[edit=Christian Seehase]Delphi-Tags gesetzt. Mfg, Christian Seehase[/edit]
var i: Integer;
begin i := 1; while pos(node.Text,copy(memo.Lines.Text, i, length(memo.lines.text))) > 0 do begin i := pos(node.Text,copy(memo.Lines.Text, i, length(memo.lines.text))) + 1; gefundenpos := i - 1; //gefundenes markieren - keine ahnung wie das geht - glaube man kann nur eine zusammenhängende selection machen. Was vielleicht geht die hintergrundfarbe des gefundenen zu ändern end; |
Re: nicht nur erstes Vorkommnis in Memo markieren
Moin lkz,
wenn Du etwas markieren willst, solltest Du ein RichEdit nehmen. @SirThornberry: Sind Dir die Delphi Tags ausgegangen ;-) So mit Memo.Lines.Text zu arbeiten, ist übrigens eine prima Möglichkeit das Programm langsam zu machen. Text wird bei jedem Lesezugriff aus den Lines aufgebaut. ;-) Am besten vorher in eine Stringvariable laden, und dann die Schleife mit diesem String abarbeiten. Die gefundenen Positionen entsprechen ja denen im Memo, wenn man -1 rechnet. Übrigens noch ein Argument für RichEdit. Das kennt die Methode FindText. |
Re: nicht nur erstes Vorkommnis in Memo markieren
Hallo,
wollte das auch schon mit einer while Schleife machen, aber was ist dann die Abbruchbedingung? So ist es eine Endlosschleife. Gruss lkz633 |
Re: nicht nur erstes Vorkommnis in Memo markieren
Delphi-Quellcode:
Hier steht doch das wenn die erste Fundstelle größer als 0, dann soll er weitermachen, sonst nicht.
while pos(node.Text,copy(memo.Lines.Text, i, length(memo.lines.text))) > 0 do
Wieso Endlosschleife? |
Re: nicht nur erstes Vorkommnis in Memo markieren
Code:
Es faengt immer wieder von vorne an, so dass es zu einer Endlosschleife kommtmemo.SelStart:= 1; while (pos(node.Text,copy(memo.Lines.Text, memo.SelStart, length(memo.lines.text))) > 0) do begin memo.SelStart:= pos(node.Text,copy(memo.Lines.Text.selstart length(memo.lines.text))) ; memo.SelLength:= length(node.text); end; |
Re: nicht nur erstes Vorkommnis in Memo markieren
Arg ist auch logisch, weil er immer wieder von vorn anfängt.
Kopier den Inahlt am besten in eine Variabel und lasse daraus immer den letzten Teil löschen... |
Re: nicht nur erstes Vorkommnis in Memo markieren
Dann stimmen aber die Indizes nicht mehr ueberein.
Weiss denn nimand eine Loesung? Gruss lkz633 |
Re: nicht nur erstes Vorkommnis in Memo markieren
mhm stimmt das war mist.
Aber wie wäre es wenn du statt COPY eine Integer Variabel einsetzt? Und die dann in der Schleife veränderst, damit er weiterkommt... |
Re: nicht nur erstes Vorkommnis in Memo markieren
Moin lkz,
so geht's:
Delphi-Quellcode:
Hilft Dir aber nicht wirklich, da Du ja in einem Memo nichts markieren kannst.
var
sText : string; sSearch : string; sDel : string; iSearchLen : integer; iPos : integer; begin sSearch := 'test'; iSearchLen := length(sSearch); // nur um zu zeigen, dass es geht, besser wäre #00 statt '9' sDel := StringOfChar('9',iSearchLen); sText := Memo1.Lines.Text; Memo1.SelStart := 0; iPos := pos(sSearch,sText); Memo1.Lines.BeginUpdate; try while (iPos > 0) do begin // Da SelStart bei 0 anfängt, ein Index im String aber bei iPos-1 Memo1.SelStart := iPos-1; Memo1.SelLength := iSearchLen; // Suchbegriff im String löschen CopyMemory(@sText[iPos],@sDel[1],iSearchLen); iPos := pos(sSearch,sText); end; // nur um zu zeigen, dass es geht Memo1.Lines.Text := sText; finally Memo1.Lines.EndUpdate; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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