Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.29;
Скачать: CL | DM;

Вниз

Блокирование событийных методов On*   Найти похожие ветки 

 
Ученик   (2002-07-16 08:43) [0]

Есть дизайнер форм, например из Extension Library ( http://www.delphikingdom.com/mastering/poligon/extlib.htm),
выполняемый в RunTime, на форму помещен
PageControl, в режиме дизайна формы при выборе страниц PageControlа "мышкой" необходимо блокировать вызов метода TPageControl.OnChange, да и других тоже.
Есть ли универсальный способ блокирования вызова событийных методов объектов в RunTime ?


 
GenBr ©   (2002-07-16 08:56) [1]

ну наверное так YourComponent.YourEvent=nil;


 
Anatoly Podgoretsky ©   (2002-07-16 09:08) [2]

if csDesigning in ComponentState естестенно в каждом нужном тебе обработчике
Или ты говоришь об RunTime тогда действительно свойство обратчик:=nil;


 
Ученик   (2002-07-16 09:16) [3]

Проблема в том, что неизвестно какие события определены у объекта, и на каких повешены процедуры обработки. Речь идет об универсальном способе, т.е. на период дизайна формы отключать все событийные методы, встраивать в каждый проверку csDesigning как-то неправильно.


 
NickBy   (2002-07-16 16:44) [4]

Через RTTI получаеш список всех событий объекта и присваеваешь указателям nil.
Старые указатели желательно перед сбросом сохранить на случай если в дальнейшем форму необходимо будет вывести из режима редактирования.


 
Ученик   (2002-07-16 17:26) [5]

>NickBy
Спасибо, флажка значит никакого нету, интересно Delphi тоже так делает или там совсем по-другому ?


 
Skier ©   (2002-07-16 17:35) [6]

>Ученик
Флаг csDesigning можно убрать в run-time.
Хотя это некрасивый подход...


 
Anatoly Podgoretsky ©   (2002-07-16 17:41) [7]

Ученик (16.07.02 09:16)
Как раз это правильный метод и этот флаг предназначен именно для этой цели, разрешения конфликтов дизайн тайма
Но я до сих пор не понял о каком времени идет речь disign vs run time


 
Юрий Зотов ©   (2002-07-16 18:55) [8]

Раз уж Вы хотите использовать design-time"ские механизмы самой Delphi - так используйте их до конца. Это я к тому, что надо поступать так же, как потупает сама IDE.

Один-единственный вызов SetDesigning(True, True) для ВСЕЙ формы решает проблему. В конце - SetDesigning(False, True) для нее же.


 
Skier ©   (2002-07-16 18:57) [9]

>Юрий Зотов
Так короче - SetDesigning(True) и SetDesigning(False) :)


 
Ученик   (2002-07-16 19:05) [10]

>Юрий Зотов
Если Вы это мне, то именно это используется в дизайнерах форм, речь шла о блокировании вызова событийных методов на время пользовательского дизайна формы, которые разработчик определил при разработке программы.


 
Юрий Зотов ©   (2002-07-16 20:32) [11]

> Skier © (16.07.02 18:57)
Дефолтный параметр был указал специально - чтобы подчеркнуть его.

> Ученик (16.07.02 19:05)
О чем шла речь, я понял. Вы пробовали использовать у себя то, что я написал? Попробуйте. Если используемый Вами дизайнер написан правильно, то это решает вопрос.


 
Ученик   (2002-07-16 21:18) [12]

>Юрий Зотов
Если Вас не затруднит, как правильно нужно написать дизайнер форм, если условия следующие:

На форме 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 21:53) [13]

> как правильно нужно написать дизайнер форм

Так Вы пишете свой дизайнер? Или все-таки используете готовый, от Extension Library?

Если свой - советую бросить это занятие и использовать, например пакет Dream Controls. Почему бросить - поймете сами, посмотрев этот пакет. Одному человеку там работы где-то на год - да и то при условии, что о кухне Delphi он уже все или почти все знает.

Если готовый, то что значит Ваш вопрос - "как написать"? Он же уже написан. К сожалению, с дизайнером от Extension Library я не знаком, ничего о нем сказать не могу.

Но если дизайнер, какой бы он ни был, правильно создает design-time среду, то SetDesigning должно работать. Для всех событий всех компонентов - никакие PageControl здесь ни при чем.


 
Ученик   (2002-07-16 22:01) [14]

>Юрий Зотов
Спасибо, но это не ответ, а жаль.


 
Юрий Зотов ©   (2002-07-17 09:25) [15]

Это менно ТОТ ответ, который МОЖНО было дать на ТАКОЙ вопрос:
> "как правильно нужно написать дизайнер форм, если условия
> следующие: (далее про отключение PageControl.OnChange)"

Во-первых, при чем тут PageControl и OnChange? Отключается либо все разом (все события всех компонентов)), либо ничего. Это же дизайнер.

Во-вторых, так и непонятно, пишете Вы свой дизайнер, или используете готовый, от Extension Library.

В-третьих, если дизайнер (Ваш, или готовый - неважно), не кривой, то SetDesigning решает проблему (хотя по идее, это должен был сделать сам дизайнер). Если же кривой - ничем Вы не отключите.

