Delphi-PRAXiS

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.

lkz633 17. Okt 2003 12:41

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Hi,

verstehje leider gerade nur Bahnhof.

Wiso kann ich in einem Memo nichts markieren? Was bedeuten die Kommentare "nur um zu zeigen dass es geht".

Also bei mir wird jetzt gar nichts markeirt.

Gruss lkz633

Christian Seehase 17. Okt 2003 12:58

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

in dem Beispiel ersetze ich alle Fundstellen, durch 9en, um diese kenntlich zu machen, da man in einem Memo nichts markieren kann. In einem Memo kann man nicht mit verschiedenen Farben arbeiten.
Deshalb der Kommentar.

Nimmst Du statt eines Memos ein RichEdit, könntest Du hinter dieser Zeile:

Delphi-Quellcode:
Memo1.SelLength := iSearchLen;
mal die Zeile

Delphi-Quellcode:
RichEdit1.SelAttributes.Color := clRed;
eintragen (alle Memo1 natürlich gegen RichEdit1 austauschen).
Dann würden alle Fundstellen durch rote Schrift markiert.

Dann noch die '9' durch #00 ersetzen, und die Zuweisung
Delphi-Quellcode:
Memo1.Lines.Text := sText;
weglassen.

Bei einem RichEdit könntest Du allerdings statt so einer Routine auch FindText nehmen, wie weiter oben schon gesagt.

lkz633 17. Okt 2003 13:24

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Super, danke fuer deine Hilfe.

Der Code funktioiert noch nicht so 100%, sind bei mehreren Vorkommnissen doch um mehrere Stellen verrutscht.

Sehe aber den Fehler nicht, kann jemand helfen?

Welchen Befehl muss ich ausserdem benutzen, um alle Markierungen wieder aufzuheben?

Herzlichen Dank und Gruss
lkz633

Christian Seehase 17. Okt 2003 13:40

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

Zitat:

Zitat von lkz633
sind bei mehreren Vorkommnissen doch um mehrere Stellen verrutscht.

:shock:

das hatte ich soweit schon getestet...

Kannst Du mal einen Beispieltext anhängen, bei dem es nicht geht?

lkz633 17. Okt 2003 13:50

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jup, hier ist der gesamte Quellcode+php-Datei zum Testen, manchmal wird anscheinend "willkuerlich" byw um mehrere <Stellen falsch markiert

Danke fuer deine Hilfe

lkz633

Christian Seehase 17. Okt 2003 14:18

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

danke für den Source.

Das liegt an den Tabulatoren in der Datei. Wenn ich die testeshalber mal durch #32 (Blank) ersetze, klappt's.
Wieso das passiert, bzw. wie das zu berücksichtigen ist, weiss ich allerdings (noch) nicht :?

Übrigens nur so als Idee:
Wenn ein anderes Element ausgewählt werden solltest Du die Markierung des zuletzt gewählten wieder zurücksetzen.

lkz633 17. Okt 2003 14:25

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Zitat:

Zitat von Christian Seehase
Wenn ein anderes Element ausgewählt werden solltest Du die Markierung des zuletzt gewählten wieder zurücksetzen.

:-D siehe vorhergegangene Frage bzw Kommentar im Code :-D

Weisst du auch dafuer eine Loesung?

Zitat:

Zitat von Christian Seehase
noch nicht

Da hab ich ja den richtigen erwischt :-D, danke!

Gruss lkz633

Christian Seehase 17. Okt 2003 14:35

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

für das Zurücksetzen der Markierungen fallen mir zwei Wege ein.
Entweder Du merkst Dir, was zuletzt ausgewählt wurde (beim ersten durchlauf eben nichts), und durchläufst die Schleife zweimal, das erste Mal mit dem alten Begriff, wobei die Markierungsfarbe auf schwarz gesetzt, oder Du markierst alles mit SelectAll und setzt die Farbe global auf schwarz zurück. Mit einem BeginUpdate/EndUpdate sieht man auch nichts von der Markierung ;-)

Nur das mit den Tabulatoren macht mir Kopfzerbrechen (noch ;-))

Christian Seehase 17. Okt 2003 15:02

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

ich hab' ja gleich gesagt: FindText ;-)

Delphi-Quellcode:
  if not node.HasChildren then begin
  Memo.Lines.BeginUpdate;
  try
    Memo.SelectAll;
    Memo.SelAttributes.Color := clBlack;
    sSearch   := node.Text;
    iSearchLen := length(sSearch);
    iLen      := length(Memo.Lines.Text);
    iPos      := Memo.FindText(node.Text,1,iLen,[]);
    while iPos <> -1 do begin
      Memo.SelStart := iPos;
      Memo.SelLength := iSearchLen;
      Memo.SelAttributes.Color:= clred;
      iPos := Memo.FindText(node.Text,iPos+iSearchLen,iLen,[]);
    end;
  finally
    Memo.SelLength := 0;
    Memo.Lines.EndUpdate;
  end;

lkz633 17. Okt 2003 15:27

Re: nicht nur erstes Vorkommnis in Memo markieren
 
Vielen vielen Dank fuer die tolle Unterstuetzung, so klappt es einwandfrei :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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