PDA

View Full Version : افزودن خط به Memo بدون اینکه کرسر به خط آخر برود



seyed_farid
شنبه 06 شهریور 1400, 10:48 صبح
با سلام
من لاگ اتفاقات برنامه رو در ممو ثبت میکنم.
وقتی ممو را بخوام ببینم و بالا و پایین برم؛ اگر در همین حین اتفاقی بیاد، کرسر یهو به خط آخر میره.
راهی هست که فقط متن جدید اضافه بشه به متن قبلی ولی نشانکر جابجا نشه؟

Valadi
دوشنبه 08 شهریور 1400, 00:18 صبح
https://stackoverflow.com/questions/31913076/cursor-position-change-in-tmemo
procedure TSomeMemo.OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT] then
OnMouseDown(Sender, mbLeft, Shift, 0, 0);
end;

procedure TSomeMemo.OnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
row,col: integer;
begin
if Button = mbLeft then
begin
row := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0);
col := SelStart - SendMessage(Handle, EM_LINEINDEX, row, 0);
...
end;
end;

seyed_farid
دوشنبه 08 شهریور 1400, 09:37 صبح
ممنون از پاسختون
ولی
من میخوام وقتی درحال دیدن و خواندن ممو هسنم وقتی با دستور Memo1.lines.add(text); لاگ رو مینویسم تو ممو، ممو نره خط آخر.
ضمنا من مستقیم بوسیله کیبورد چیزی نمی نویسم.

seyed_farid
سه شنبه 09 شهریور 1400, 21:17 عصر
سلام
جهت استفاده دوستانی که مشکل من رو داشتند.

procedure TMainForm.AddToLog(s : string);
var i, j, LineChar, LastLine : Integer;
begin
LineChar := SendMessage(Memo1.Handle,EM_charfrompos,0, (Memo1.ClientHeight-1) shl 16 );
LastLine := (LineChar and $ffff0000) shr 16;

if LastLine < Memo1.Lines.Count
then
begin
j := Memo1.SelLength;
i := SendMessage(Memo1.Handle,EM_GETFIRSTVISIBLELINE,0, 0);

Memo1.Lines.BeginUpdate;
try
Memo1.Lines.Add(s);
Memo1.SelStart := i;
Memo1.SelLength := j;
Memo1.Perform(EM_SCROLLCARET, i, j)
finally
Memo1.Lines.EndUpdate;
end;
end
else
Memo1.Lines.Add(s);
end;