В четвертых, что значит "как правильно нужно написать дизайнер форм"? Вы бы уж сразу спросили - "как правильно нужно написать свою Delphi". Что там мелочиться-то? А я бы быстренько, минут за 15 и строк за 100 рассказал, как это делается. Пустяк ведь, верно? И, безусловно, я это хорошо знаю - ведь уже не одну Delphi написал (хотя одну, сильно упрощенную, все же написал).

Так вот, учитывая ТАКУЮ формулировку вопроса, я и сказал: "если пишете дизайнер сами - бросайте". Надеюсь, понятно, почему?

И добавил - ищите Dream Controls. Потому что используемый Вами дизайнер (Ваш, или готовый - неважно), судя по возникшей проблеме - кривой. А с дизайнером от Dream Controls свою задачу Вы решите ровно за то время, которое требуется, чтобы бросить компонент на форму. И без всяких проблем.

А какого ДРУГОГО ответа на ТАКОЙ вопрос можно было ожидать?


 
Ученик   (2002-07-17 09:45) [16]

>Юрий Зотов
Вы хотя бы для приличия в исходники заглянули, не можете ответить - как Вы раньше говорили: прохожу мимо, чего умничать то.


 
MAxiMum ©   (2002-07-17 10:49) [17]

Ребята, а по-моему, вы оба правы только говорите на разных языках. Прислушайтесь друг к другу и не ругайтесь.


 
Skier ©   (2002-07-17 11:18) [18]

>Ученик
Я писал свой дизайнер форм.
Так, что если есть вопросы, попробую ответить...


 
Ученик   (2002-07-17 11:29) [19]

>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:50) [20]

>Ученик

Тебе нужно писать следующий обработчик для своего дизайнера
(который ты будешь "подсовывать" вместо 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:57) [21]

>Skyer
А сообщение "PageControl1Change" не появляется ?
Наверняка же компонент в палитре, если не сложно попробуй(те).


 
Skier ©   (2002-07-17 12:01) [22]

>Ученик
Я так понял что ты хочешь написать Дизайнер Форм "двумя щелчками
мыши" и при этом ещё хочешь чтобы я за тебя работал !
Извини, конечно, но в таком случае я беру самоотвод...


 
Ученик   (2002-07-17 12:07) [23]

>Skier
Извини, если обидел, в мыслях не было, дизайнер уже написан, маленькая проблема, хотел узнать моя или у всех, пробовал Extension Library, там тоже самое, сообщение появляется,
еще раз извини.


 
Skier ©   (2002-07-17 12:12) [24]

>Ученик
Да я не обиделся :)
А у тебя что есть возможность в Дизайнере писать свои
обработчики событий ? (Свой макро-язык что ли ??)


 
Ученик   (2002-07-17 12:16) [25]

>Skier
Нет событие определил разработчик при написании программы,
когда пользователь переходит в режим дизайна необходимо отключить обработку событый On????, в качестве примера взята проблема с PageControlом, пользователь писать обработчики
событий в моем дизайнере не может.


 
Skier ©   (2002-07-17 12:19) [26]

>Ученик
А как ты читаешь форму из файла через TReader ?


 
Skier ©   (2002-07-17 12:23) [27]

>Ученик


> А сообщение "PageControl1Change" не появляется ?



В догонку : если "перекрыть" IDesigner и написать
свой обработчик IsDesignMsg (как я показывал), то событие не должно
появляться...


 
Ученик   (2002-07-17 12:27) [28]

>Skier
Если речь идет о пользовательском состоянии контролов на форме, то оно читается из INI-файла.


 
Ученик   (2002-07-17 12:33) [29]

>Skier
А если IDesigner "перекрыто" и IsDesignMsg обработано и DispatchDesignHitTest (т.е. его аналог) определен ?
Я поэтому и попросил попробовать, но, видимо, неудачно )))


 
Skier ©   (2002-07-17 12:37) [30]

>Ученик

> оно читается из INI-файла

Советую не читать форму и состояние контролов из INI-файлов,
лучше написать свои классы TWriter и TReader (у меня сделанно
именно так). Конечно больше мороки, но это даст хорошую гибкость
и быстроту.
С таким подходом ты сможешь хранить формы в двоичном виде, а
следовательно писать их как в файл, так и в блоб-поле
(в базу данных тобиш).

И потом если тебе понадобиться хранить, например, картинку для TImage в INI-файле как ты будешь поступать ?

А через свой TWriter ты её совершенно спокойно запишешь...




Страницы: 1 вся ветка

Текущий архив: 2002.07.29;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.067 c
14-95561
Tahion
2002-06-25 10:15
2002.07.29
Как сделать, чтоб форма появлялась сама?


1-95401
Балков Евгений
2002-07-16 11:12
2002.07.29
Как запретить разворачивание и сворачивание окна


1-95445
esprit_bel
2002-07-17 04:53
2002.07.29
Дирректория


7-95575
3d[Power]
2002-05-13 00:06
2002.07.29
ping


14-95515
Raiv
2002-07-02 15:23
2002.07.29
Где можно скачать TeeChartPro VCL для