Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.021 c
15-1188288387
самовар
2007-08-28 12:06
2007.09.23
Новости науки ;)


15-1187955060
Aust
2007-08-24 15:31
2007.09.23
восстановление хп


15-1187936522
leonidus
2007-08-24 10:22
2007.09.23
Глюки при отображении формы в D6


3-1179783966
-=Саня=-
2007-05-22 01:46
2007.09.23
Запрос с добавлением нового поля


15-1188209341
Ломброзо
2007-08-27 14:09
2007.09.23
Как вернуть домен