Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Layner ©   (2006-06-13 16:45:00) 

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


StriderMan   (2006-06-14 13:37:00) [1]


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

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


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

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


Layner   (2006-06-14 13:17:00) [2]

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


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


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

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


StriderMan   (2006-06-14 12:43:00) [4]


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

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


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


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


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


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

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


tesseract   (2006-06-14 12:32:00) [6]


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

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

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


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


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

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


StriderMan   (2006-06-14 12:14:00) [8]


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

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


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


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

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


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


> 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;


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


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


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


StriderMan   (2006-06-14 11:27:00) [12]

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


ЮЮ   (2006-06-14 08:55:00) [13]

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

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

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

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


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

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


tesseract   (2006-06-13 22:48:00) [15]

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


Layner   (2006-06-13 22:24:00) [16]

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


tesseract   (2006-06-13 21:38:00) [17]


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

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

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


Layner   (2006-06-13 21:36:00) [18]

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


TUser   (2006-06-13 17:57:00) [19]

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


Ega23   (2006-06-13 17:17:00) [20]

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

 private
  FOldValue:Integer;

procedure TForm1.SpinEditOnChange
begin

 ........

 FOldValue:=SpinEdit.Value;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо