Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1142861728
linox
2006-03-20 16:35
2006.07.30
Строка на отдельный IP.


15-1150998368
anton773
2006-06-22 21:46
2006.07.30
Поток


15-1151649881
MBo
2006-06-30 10:44
2006.07.30
Пятничные похождения Васи Пупкина и другие задачки ;)


1-1150365320
Baiji
2006-06-15 13:55
2006.07.30
Освободить файл


2-1152532623
SergeyG
2006-07-10 15:57
2006.07.30
Как сделать, чтобы форма и расположенные на ней компоненты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский