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/)
-   -   In TMemo zu bestimmter Line Scrollen? (https://www.delphipraxis.net/156903-tmemo-zu-bestimmter-line-scrollen.html)

schwa226 20. Dez 2010 09:25

In TMemo zu bestimmter Line Scrollen?
 
Hallo!

Wie der Titel schon sagt, möchte ich bei einer TMemo zu einer bestimmten Zeile scrollen.

Ich durchsuche die Lines nach einem Text und will dann dort hin scrollen.
Geht das irgendwie?

Delphi-Quellcode:
Log_Memo.Perform(EM_LINESCROLL, 0, ActualLine);
Geht auf jeden Fall nicht :(

Am besten möchte ich wenn möglich diese Line dann auch noch farblich hervorheben!

DeddyH 20. Dez 2010 09:42

AW: In TMemo zu bestimmter Line Scrollen?
 
Solange die anzuscrollende Zeile hinter der aktuellen Caretposition liegt, geht das bei mir in einem kleinen Testprojekt sehr wohl.

[edit] So klappt es anscheinend:
Delphi-Quellcode:
procedure TFormTest.Button1Click(Sender: TObject);
const TEXTTOSEARCH = 'Suchtext';
var WantedLine, StringPos, CurrentPos: integer;
begin
  //aktuelle Cursorposition merken
  CurrentPos := Memo1.SelStart;
  //Cursor auf Textanfang
  Memo1.SelStart := 0;
  //Zeile des Suchtextes ermitteln
  StringPos := Pos(TEXTTOSEARCH,Memo1.Text) - 1;
  WantedLine := SendMessage(Memo1.Handle,EM_LINEFROMCHAR,StringPos,0);
  //jetzt dorthin scrollen
  SendMessage(Memo1.Handle,EM_LINESCROLL,0,WantedLine);
  //und Cursor wieder zurücksetzen
  Memo1.SelStart := CurrentPos;
end;
[/edit]

schwa226 20. Dez 2010 10:03

AW: In TMemo zu bestimmter Line Scrollen?
 
Danke für deine Hilfe!

Habe nun etwas zusammengebastelt:

Delphi-Quellcode:
procedure TfrmMain.btSearchClick(Sender: TObject);
var
  i : integer;
  Found : Boolean;
begin
  Found := False;

  for i := ActualLine to Log_Memo.Lines.Count - 1 do
  begin

    if AnsiPos(Uppercase(edSearch.Text), Uppercase(Log_Memo.Lines[i])) <> 0 then
    begin
      Found := True;
      ActualLine := i + 1;
      Log_Memo.SelStart := Position;
      Log_Memo.SelLength := Length(Log_Memo.Lines[i]);
      Log_Memo.SetFocus;
    end;

    Position := Position + Length(Log_Memo.Lines[i]) + Length(#13#10);
    if Found then
      Break;
  end;

  if not Found then
  begin
    ActualLine := 0;
    Position := 0;
    ShowMessage('Finished search!');
  end;
end;
ActualLine und Position sind global definiert.
Geht ganz gut, und es wird auch gleich der Text markiert.

die Suchfunktion sucht immer nach dem nächsten Text und fängt wieder von vorne an wenn das Memo aus ist.

DeddyH 20. Dez 2010 10:06

AW: In TMemo zu bestimmter Line Scrollen?
 
Achso, da hatte ich "farblich hervorheben" falsch interpretiert, mit Markieren ist das etwas einfacher. Naja, Hauptsache, es funktioniert jetzt :)

schwa226 20. Dez 2010 10:38

AW: In TMemo zu bestimmter Line Scrollen?
 
Ja, danke!

Markieren reicht völlig aus. Durch das Markieren wird auch Automatisch auf die Position gescrolled.


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