PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AutoScrollen in TMemo bei Änderung


Felix Kaiser
18.02.2002, 18:18
Ich hab schon Stunden um Stunden in das Thema investiert, Möglichkeit um Möglichkeit probiert und die beste Lösung ergab bisher ein nur teilweise zuverlässiges Autoscrolling.

Ich habe eine TMemo Komponente. In diese lasse ich jetzt Zeilen loggen. Aber das Sichtfeld soll mitscrollen. Die Funktion ScrollBy nützt mir hier nichts, da ich bis zu 80 Logs habe, die per Auswahl einzeln anselektiert werden können, alle Logs arbeiten Realtime, werden also stetig erweitert. Nun hab ich versuch über die Components Eigenschaft auf mögliche Subkomponenten von TMemo (Scrollbars?) zuzugreifen, jedoch enthält es keine weiteren Komponenten. Die letzte Lösung, welche schon relativ gut arbeitete funktionierte, in dem ich eine ScrollBox erzeugt habe, die Memo Komponente dort rein platziert mit Align=alTop und die Größe der Memo Komponente dann der Zeilenanzahl angepasst hatte. Jedoch arbeitet die Anzeige der Scrollbars von TScrollBox unzuverlässig und arbeitet mit zu großen Toleranzwerten, da teilweise bis zu 12 Zeilen ausgeblendet werden oder plötzlich ein Block von 12 freien Zeilen am unteren Ende der vertikalen Scrollleiste zu sehen ist. Die Berechnung wird zu dem ungenau, da die Memokomponente mit Wordwrap (Zeilenumbruch) arbeiten muss und ich somit beim Errechnen auf Zeilenumbrüche eingehen muss. Zu dem bekomme ich teilweise auch falsche Werte für Clientgrößen der betroffenen Komponenten geliefert, was zu dem die Arbeitsweise unzuverlässig macht.

Atm sind mir absolut alle Ideen ausgegangen und ich suche dringenst nach einer Lösung für das ganze Problem.

TRichEdit hatte mir im übrigen auch noch nich geholfen, ListBoxen fallen weg, da ich Textmarkierungen wie im Editor benötige für Copy´n´Paste Funktionen, auch zeilenübergreifend.


Onkelz
18.02.2002, 21:41
Hi Kollege, ;)

procedure ScrollMemo(Memo: TMemo; Direction: Char);
begin
case direction of
´d´:
begin
SendMessage(Memo.Handle, { HWND of the Memo Control }
WM_VSCROLL, { Windows Message }
SB_PAGEDOWN, { Scroll Command }
0) { Not Used }
end;


´u´:
begin
SendMessage(Memo.Handle, { HWND of the Memo Control }
WM_VSCROLL, { Windows Message }
SB_PAGEUP, { Scroll Command }
0); { Not Used }
end;
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
ScrollMemo(Memo1, ´d´);
end;

(Tipp ist von hier (http://www.swissdelphicenter.ch/de/showcode.php?id=205))

Onkelz

Felix Kaiser
18.02.2002, 22:29
Hossa, thx Kollege! :D
Es ist die Idee mit WM_VSCROLL. Dein Code so bringt mir noch nichts, aber die Definition der Botschaft in der API SDK bringt den Rest:

SendMessage(Memo1.Handle,WM_VSCROLL,SB_TOP,0);
Scrollt nach ganz oben, ganz links

SendMessage(Memo1.Handle,WM_VSCROLL,SB_BOTTOM,0);
Scrollt nach ganz unten, ganz rechts, wenn man WordWrap benutzt, isses eh egal. Ansonsten kann man mit der API Funktion GetScrollPos prüfen ob der bei Left=0 ist und halt so oft eine Botschaft zum nach links scrollen aufrufen.

Danke nochmals, das Thema wäre somit beendet :)