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

Вниз

Удивительное рядом   Найти похожие ветки 

 
mfender   (2014-05-16 00:32) [0]

Здравия желаю, товарищи.
Сегодня за малым не рехнулся. Впрочем, ещё не всё потеряно, и возможно, что сумасшествие совсем не за горами. А дело было так: решил на скорую руку сваять для собственных нужд спиннер (TEdit и две TSpeedButton на панельке). Для пущей радости сделал ограничения в виде MinVal и MaxVal.

 TmfSpinner = class(TCustomPanel)
 private
   FUpButton, FDownButton: TSpeedButton;
   FEdit: TEdit;
   FButtonsPosition: TButtonsPosition;

   { Ariphmetic }
   FValue, FMinVal, FMaxVal, FDiscret: Integer;
   FRestrictions: Boolean;
 published
.......................
   property MinVal: Integer read FMinVal write SetMinVal default 0;
   property MaxVal: Integer read FMaxVal write SetMaxVal default 0;
.......................


При создании объекта run-time всё работает как положено. Но если положить компонент на форму, начинается НЕЧТО: значение MinVal стремительно становится -1. Причём в run-time всегда, и без всякой системности и логики иногда и в design-time. Причём, как я понимаю, именно так это всё попадает из .dfm. Чтобы убедиться в этом я в перекрытом TComponent.Loaded привинтил TNotifyEvent, и Sender.MinValue приходит -1. Остальные опубликованные свойства остаются такие, как назначены.

Это увертюра. Теперь финал апофеоз.

Меняю местами:

 published
.......................
   property MaxVal: Integer read FMaxVal write SetMaxVal default 0;
   property MinVal: Integer read FMinVal write SetMinVal default 0;


Всё работает как положено!

Я уже щипал себя, даже пару раз укусил за ногу. Вроде не сплю.
Как объяснить это явление, это НЕЧТО?


 
mfender   (2014-05-16 00:43) [1]

Полный текст (.pas) можно увидеть тут: http://siunov.ru/media/mfSpinner.pas


 
Inovet ©   (2014-05-16 01:05) [2]

Это так и надо? А если FMaxVal = 0. И вообще, почему FMaxVal на может быть равен FMinVal?

 if Val >= FMaxVal then
   FMinVal := FMaxVal - FDiscret


 
mfender   (2014-05-16 01:11) [3]

Там есть переключатель Restriction. Логика такая:

procedure TmfSpinner.SetMaxVal(const Val: Integer);
begin
 if Val <= FMinVal then
   FMaxVal := FMinVal + FDiscret
 else
   FMaxVal := Val;
 ValidateRestrictions;    
end;

procedure TmfSpinner.SetMinVal(const Val: Integer);
begin
 if Val >= FMaxVal then
   FMinVal := FMaxVal - FDiscret
 else
   FMinVal := Val;
 ValidateRestrictions;
end;

procedure TmfSpinner.ValidateRestrictions;
begin
 if Restrictions then
 begin
   if FValue >= FMaxVal then
   begin
     Value := FMaxVal;
     FUpButton.Enabled := False;
   end
   else
   begin
     Value := FValue;
     FUpButton.Enabled := True;
   end;
   if FValue <= FMinVal then
   begin
     Value := FMinVal;
     FDownButton.Enabled := False;
   end
   else
   begin
     Value := FValue;
     FDownButton.Enabled := True;
   end;
 end
 else
   Value := FValue;
end;


 
Inovet ©   (2014-05-16 01:34) [4]

> [3] mfender   (16.05.14 01:11)

Я говорю о том, чтобы включить мин и макс в диапазон, тогда они могут быть равны друг другу, что изначально в конструкторе и прописано.


 
mfender   (2014-05-16 01:53) [5]


> Inovet ©   (16.05.14 01:34) [4]

Гм... Спасибо, навели на мысль. Наверное так умнее будет. Попробую


 
Ega23 ©   (2014-05-16 10:12) [6]

А вот у меня что-то такое же было. Давно, лет 10 назад. Тоже меняешь две проперти местами - работает.
Что было и как решал - хоть убей не помню.


 
Rouse_ ©   (2014-05-16 18:21) [7]

Контрол не ставил - лениво это в тяпницу, но старый добрый совет.
Просто пройдись по коду отладчиком из второго экземпляра Delphi (т.е. из одной копии среды отлаживаем вторую где и ставим бряки).
Как правило помогает увидеть все неявные нюансы.


 
Дмитрий   (2014-05-16 19:12) [8]


> Просто пройдись по коду отладчиком из второго экземпляра
> Delphi (т.е. из одной копии среды отлаживаем вторую где
> и ставим бряки).

Это как?


 
Rouse_ ©   (2014-05-16 19:34) [9]


> Это как?

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


 
KilkennyCat ©   (2014-05-20 08:58) [10]


> меняешь две проперти местами - работает.

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

т.е., я бы глянул тут, что там компилируется в итоге.



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

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

Наверх




Память: 0.49 MB
Время: 0.007 c
15-1424182937
Torry
2015-02-17 17:22
2015.10.11
Продажа torry.net


15-1423869487
Ламот
2015-02-14 02:18
2015.10.11
Робот или человек? Как "правильно" организовать проверку?


4-1273820240
vip
2010-05-14 10:57
2015.10.11
Помогите передать сочетание клавиш Ctrl+END


2-1400185923
mfender
2014-05-16 00:32
2015.10.11
Удивительное рядом


15-1424555905
Kilkennycat
2015-02-22 00:58
2015.10.11
Небольшой крик души.