![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Необходимо определить были ли пороизведенны изменения на форме [D7, WinXP]
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 ?
опять же придётся делать данное условие на КАЖДОМ компоненте а их очень много, форма просто огромная и напиханно туда больше чем хотелось бы.