Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.30;
Скачать: CL | DM;

Вниз

Как реализовать?   Найти похожие ветки 

 
Big Error   (2003-10-21 10:35) [0]

В принципе, все просто - есть форма, на ней три десятка полей и кнопки Ok и Cancel. При нажатии на Cancel, если хоть одно поле формы изменялось, нужно вывести что-то типа "Уверены, что хотите отменить?"
Так вот, вопрос в том, как красиво отследить изменения в полях?
В лоб придумывается только пока одно - повесить на каждое поле обработчик события OnChange и по нему изменять некий флаг. Но ИМХО некрасиво это. Может наука другие методы нашла? Подскажите, пожалуйста.


 
Digitman ©   (2003-10-21 10:42) [1]


> Но ИМХО некрасиво это


почему же это "некрасиво" ? вполне разумое и эффективное решение !


 
lasso   (2003-10-21 10:44) [2]

я конечно лам в делфях но не легче написать процедурку?
или я глупость опять сказал?!...:(


 
REA ©   (2003-10-21 10:46) [3]

Вариант 1: Можно еще более тупо попробовать: сделать преобразование главной панели формы (не самой, потому что у нее координаты меняются) в текст (как в примере из справки) и сравнивать этот текст до и после. Тут правда нужно, чтобы остальные характеристики (enabled) тоже совпадали.
Вариант 2: пройтись по форме и сделать строку - сумму полей и сравнивать до и после.


 
lasso   (2003-10-21 10:50) [4]

procedute testedit(a:tedit);
begin
a.onchange //тра ля ля
end;

вызывать testedit(edit1.name);

пытаюсь первый раз в жизни ответить на вопрос так что 90% что это не правильно...;)


 
lasso   (2003-10-21 10:51) [5]

судя по ответу rea я глупость сказал....;(


 
Ihor Osov'yak ©   (2003-10-21 10:52) [6]

Я делаю примерно так.
В диалоговых формах, где предусмотрен ввод, есть две процедуры, примерно вида SetData(const aPrm: TMyInfoStruc) и GetData(var aPrm: TMyInfoStruc), первая устанавливает значения контролов в соотв. с данными, вторая - перегоняет данные с контролов в соотв. параметр.. Первая - также в приватном поле сохраняет копию aPrm.. (конечно, можно сделать и проперти, иногда и так делаю).
Так вот, перед закрытием формы (или при сабмите, или при откате - это уже зависит от логики диалога) с помощью GetData делается запрос новых значений, и сравнивается с той копией начальных значений, что была сохранена SetData.. Естественно, для TMyInfoStruc должны быть функции сравнения..
В зависимости от результата сравнения может быть вопрос к юзеру..

Работы от такого подхода прибавляется незначительно, так как функциональность SetData и GetData в том или ином виде присутствует практически в любой диалоговой форме... А читабельность и "сопровождаемость" кода выигрывает..


 
Ihor Osov'yak ©   (2003-10-21 10:55) [7]

зы - а согласно [1] Digitman © (21.10.03 10:42) - или когда очень спешу, или проект ачень маленький, несколько формочек..


 
Hooch ©   (2003-10-21 10:56) [8]

делай как описал, нормальное решение, тем более что кода будет 3 строчки


 
Digitman ©   (2003-10-21 11:01) [9]


> Ihor Osov"yak


имелось ввиду, что при старте формы в цикле по нужной группе контролов назначить один и тот же обработчик..

т.е. все что требуется - написать собственно обработчик и процедуру с циклом внутри, где этот обработчик будет назначаться всем существующим на этот момент контролам, отвечающим данному требованию по функц-ти их использования


 
Ihor Osov'yak ©   (2003-10-21 11:06) [10]

2 [9] Digitman © (21.10.03 11:01)

И такое тоже юзали :-)..
Но здесь (как и при решении "в лоб") - юзер может изменить значение, а потом возраться к первоначальному ручками.. Данные в результате не изменены, а влажок будет установлен.. Так что [6], несмотря на некоторую трудоемкость, имеет в этом отношении маленькое преимущество..


 
Big Error   (2003-10-21 11:09) [11]

> Digitman

Один и тот же обработчик не получится, потому что, во-первых, не у всех контролов есть OnChange (у TCheckBox, например, нет), а во-вторых, у некорых контролов уже стоят обработчики OnChange, где выполняются другие действия.

Да, видимо придется просто в каждый обработчик добавлять изменение флага, чуда не произошло, наука не дошла до более красивого способа. :))


 
app ©   (2003-10-21 11:17) [12]

Лучше чем Old<>New врядли придумаешь, при том чтоббы была гарантия действительного изменения данных



Страницы: 1 вся ветка

Текущий архив: 2003.10.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
9-98424
DNT
2003-04-24 21:28
2003.10.30
Текстуры и OpenGL


14-98789
tOester
2003-10-09 14:27
2003.10.30
Умная программа


14-98837
reticon
2003-10-11 19:06
2003.10.30
Футбол. Чемпионат Европы. Россия-Грузия.


1-98696
col-isaev
2003-10-20 17:09
2003.10.30
Panel


3-98487
AndrewK
2003-10-09 14:19
2003.10.30
Какой ExxxxxException можно использовать?