Форум: "Основная";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
ВнизКак узнать что было до редактирования например на 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c