Текущий архив: 2007.09.23;
Скачать: CL | DM;
ВнизНеобходимо определить были ли пороизведенны изменения на форме Найти похожие ветки
← →
Phoenix © (2007-07-12 07:31) [0]Стоит такая задача, необходимо определить были ли пороизведенны изменения на форме или нет, если да то на закрытие выдать сообщение о необходимости сохранение изменений. Проблема в том что форма большая, всего на ней много и проверять проводились ли изменения в каждом компоненте достаточно долго, есть ли другие способы?
← →
Kedge © (2007-07-12 07:48) [1]> [0] Phoenix © (12.07.07 07:31)
>Проблема в том что форма большая, всего на ней много и проверять проводились ли изменения в каждом
>компоненте достаточно долго, есть ли другие способы?
Завести переменную FIsChanged. Компонент "меняется" и ставит ее в True, "сохранение формы" - False ?
← →
Slider007 © (2007-07-12 07:49) [2]Мне кажется нет.
← →
Phoenix © (2007-07-12 07:50) [3]>Завести переменную FIsChanged. Компонент "меняется" и ставит ее в True,
>"сохранение формы" - False ?
опять же придётся делать данное условие на КАЖДОМ компоненте а их очень много, форма просто огромная и напиханно туда больше чем хотелось бы.
← →
Kedge © (2007-07-12 07:54) [4]>опять же придётся делать данное условие на КАЖДОМ компоненте а их очень много,
>форма просто огромная и напиханно туда больше чем хотелось бы.
Но ведь только компонет знает изменился он или по нему просто кликнули ?
← →
Phoenix © (2007-07-12 08:00) [5]>Но ведь только компонет знает изменился он или по нему просто кликнули ?
Это то конечно, но потому вопрос и возник, может кто в курсе как можно проверить всё скопом :)
← →
Сергей М. © (2007-07-12 08:29) [6]
> как можно проверить всё скопом
Не надо проверять "всё скопом".
Следует организовать единый список, в который каждый объект, претерпевший изменения, добавляет ссылку на себя.
В кач-ве такого списка может быть использован, например, TObjectList.
Проверка необходимости сохранения при этом сводится к простой проверке этого списка на Count > 0. Если это условие истинно, то в цикле для каждого объекта-элемента списка выполняются необходимые действия по сохранению состояния этого объекта.
← →
StriderMan © (2007-07-12 11:54) [7]у большинства редактируемых компонентов есть событие OnChange. повесить туда ОДИН одбработчик, который будет возводить флажок, или как
> Сергей М. © (12.07.07 08:29) [6]
← →
Stanislav © (2007-07-12 12:17) [8]Интересно сколько на этой форме должно быть контролов, чтобы было долго их все опросить???
← →
Phoenix © (2007-07-12 12:19) [9]>у большинства редактируемых компонентов есть событие OnChange. >повесить туда ОДИН одбработчик, который будет возводить флажок, или как
Всё бы ничего но если этих компонентовм примерно 5 десятков? причём на куче закладок , причём форму делал не я и имеется опасение чтонибуть пропустить?
← →
homm © (2007-07-12 12:20) [10]> Всё бы ничего но если этих компонентовм примерно 5 десятков?
Выделяешь их все, потом на вкладку Events инспектора объетов, даблклик по OnChange и пишеш:
MyCompList.Add(Sender);
← →
Slider007 © (2007-07-12 12:22) [11]Phoenix © (12.07.07 12:19) [9]
Всё бы ничего но если этих компонентовм примерно 5 десятков?
За время обсуждения в этой ветки, ты бы уже успел навешать на все компоненты нужный обработчик, даже если бы их штук 100 было :)
← →
ЮЮ © (2007-07-12 12:24) [12]>
[0] Phoenix © (12.07.07 07:31)
[9] Phoenix © (12.07.07 12:19)
этих компонентовм примерно 5 десятков
Уже бы давно всё сделал :)
P.S. А сохрпняются каким образом? Куда? Если
← →
engine © (2007-07-12 12:25) [13]Попробуй в OnCreate пройтись по всем компонентам и задай им на OnChange свой обработчик
← →
Stanislav © (2007-07-12 12:26) [14]Этот код у меня выполняется меньше секунды !!!
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;
← →
ЮЮ © (2007-07-12 12:27) [15]P.S. А сохрпняются каким образом? Куда? Если кодом - то все элементы формы в том методе перечислены - пропустить при желании невозможно.
← →
Phoenix © (2007-07-12 12:27) [16]>За время обсуждения в этой ветки, ты бы уже успел навешать на все >компоненты нужный обработчик, даже если бы их штук 100 было :)
Это вопрос на перспективу :) Пока предлагают варианты ответов я тут пытаюсь с rtf подружится.. но это уже совсем другая история...
← →
engine © (2007-07-12 12:28) [17]> [13] engine © (12.07.07 12:25)
> Попробуй в OnCreate
В OnCreate формы
← →
vpbar © (2007-07-12 13:31) [18]>>engine © (12.07.07 12:25) [13]
Осторожней с такими советама. А если у компонента уже установлен обработчик OnChange, тогда глюк
← →
engine © (2007-07-12 13:47) [19]> [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]
← →
Phoenix © (2007-07-12 13:58) [20]>На что автор сказал, что боится вручную пропустить какой-либо компонент.
>Поэтоу я и предложил [13]
Стало любопытно , какой всё же вариант лучше ваши ли предложенный в ответе 14?
← →
Stanislav © (2007-07-12 14:09) [21]Phoenix © (12.07.07 13:58) [20]
если будешь использовать [14] его нужно немного изменить под твою программу.
← →
vpbar © (2007-07-12 14:20) [22]Млин. Ручками надежнее всего. Выставить флаг в нужных 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;
Страницы: 1 вся ветка
Текущий архив: 2007.09.23;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.071 c