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

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

Необходимо определить были ли пороизведенны изменения на форме [D7, WinXP]


Страницы:   1 2

Phoenix ©   (2007-07-12 07:31:00) 

Стоит такая задача, необходимо определить были ли пороизведенны изменения на форме или нет, если да то на закрытие выдать сообщение о необходимости сохранение изменений. Проблема в том что форма большая, всего на ней много и проверять проводились ли изменения в каждом компоненте достаточно долго, есть ли другие способы?


vpbar   (2007-07-12 14:20:00) [1]

Млин. Ручками надежнее всего. Выставить флаг в нужных OnChange. Ведь не все OnChange нужно обрабатывать.
А если всем ставить тогда нужно поверять стоит ли там уже обработчик и если да то вызывать и его тоже.
Алгоритм примерно такой.
var Hash:THash;
....
for Control in Form.Controls do  begin
if Control.OnChange<>nil then Hash.AddKeyValue(Control,Control.OnChange);
Control.OnChange=MyOnChange;
end;
....
procedure MyOnChange(Sender:Tobject...);
var proc:TOnChange;
begin
 if Hash.ExistKey(Sender) then begin
        proc:=  TOnChange(Hash.GetValueByKey(Sender));
        proc(sender....);
 end;
if not FIsChanged then FIsChanged:=true;
end;


Stanislav   (2007-07-12 14:09:00) [2]

Phoenix ©   (12.07.07 13:58) [20]
если будешь использовать [14] его нужно немного изменить под твою программу.


Phoenix   (2007-07-12 13:58:00) [3]

>На что автор сказал, что боится вручную пропустить какой-либо компонент.
>Поэтоу я и предложил [13]
Стало любопытно , какой всё же вариант лучше ваши ли предложенный в ответе 14?


engine   (2007-07-12 13:47:00) [4]

> [18] vpbar ©   (12.07.07 13:31)

Ну такие советы кроме меня уже давали


> [10] homm ©   (12.07.07 12:20)
> Выделяешь их все, потом на вкладку Events инспектора объетов,
> даблклик по OnChange



> [7] StriderMan ©   (12.07.07 11:54)
> событие OnChange. повесить туда ОДИН одбработчик


На что автор сказал, что боится вручную пропустить какой-либо компонент.
Поэтоу я и предложил [13]


vpbar   (2007-07-12 13:31:00) [5]

>>engine ©   (12.07.07 12:25) [13]
Осторожней с такими советама. А если у компонента уже установлен обработчик OnChange, тогда глюк


engine   (2007-07-12 12:28:00) [6]

> [13] engine ©   (12.07.07 12:25)
> Попробуй в OnCreate

В OnCreate формы


Phoenix   (2007-07-12 12:27:00) [7]

>За время обсуждения в этой ветки, ты бы уже успел навешать на все >компоненты нужный обработчик, даже если бы их штук 100 было :)
Это вопрос на перспективу :) Пока предлагают варианты ответов я тут пытаюсь с rtf подружится.. но это уже совсем другая история...


ЮЮ   (2007-07-12 12:27:00) [8]

P.S. А сохрпняются каким образом? Куда? Если кодом - то все элементы формы в том методе перечислены - пропустить при желании невозможно.


Stanislav   (2007-07-12 12:26:00) [9]

Этот код у меня выполняется меньше секунды !!!

Var I:Integer;     b:Boolean;
begin
For I:=0 to 100000 do  if (Form1.Controls[0] is TEdit) then  
b:=TEdit(Form1.Controls[0]).Modified;
end;


engine   (2007-07-12 12:25:00) [10]

Попробуй в OnCreate пройтись по всем компонентам и задай им на OnChange свой обработчик


ЮЮ   (2007-07-12 12:24:00) [11]

>
 [0] Phoenix ©   (12.07.07 07:31)
 [9] Phoenix ©   (12.07.07 12:19)
 этих компонентовм примерно 5 десятков


Уже бы давно всё сделал :)

P.S. А сохрпняются каким образом? Куда? Если


Slider007   (2007-07-12 12:22:00) [12]

Phoenix ©   (12.07.07 12:19) [9]
Всё бы ничего но если этих компонентовм примерно 5 десятков?


За время обсуждения в этой ветки, ты бы уже успел навешать на все компоненты нужный обработчик, даже если бы их штук 100 было :)


homm   (2007-07-12 12:20:00) [13]

> Всё бы ничего но если этих компонентовм примерно 5 десятков?

Выделяешь их все, потом на вкладку Events инспектора объетов, даблклик по OnChange и пишеш:

MyCompList.Add(Sender);


Phoenix   (2007-07-12 12:19:00) [14]

>у большинства редактируемых компонентов есть событие OnChange. >повесить туда ОДИН одбработчик, который будет возводить флажок, или как
Всё бы ничего но если этих компонентовм примерно 5 десятков? причём на куче закладок , причём форму делал не я и имеется опасение чтонибуть пропустить?


Stanislav   (2007-07-12 12:17:00) [15]

Интересно сколько на этой форме должно быть контролов, чтобы было долго их все опросить???


StriderMan   (2007-07-12 11:54:00) [16]

у большинства редактируемых компонентов есть событие OnChange. повесить туда ОДИН одбработчик, который будет возводить флажок, или как
> Сергей М. ©   (12.07.07 08:29) [6]


Сергей М.   (2007-07-12 08:29:00) [17]


> как можно проверить всё скопом


Не надо проверять "всё скопом".

Следует организовать единый список, в который каждый объект, претерпевший изменения, добавляет ссылку на себя.

В кач-ве такого списка может быть использован, например, TObjectList.

Проверка необходимости сохранения при этом сводится к простой проверке этого списка на Count > 0. Если это условие истинно, то в цикле для каждого объекта-элемента списка выполняются необходимые действия по сохранению состояния этого объекта.


Phoenix   (2007-07-12 08:00:00) [18]

>Но ведь только компонет знает изменился он или по нему просто кликнули ?
Это то конечно, но потому вопрос и возник, может кто в курсе как можно проверить всё скопом :)


Kedge   (2007-07-12 07:54:00) [19]

>опять же придётся делать данное условие на КАЖДОМ компоненте а их очень много,
>форма просто огромная и напиханно туда больше чем хотелось бы.
Но ведь только компонет знает изменился он или по нему просто кликнули ?


Phoenix   (2007-07-12 07:50:00) [20]

>Завести переменную FIsChanged. Компонент "меняется" и ставит ее в True,
>"сохранение формы" - False ?
опять же придётся делать данное условие на КАЖДОМ компоненте а их очень много, форма просто огромная и напиханно туда больше чем хотелось бы.


Страницы:   1 2

Наверх

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