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

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

Scrollbar & Enabled - bug?


Страницы:   1 2

HCode ©   (2006-02-19 18:04:00) 

procedure TForm1.MainFormFormCreate(Sender: PObj);
begin
 ScrollBar1.Enabled:= false; // Не работает!
 //  Button1.Visible:= false; // Работает.
end;

Поверхностная отладка показала, что при вызове SetEnabled - ScrollBar1.fHandle =0.

P.S. Версия KOL - 2.33


Vladimir Kladov   (2006-02-20 18:55:00) [21]

А зачем тогда вообще посылать  сообщение? Я бы мог прямо в WM_CREATE и сделать все что нужно. Но увы...

Я же говорю: есть еще OnShow.


HCode   (2006-02-20 17:47:00) [22]


> Ну хорошо, в OnFormCreate не прокатывает, последняя инстанция,
>  что ли. Есть еще OnShow (только флажок добавить, что показ
> идет в первый раз), там и сделать.

Уважаемый Владимир, разумеется, прежде чем сообщить сюда об этой ошибке я попробывал вызывать ScrollBar1.Enabled:= false; в OnFormCreate, но к сожалению это не помогло.


ECM   (2006-02-20 17:08:00) [23]

Да нет, никаких мух и слонов...:)
Я думаю - вариант с заменой Post на Send - ставит всё на свои места
кода не увеличивает - глюки вроде не добавляет...
я в письме забросил исправление...


Vladimir Kladov   (2006-02-20 16:15:00) [24]

Ну хорошо, в OnFormCreate не прокатывает, последняя инстанция, что ли. Есть еще OnShow (только флажок добавить, что показ идет в первый раз), там и сделать.

А вообще из мухи слона делаете. Что за надобность такая скроллбар запрещать (вдруг). Не проще ли сделать, чтобы его не было видно, пока он не нужен.

а жирных строк в коде я не вижу. Dolphin'ом смотрю, а он не показывает. (Иначе было бы очень весело грузить некоторые ветки на полторы сотни сообщений в браузере)


ECM   (2006-02-20 14:50:00) [25]


> Только не в NewScrollbar, а в WndProcScrollBar реакцией
> на WM_CREATE. В NewScrollbar нет еще хендела

Это как раз понятно...это касаемо первого варианта решения [3]
Я имел ввиду второй вариант решения (может я слишком сумбурно описал)
т.е. всмыле что особой разницы между вызовом CreateWindow в OnFormCreare и в функции NewScrollBar нет... :))


homm   (2006-02-20 12:36:00) [26]


> Тайный смысл почему тут используется PostMessage (а не прямая
> инициализация в NewScrollbar или уж в крайнем случае SendMessage)
> мне неясен...
Только не в NewScrollbar, а в WndProcScrollBar реакцией на WM_CREATE. В NewScrollbar нет еще хендела, и
Sender.SBPageSize := Sender.fSBPageSize;
идентично
Sender.fSBPageSize := Sender.fSBPageSize;

2 Vladimir Kladov

> ну так в чем проблема? Трудно вызвать GetWndowHandle, что ли.
По-моему это откровенная грубость. Зачем так на новичков нападать?


ECM   (2006-02-20 11:41:00) [27]

Посмотрел ситуацию...

> Трудно вызвать GetWndowHandle, что ли.

Это, конечно, первое что приходит в голову - но, к сожалению, дела не меняет..:(

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
 ScrollBar1.CreateWindow;
 ScrollBar1.Enabled := FALSE;
end;

Хендл окна создается - запрет его тоже проходит нормально...

Но, ScrollBar1 всё равно в конце-концов получается  Enabled = TRUE.

Происходит это из-за отложенной инициализации ScrollBar-a при создании:
//[function WndProcScrollBar]

function WndProcScrollBar( Sender: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
 Result := False;
 case Msg.message of
   WM_CREATE:
     PostMessage(Sender.Handle, KSB_INITIALIZE, KSB_KEY, KSB_KEY);

   KSB_INITIALIZE:
     if (Msg.wParam = Msg.lParam) and (Msg.wParam = KSB_KEY) then
     begin
       Sender.SBPageSize := Sender.fSBPageSize;
       Sender.SBMinMax := Sender.fSBMinMax;
       Sender.SBPosition := Sender.fSBPosition;
     end;
 end;
end;


Жирные строки (даже каждая в отдельности) приводит к тому, что окно
скроллбара снова оказывается незапрещенным.

Тайный смысл почему тут используется PostMessage (а не прямая инициализация в NewScrollbar или уж в крайнем случае SendMessage) мне неясен...

У меня получилось исправить сей момент двумя способами:

1) Заменить PostMessage на SendMessage

function WndProcScrollBar( Sender: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
 Result := False;
 case Msg.message of
   WM_CREATE:
      SendMessage(Sender.Handle, KSB_INITIALIZE, KSB_KEY, KSB_KEY);

   KSB_INITIALIZE:
     if (Msg.wParam = Msg.lParam) and (Msg.wParam = KSB_KEY) then
     begin
       Sender.SBPageSize := Sender.fSBPageSize;
       Sender.SBMinMax := Sender.fSBMinMax;
       Sender.SBPosition := Sender.fSBPosition;
     end;
 end;
end;


2) Заставить выполниться инициализацию до запрета ScrollBar-a (пока не годится для MCK):

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
 ScrollBar1.CreateWindow;
 Applet.ProcessMessages;
 ScrollBar1.Enabled := FALSE;
end;


HCode   (2006-02-19 22:50:00) [28]

В смысле? В KOL.SetEnabled?


Vladimir Kladov   (2006-02-19 21:56:00) [29]

ну так в чем проблема? Трудно вызвать GetWndowHandle, что ли.


Страницы:   1 2

Наверх

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