Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

прокрутка Richedit [Delphi, Windows]


Flea ©   (2006-01-31 18:15:00) 

добрый день.
встретился с небольшим затруднением по поводу прокрутки текста в richedit именно в КОЛ:

есть форма, на ней richedit. свойство wordwrap установлено true, ну и скроллбары отображаются. в обработчик onformcreate добавлен код для загрузки rtf файла и прокрутки текста вниз:

richedit2.RE_LoadFromFile('file.rtf',rertf,false);
SendMessage(richedit2.Handle,WM_VSCROLL,sb_bottom,0);

в результате текст прокручивается неправильно - последняя строка текста оказывается не внизу контрола, а выше середины, текст как бы "перепрокручивается".
если потом кликнуть по скроллбару или повернуть колесо мыши - текст прыгает вниз, туда где он должен быть, а это прыганье раздражает.

в таком же проекте с VCL компонентами текст прокручивается нормально до низа. кроме того, если то же самое сообщение в KOL проекте отсылать по нажатию кнопки, текст прокручивается до конца.

подскажите, как сделать при старте программы прокрутку именно до самого низа?


Vladimir Kladov   (2006-02-08 15:44:00) [1]

про ричэдит ничего не скажу, не знаю. Я его редко использую.

Про отложение на время нежелательных действий - сами знаете как: сделать своим кодом в OnFormCreate - если в MCK.


homm   (2006-02-08 10:48:00) [2]

Владимир, может чего и по сабжу скажете? Я пробывал даже откладывать принудительное создание RichEdit в его конструкторе. Все равно
SendMessage(richedit2.Handle,WM_VSCROLL,sb_bottom,0);
обрабатывается так как будто высота контрола 64 (значение по умолчанию).


homm   (2006-02-08 10:45:00) [3]

По этой теме вопрос остался незамеченым ;)

Если задать свойство формы WindowSate = wsMaximized то не приходит сообщение WM_SHOWWINDOW, а как следствие не вызывается обработчик OnShow.

Надо переделать SetWindowSate чтобы она не создавала окно принудительно, а запоминала статос до времени создания окна.


Flea   (2006-02-02 22:18:00) [4]

хм, просто у меня и без всяких align прокрутка при старте глючит...


homm   (2006-02-02 21:37:00) [5]

Как по твоему Align текста может повлиять на высоту компонента?


Flea   (2006-02-02 16:51:00) [6]

ты имеешь в виду align компонента на форме или текста в компоненте?


homm   (2006-02-02 08:56:00) [7]

От чего получается - все просто, а как вот избавится - не знаю.
Дело то в том, что SendMessage(richedit2.Handle,WM_VSCROLL,sb_bottom,0); выполняется раньше чем происходит выравнивание в соответствии со свойством align. Вот и получается что прокручивается в конец для одной высоты окна richedit, а потом происходит выравнивание и высота меняется.

А вот насчет WndProcShowHide. Туда WM_SHOWWINDOW вообще не попадает, а с вышеупомянутой строкой все нормально.


Flea   (2006-02-02 01:37:00) [8]

никаких идей нет отчего так с прокруткой получается?


homm   (2006-01-31 20:06:00) [9]

Могу сказать, что в проекте используется свойство Align, и для RichEdit в том числе.

Решение этой пробле не нашел, зато нашел другую проблему:
если в обротчике сделать так:
procedure TForm1.KOLForm1 FormCreate(Sender: PObj);
Var     I: integer;
begin
   {ваш код}
    Form.WindowState := wsMaximized;
   {ваш код}
end;

то обработчик
procedure TForm1.KOLForm1 Show(Sender: PObj);
уже не выполняется.

Думаю ошибка вот где:
function WndProcShowHide( Sender: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
var IsVisible: Boolean;
begin
 if Msg.message = WM_SHOWWINDOW then
 if Msg.hwnd = Sender.Handle then
 begin
   IsVisible := IsWindowVisible( Sender.Handle );
   if LongBool( Msg.wParam ) then // <-- некоректная проверка, может прийти и Maximize
   begin
     Sender.fVisible := TRUE;
     if not IsVisible then
     if Assigned( Sender.FOnShow ) then
       Sender.FOnShow( Sender );
   end
     else
   begin
     Sender.fVisible := FALSE;
     if IsVisible then
     if Assigned( Sender.FOnHide ) then
       Sender.FOnHide( Sender );
   end;
 end;
 Result := FALSE;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо