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

Вниз

Как узнать что было до редактирования например на SpinEdit?   Найти похожие ветки 

 
Layner ©   (2006-06-13 16:45) [0]

Здравствуйте! Есть SpinEdit, у него OnChange показывает только новое значение после редактирования, можно ли как то узнать, что было до момента редактирования?


 
Ega23 ©   (2006-06-13 17:17) [1]

type
TForm1=class(TForm)
  .........

 private
  FOldValue:Integer;

procedure TForm1.SpinEditOnChange
begin

 ........

 FOldValue:=SpinEdit.Value;
end;


 
TUser ©   (2006-06-13 17:57) [2]

Лучше все-таки наследника от SpinEdit"а, имхо.


 
Layner ©   (2006-06-13 21:36) [3]

Ega23 ©   (13.06.06 17:17)
Спиасибо за скорый ответ, только понять не могу, добавляем приват переменную, и в строке  FOldValue:=SpinEdit.Value; FOldValue примет значение новое значение? Т.е. не совсем понятно как старое извлечь..


 
tesseract ©   (2006-06-13 21:38) [4]


>  Т.е. не совсем понятно как старое извлечь..

Старое ты запомнишь в этой переменной. При открытии формы, придай ему страрое значение - и всё.

Это очень старый трюк.


 
Layner ©   (2006-06-13 22:24) [5]

tesseract ©   (13.06.06 21:38)
Так было бы так просто, сделал бы конечно :) Тут дело немного другое, у меня есть 5 SpinEdit, у всех диапазон от 0 до 100, и в сумме их значения не может быть более 350. Вот и хотелось бы отследить изменения суммы выше порога 350, и тот SpinEdit, который редактируют, вернуть на максимально возможное значение. Редактировать можно по разному, можно по еденице прибавлять, а можно и еденицу вписать вначале уст. значения, т.е. убавлять вниц по еденице например, после рдктирования и если сумма больше 350, тоже нет смысла, т.к. пользователь может прибавить сразу десяток.. В общем и проблемы то и нет, если бы узнать, что было до момента редактирования, да вот что то никак врубится не могу, как бы это сделать.


 
tesseract ©   (2006-06-13 22:48) [6]

у spin есть  значение - maxvalue.  рассчитывай его при изменении значений остальных.


 
Layner ©   (2006-06-14 08:07) [7]

maxvalue тоже уже используется, если я его собью, как узнать реальное maxvalue на этом SpinEdit? Конечно можно ввести доп. массив, столько, сколько элементов, и хранить в нем максимум, но это уже в крайнем случае..


 
ЮЮ ©   (2006-06-14 08:55) [8]

>у всех диапазон от 0 до 100, и в сумме их значения не может быть более 350.

SpinEdit.MaxValue := Min(100, 350 - <сумма Value остальных>)

>если я его собью, как узнать реальное maxvalue на этом SpinEdit?
то есть не у всех диапазон от 0 до 100?
Можно записать в Tag каждого SpinEdit

SpinEdit.MaxValue := Min(SpinEdit.tag, 3500 - <сумма Value остальных>)


 
StriderMan ©   (2006-06-14 11:27) [9]

Очевидно, сделать у всех SpinEdit один обработчик OnChange, и в нем все разруливать (кстати в обработчик передается Sender - это так, к сведению...)


 
tesseract ©   (2006-06-14 11:32) [10]


> Очевидно, сделать у всех SpinEdit один обработчик OnChange,
>  и в нем все разруливать (кстати в обработчик передается
> Sender - это так, к сведению...)


Strider это такой прикольный эффект вызовет. onChange вызывает onchange ....... и так до переполнения стека.


 
StriderMan ©   (2006-06-14 11:45) [11]


> onChange вызывает onchange

надо завести дополнительную процедурку для изменения содержимого эдит"а без вызова события

procedure SafeChangeSpinEdit(AEdit: TSpinEdit; AValue: integer);
var
 oc: TNotifyEvent;
begin
 oc := AEdit.OnChange;
 AEdit.OnChange := nil;
 AEdit.Value := AValue;
 AEdit.OnChange := oc;
end;


 
Плохиш ©   (2006-06-14 12:13) [12]


> onChange вызывает onchange ....... и так до переполнения
> стека.

С чего бы 2 подряд вызванных OnChange переполнят стек?


 
StriderMan ©   (2006-06-14 12:14) [13]


> С чего бы 2 подряд вызванных OnChange переполнят стек

почему два, каждый OnChange в описанной ситуации вызывает еще один, и так до бесконечности. Бесконечная матрешка, блин.


 
Плохиш ©   (2006-06-14 12:24) [14]


> StriderMan ©   (14.06.06 12:14) [13]

Странно, по логике, если в спинедите недопустимое значение, то расчитывается ближайшее удовлетворяющее условиям значение и присваивается спинедиту, после в обработчике onchange никаких новых значений не вычисляется и спинедиту не присваивается. Или у Вас другая логика?


 
tesseract ©   (2006-06-14 12:32) [15]


>  после в обработчике onchange никаких новых значений не
> вычисляется и спинедиту не присваивается

В OnChage требуется изменить значения других спинедитов. Что вызовет их OnChange.

Я просто сталкивался с подобным в молодости, с тех пор стараюсь чтобы onChange не пересекались.


 
Плохиш ©   (2006-06-14 12:37) [16]


> tesseract ©   (14.06.06 12:32) [15]
> В OnChage требуется изменить значения других спинедитов.

Это Вы сами придумали или автор Вам в приватной беседе сказал?
Судя по описанию задачи в [5], проверяется и изменяется значения только спинедита для которого было вызвано событие onchange.


 
StriderMan ©   (2006-06-14 12:43) [17]


> Судя по описанию задачи в [5], проверяется и изменяется
> значения только спинедита для которого было вызвано событие
> onchange.

Даже если так, то если в обработчике написать


procedure Form1.SpinEdit1Change(Sender: TObject);
begin
 ...
 SpinEdit1.Value := Что-то; // Здесь опять вызовется SpinEdit1.OnChange и  
                                      //пойдет бесконечная рекурсия
end;


поэтому если в OnChange надо изменить значение контрола надо пользоваться [1]


 
Плохиш ©   (2006-06-14 12:59) [18]


> StriderMan ©   (14.06.06 12:43) [17]

Советую перечитать [14], можно несколько раз. А то совершенно не понятно, зачем Вы присваиваете SpinEdit1.Value := Что-то;, если в спинедите уже находиться значение, удовлетворяющее условию задачи?
Кстати, не могли бы Вы указать где в [1] находиться "изменение значения контрола", я там увидел только сохранение текущего значения.


 
Layner ©   (2006-06-14 13:17) [19]

Сделал как у ЮЮ[8], (так правда начал делать ещё вчера, сегодня доделал), назначенной цели добился :) Т.е. не вычисляю сколько было "ДО", а просто считаю сумму после редактирования, и если она больше порога, то в редактируемом SpinEdit меняю значение ровно на разницу порога - "суммы других элементов кроме редактируемого"


 
StriderMan ©   (2006-06-14 13:37) [20]


> Что-то;, если в спинедите уже находиться значение, удовлетворяющее
> условию задачи?

так фишка-то в том, что там надо проверить что сумма всех эдитов не боллее 350, значит надо проверить это условие, и по необходимости присвоить нужное


> Кстати, не могли бы Вы указать где в [1] находиться "изменение
> значения контрола",

Пардон, имел ввиду [11]



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

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

Наверх




Память: 0.52 MB
Время: 0.043 c
1-1150292191
Megabyte
2006-06-14 17:36
2006.07.30
Изменение формата ячеек Экселя в Дельфи


15-1150815280
СК
2006-06-20 18:54
2006.07.30
Консультация Юриста


2-1152779489
Timur
2006-07-13 12:31
2006.07.30
из Delphi на e-mail


11-1130966214
NORDmen
2005-11-03 00:16
2006.07.30
run-time packages&amp;kol


6-1142861728
linox
2006-03-20 16:35
2006.07.30
Строка на отдельный IP.