![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Блокирование событийных методов On* [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Ученик © (2002-07-16 08:43:00)Есть дизайнер форм, например из Extension Library ( http://www.delphikingdom.com/mastering/poligon/extlib.htm),
выполняемый в RunTime, на форму помещен
PageControl, в режиме дизайна формы при выборе страниц PageControlа "мышкой" необходимо блокировать вызов метода TPageControl.OnChange, да и других тоже.
Есть ли универсальный способ блокирования вызова событийных методов объектов в RunTime ?
Skier (2002-07-17 12:37:00) [1]>Ученик
> оно читается из INI-файла
Советую не читать форму и состояние контролов из INI-файлов,
лучше написать свои классы TWriter и TReader (у меня сделанно
именно так). Конечно больше мороки, но это даст хорошую гибкость
и быстроту.
С таким подходом ты сможешь хранить формы в двоичном виде, а
следовательно писать их как в файл, так и в блоб-поле
(в базу данных тобиш).
И потом если тебе понадобиться хранить, например, картинку для TImage в INI-файле как ты будешь поступать ?
А через свой TWriter ты её совершенно спокойно запишешь...
Ученик (2002-07-17 12:33:00) [2]>Skier
А если IDesigner "перекрыто" и IsDesignMsg обработано и DispatchDesignHitTest (т.е. его аналог) определен ?
Я поэтому и попросил попробовать, но, видимо, неудачно )))
Ученик (2002-07-17 12:27:00) [3]>Skier
Если речь идет о пользовательском состоянии контролов на форме, то оно читается из INI-файла.
Skier (2002-07-17 12:23:00) [4]>Ученик
> А сообщение "PageControl1Change" не появляется ?
В догонку : если "перекрыть" IDesigner и написать
свой обработчик IsDesignMsg (как я показывал), то событие не должно
появляться...
Skier (2002-07-17 12:19:00) [5]>Ученик
А как ты читаешь форму из файла через TReader ?
Ученик (2002-07-17 12:16:00) [6]>Skier
Нет событие определил разработчик при написании программы,
когда пользователь переходит в режим дизайна необходимо отключить обработку событый On????, в качестве примера взята проблема с PageControlом, пользователь писать обработчики
событий в моем дизайнере не может.
Skier (2002-07-17 12:12:00) [7]>Ученик
Да я не обиделся :)
А у тебя что есть возможность в Дизайнере писать свои
обработчики событий ? (Свой макро-язык что ли ??)
Ученик (2002-07-17 12:07:00) [8]>Skier
Извини, если обидел, в мыслях не было, дизайнер уже написан, маленькая проблема, хотел узнать моя или у всех, пробовал Extension Library, там тоже самое, сообщение появляется,
еще раз извини.
Skier (2002-07-17 12:01:00) [9]>Ученик
Я так понял что ты хочешь написать Дизайнер Форм "двумя щелчками
мыши" и при этом ещё хочешь чтобы я за тебя работал !
Извини, конечно, но в таком случае я беру самоотвод...
Ученик (2002-07-17 11:57:00) [10]>Skyer
А сообщение "PageControl1Change" не появляется ?
Наверняка же компонент в палитре, если не сложно попробуй(те).
Skier (2002-07-17 11:50:00) [11]>Ученик
Тебе нужно писать следующий обработчик для своего дизайнера
(который ты будешь "подсовывать" вместо IDesigner)
function TSomeClass.IsDesignMsg(Sender: TControl;
var Message: TMessage): Boolean;
begin
WM_MOUSEFIRST..WM_MOUSELAST: begin
//..........................
Result := MouseMessage(Sender, Message);
//..........................
end; //WM_MOUSEFIRST..
end;
метод MouseMessage (с некоторыми моими внутренними переменными,
лень убирать :) )
function TSomeClass.MouseMessage(ASender: TControl;
const Message: TMessage) : Boolean;
//эта "плюшка" будет "переключать" страницы PageControl-а
// (в нашем случае)
function DispatchDesignHitTest(Sender: TControl; Message: TWMMouse): Boolean;
begin
Message.Msg := CM_DESIGNHITTEST;
Message.Result := 0;
Sender.Dispatch(Message);
Result := (Message.Result <> 0);
end; //DispatchDesignHitTest
var
AShift : TShiftState;
ADesignMessage : Boolean;
begin
Result := FRubberBandPainting;
if not Result then begin
ADesignMessage := DispatchDesignHitTest(ASender, TWMMouse
(Message));
Result := Result or not ADesignMessage;
end; //if
AShift := KeysToShiftState(TWMMouse(Message).Keys);
case Message.Msg of
WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN : begin
if Result and (Message.Msg = WM_LBUTTONDOWN) then
FDesignHitDispatched := False
else
FDesignHitDispatched := True;
DesignMouseDown(ASender, GetMouseButton(Message.Msg), AShift,
TWMMouse(Message).XPos, TWMMouse
(Message).YPos);
end; //WM_LBUTTONDOWN
WM_MOUSEMOVE : begin
DesignMouseMove(ASender, AShift, TWMMouse(Message).XPos,
TWMMouse(Message).YPos);
end; //WM_MOUSEMOVE
WM_LBUTTONUP, WM_RBUTTONUP : begin
DesignMouseUp(ASender, GetMouseButton(Message.Msg), AShift,
TWMMouse(Message).XPos, TWMMouse(Message).YPos);
end; //WM_LBUTTONDOWN
end; //case
end;
Ученик (2002-07-17 11:29:00) [12]>Skier
На форме PageControl c несколькими страницами, разработчик определил событие TPageControl.OnChange, например
procedure TForm1.PageControl1Change(Sender: TObject);
begin
ShowMessage("PageControl1Change")
end;
Пользователь по кнопке переходит в режим дизайна формы, т.е. вызывается TFriendForm(Self).SetDesigning(True, True) и определен Form1.Designer, пользователь кликает "мышкой" по второй закладке PageControla, должно произойти переключение страниц, но сообщение "PageControl1Change" появиться не должно,
как это происходит в Delphi.
Skier (2002-07-17 11:18:00) [13]>Ученик
Я писал свой дизайнер форм.
Так, что если есть вопросы, попробую ответить...
MAxiMum (2002-07-17 10:49:00) [14]Ребята, а по-моему, вы оба правы только говорите на разных языках. Прислушайтесь друг к другу и не ругайтесь.
Ученик (2002-07-17 09:45:00) [15]>Юрий Зотов
Вы хотя бы для приличия в исходники заглянули, не можете ответить - как Вы раньше говорили: прохожу мимо, чего умничать то.
Юрий Зотов (2002-07-17 09:25:00) [16]Это менно ТОТ ответ, который МОЖНО было дать на ТАКОЙ вопрос:
> "как правильно нужно написать дизайнер форм, если условия
> следующие: (далее про отключение PageControl.OnChange)"
Во-первых, при чем тут PageControl и OnChange? Отключается либо все разом (все события всех компонентов)), либо ничего. Это же дизайнер.
Во-вторых, так и непонятно, пишете Вы свой дизайнер, или используете готовый, от Extension Library.
В-третьих, если дизайнер (Ваш, или готовый - неважно), не кривой, то SetDesigning решает проблему (хотя по идее, это должен был сделать сам дизайнер). Если же кривой - ничем Вы не отключите.
В четвертых, что значит "как правильно нужно написать дизайнер форм"? Вы бы уж сразу спросили - "как правильно нужно написать свою Delphi". Что там мелочиться-то? А я бы быстренько, минут за 15 и строк за 100 рассказал, как это делается. Пустяк ведь, верно? И, безусловно, я это хорошо знаю - ведь уже не одну Delphi написал (хотя одну, сильно упрощенную, все же написал).
Так вот, учитывая ТАКУЮ формулировку вопроса, я и сказал: "если пишете дизайнер сами - бросайте". Надеюсь, понятно, почему?
И добавил - ищите Dream Controls. Потому что используемый Вами дизайнер (Ваш, или готовый - неважно), судя по возникшей проблеме - кривой. А с дизайнером от Dream Controls свою задачу Вы решите ровно за то время, которое требуется, чтобы бросить компонент на форму. И без всяких проблем.
А какого ДРУГОГО ответа на ТАКОЙ вопрос можно было ожидать?
Ученик (2002-07-16 22:01:00) [17]>Юрий Зотов
Спасибо, но это не ответ, а жаль.
Юрий Зотов (2002-07-16 21:53:00) [18]> как правильно нужно написать дизайнер форм
Так Вы пишете свой дизайнер? Или все-таки используете готовый, от Extension Library?
Если свой - советую бросить это занятие и использовать, например пакет Dream Controls. Почему бросить - поймете сами, посмотрев этот пакет. Одному человеку там работы где-то на год - да и то при условии, что о кухне Delphi он уже все или почти все знает.
Если готовый, то что значит Ваш вопрос - "как написать"? Он же уже написан. К сожалению, с дизайнером от Extension Library я не знаком, ничего о нем сказать не могу.
Но если дизайнер, какой бы он ни был, правильно создает design-time среду, то SetDesigning должно работать. Для всех событий всех компонентов - никакие PageControl здесь ни при чем.
Ученик (2002-07-16 21:18:00) [19]>Юрий Зотов
Если Вас не затруднит, как правильно нужно написать дизайнер форм, если условия следующие:
На форме PageControl c несколькими страницами, разработчик определил событие TPageControl.OnChange, например
procedure TForm1.PageControl1Change(Sender: TObject);
begin
ShowMessage("PageControl1Change")
end;
Пользователь по кнопке переходит в режим дизайна формы, т.е. вызывается TFriendForm(Self).SetDesigning(True, True) и определен Form1.Designer, пользователь кликает "мышкой" по второй закладке PageControla, должно произойти переключение страниц, но сообщение "PageControl1Change" появиться не должно,
как это происходит в Delphi.
Юрий Зотов (2002-07-16 20:32:00) [20]> Skier © (16.07.02 18:57)
Дефолтный параметр был указал специально - чтобы подчеркнуть его.
> Ученик (16.07.02 19:05)
О чем шла речь, я понял. Вы пробовали использовать у себя то, что я написал? Попробуйте. Если используемый Вами дизайнер написан правильно, то это решает вопрос.