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

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

Удивительное рядом [D7]


mfender ©   (2014-05-16 00:32:00) 

Здравия желаю, товарищи.
Сегодня за малым не рехнулся. Впрочем, ещё не всё потеряно, и возможно, что сумасшествие совсем не за горами. А дело было так: решил на скорую руку сваять для собственных нужд спиннер (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;


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

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


KilkennyCat   (2014-05-20 08:58:00) [1]


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

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

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


Rouse_   (2014-05-16 19:34:00) [2]


> Это как?

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


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


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

Это как?


Rouse_   (2014-05-16 18:21:00) [4]

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


Ega23   (2014-05-16 10:12:00) [5]

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


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


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

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


Inovet   (2014-05-16 01:34:00) [7]

> [3] mfender   (16.05.14 01:11)

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


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

Там есть переключатель 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:05:00) [9]

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

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


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

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


Наверх

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