Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi nicht nur erstes Vorkommnis in Memo markieren (https://www.delphipraxis.net/10365-nicht-nur-erstes-vorkommnis-memo-markieren.html)

lkz633 16. Okt 2003 22:43


nicht nur erstes Vorkommnis in Memo markieren
 
Hallo,

markiere mit
Code:
procedure Tfmain.tv_listChange(Sender: TObject; Node: TTreeNode);
begin
  memo.SelStart:= pos(node.Text,memo.Lines.Text);
  memo.SelLength:= length(node.text);
end;
einen ausgewaehlten Eintrag in einem Memo.

Ich wuerde jetzt gerne alle Vorkommnise und nicht nur das Erste Auftreten markieren.

Wie geht dies?

Gruss und Dank
lkz633

SirThornberry 16. Okt 2003 22:55

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Delphi-Quellcode:
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;
[edit=Christian Seehase]Delphi-Tags gesetzt. Mfg, Christian Seehase[/edit]

Christian Seehase 16. Okt 2003 23:09

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.

lkz633 16. Okt 2003 23:19

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

Alexander 17. Okt 2003 07:20

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Delphi-Quellcode:
while pos(node.Text,copy(memo.Lines.Text, i, length(memo.lines.text))) > 0 do
Hier steht doch das wenn die erste Fundstelle größer als 0, dann soll er weitermachen, sonst nicht.
Wieso Endlosschleife?

lkz633 17. Okt 2003 09:23

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Code:
   
memo.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;
Es faengt immer wieder von vorne an, so dass es zu einer Endlosschleife kommt

Alexander 17. Okt 2003 09:27

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...

lkz633 17. Okt 2003 09:43

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Dann stimmen aber die Indizes nicht mehr ueberein.

Weiss denn nimand eine Loesung?

Gruss lkz633

Alexander 17. Okt 2003 09:49

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...

Christian Seehase 17. Okt 2003 12:05

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Moin lkz,

so geht's:

Delphi-Quellcode:
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;
Hilft Dir aber nicht wirklich, da Du ja in einem Memo nichts markieren kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz