In einem TRichedit soll beim Betätigen der rechten Maustaste die Zeile unter dem Mauscursor markiert und ein Kontextmenü (Popup-Menu) geöffnet werden. Das Richedit ist 'ReadOnly' und Wordwrap ist auf 'False' gesetzt. Die Textanzeige dient hauptsächlich zur Information über den Programmfortschritt und kann kurze 'Info'-Zeilen enthalten die auf jeden Fall lesbar bleiben sollen (siehe Anhang)
Code:
procedure TGL4Mainform.Richedit1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var RE: TRichedit;
Line, Offset, Hpos, len:Integer;
P: TPointL;
begin
RE:= sender as TRichedit;
if (button = mbright) and (RE.Lines.Count > 0) Then with RE do
begin
p.x:= x;
p.y:= y;
Offset := Perform(EM_CHARFROMPOS, 0, Integer(@p));
Line := Perform(EM_LINEFROMCHAR, Offset, 0);
HPos := Perform(EM_LINEINDEX, Line, 0);
len:= perform(EM_LINELENGTH,Hpos,0);
selstart:= Hpos;
sellength:= len;
x:= clientorigin.x + x;
y:= clientorigin.y + y;
end;
popupmenu4.Popupcomponent:= RE;
popupmenu4.Popup(x,y);
Das funktioniert im Prinzip korrekt. Wie kann man aber verhindern, dass der Text automatisch nach links scrollt, wenn die markierte Zeile über den Rand des Clientbereiches hinausragt?