Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Блокирование событийных методов On* [D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2

Ученик ©   (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)
О чем шла речь, я понял. Вы пробовали использовать у себя то, что я написал? Попробуйте. Если используемый Вами дизайнер написан правильно, то это решает вопрос.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо