![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Scrollbar & Enabled - bug?
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, что ли.