Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

Необходимо определить были ли пороизведенны изменения на форме   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.046 c
2-1188199309
арпывапр
2007-08-27 11:21
2007.09.23
паыметры зупускаемого приложения.


15-1187864995
DVM
2007-08-23 14:29
2007.09.23
MD5


2-1188302008
Евгений Р.
2007-08-28 15:53
2007.09.23
KeyDown у tPanel


2-1188361762
rar
2007-08-29 08:29
2007.09.23
сохранить ico бд


11-1172065293
mixail_shar
2007-02-21 16:41
2007.09.23
Кладову





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский