Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
4-95627
Yerba
2002-05-21 14:29
2002.07.29
О установке своего языка


1-95337
Victor N Golutvin
2002-07-17 15:36
2002.07.29
Delphi 6. INDY - инструменты. Как???


1-95423
Juliet
2002-07-16 13:06
2002.07.29
Как определить версию Word


1-95310
Romeo
2002-07-17 16:39
2002.07.29
Регистры SSE


3-95181
Alecsandr
2002-07-05 17:07
2002.07.29
Использование DbRichEdit и БД Paradox FormattedMemo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский