Текущий архив: 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