Форум: "Основная";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];
ВнизБлокирование событийных методов 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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.008 c