delphi memo как получить размера текста в пикселях или же индекс самой длинной строки в пикселях

Как получить размера текста в пикселях или же индекс самой длинной строки в пикселях

Мне нужно заменить стандартный горизонт скрол на свой но что бы он верно работал нужно знать максимальную ширину текста в текущий момент в memo как ее найти

Перебирать каждую строку? долго очень нагрузить систему.

в

Winapi.Windows.GetTextExtentPoint32(Dc, Ln, Length(Ln), Siz); 

впихивать целый текст долго работает

DrawText(DC,PChar(Ln),Length(Ln),Rect,DT_LEFT or DT_CALCRECT);

так же долго работает при больших текстах

Может в win api есть какое сообщение которое вернет индекс самой длиной строки

Любой способ с хорошей производительность подойдет

я включил бары и функции GetScrollRange GetScrollPos начали отвечать но они отвечают только если ShowScrollBar( true ); я могу включать его когда нужно замерить и выключить после замера и что бы он не моргал использовать WM_SETREDRAW но handel бара не знаю пока оправляю всему memo а можно как то узнать handle Vbar Hbar -oв?

   SendMessage(Memo2.Handle, WM_SETREDRAW, Ord(false), 0);
   b:=ShowScrollBar( Memo2.Handle,SB_VERT,true);

   fillchar(Inf,sizeof(Inf),0);
   Inf.cbSize:=sizeof(Inf);
   b:=GetScrollInfo(Memo2.Handle,SB_VERT,Inf);

    L:=0;
   b:=GetScrollRange( Memo2.Handle,SB_VERT,H,L);
   H:=GetScrollPos ( Memo2.Handle,SB_VERT);

   Edit1.Text:= L.ToString+ ' '+H.ToString;
      showmessage('s');
   b:=GetScrollRange( Memo2.Handle,SB_HORZ,H,L);
   H:=GetScrollPos ( Memo2.Handle,SB_HORZ);

   b:=ShowScrollBar( Memo2.Handle,SB_VERT,false);
   SendMessage(Memo2.Handle, WM_SETREDRAW, Ord(true), 0);

Ответы (0 шт):