Форум: "Основная";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
ВнизRun-time create TEdit. Trouble with OnCnahe event Найти похожие ветки
← →
Hint (2003-04-23 13:40) [0]Здраствуйте!
Посмотрите на нижеследующий код:
procedure TCorrespondForm.FormCreate(Sender: TObject);
begin
CorrEdit:=TEdit.Create(CorrespondForm);
CorrEdit.Parent:=CorrGrid;
CorrEdit.Height:=CorrGrid.DefaultRowHeight;
CorrEdit.Color:=$00FBE4D2;
CorrEdit.BevelKind:=bkFlat;
CorrEdit.BorderStyle:=bsNone;
CorrEdit.Name:="Edit1";
CorrEdit.OnChange:=CorrCntrlChange;
CorrDateBox:=TDateTimePicker.Create(CorrespondForm);
CorrDateBox.Parent:=CorrGrid;
CorrDateBox.Height:=CorrGrid.DefaultRowHeight;
CorrDateBox.Color:=$00FBE4D2;
CorrDateBox.Name:="DateTimePicker1";
CorrDateBox.OnChange:=CorrCntrlChange;
end;
procedure TCorrespondForm.CorrCntrlChange(Sender: TObject);
begin
ShowMessage((Sender as TControl).Name);
end;
Проблема в том, что процедура CorrCntrlChange работает только для DateTimePicker1, а для Edit1 событие возникает только один раз, когда происходит первый вызов этого:
procedure TCorrespondForm.CorrGridSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
CorrEdit.Text:=CorrGrid.Cells[0, ARow];
end;
ПАЧЕМУ?
← →
Skier (2003-04-23 13:50) [1]Найди причину сам :)
даны две строки :
1) CorrEdit.Text := DateTimeToStr(Now);
2) CorrEdit.Text := "Hello";
Контрольные вопросы :
Сколько раз будет вызываться CorrCntrlChange в 1) и почему ?
Сколько раз будет вызываться CorrCntrlChange в 2) и почему ?
← →
Hint (2003-04-23 14:08) [2]Ответ:
Теория:
1) один раз
2) один раз
Почему: из-за того, что OnChange возникает когда текст в Edit может поменяться. Это событие предоставляет первую возможность ответа на модификации, которые пользователь внес в edit (догадайетсь откуда :o)
Практика: ни разу не возникло! ни гу-гу...
← →
Hint (2003-04-23 14:14) [3]Пробема видимо в том, что Parent Edit"a является StringGrid...
Но пути решения пока не проглядываются...
← →
MBo (2003-04-23 14:15) [4]>OnChange возникает когда текст в Edit может поменяться
заблуждаешься
не хочешь по исходникам разобраться?
OnChange вызывается , если произойдет реальное изменение
← →
Hint (2003-04-23 14:21) [5]В чем заблуждаюсь?
Произошло ли реальное изменение или нет можно судить по свойству Modified.
Как сказано в справке: Write an OnChange event handler to take specific action whenever the text for the edit control may have changed. Use the Modified property to see if a change actually occurred.
← →
MBo (2003-04-23 14:24) [6]>В чем заблуждаюсь?
В том, что можно в исходники не смотреть
← →
Hint (2003-04-23 14:49) [7]Посмотрел. Даже внимательно :o)
Не понял этого:
procedure TCustomEdit.CMTextChanged(var Message: TMessage);
begin
inherited;
if not HandleAllocated or (GetWindowLong(Handle, GWL_STYLE) and
ES_MULTILINE <> 0) then Change;
end;
В каком случае вызвается Change? Вообще, в любом случае?
← →
MBo (2003-04-23 14:51) [8]TControl.SetText
← →
Hint (2003-04-23 15:02) [9]Да, TControl.SetText, посмотрел...
Но меня интересует именно вот это:
if not HandleAllocated or (GetWindowLong(Handle, GWL_STYLE) and
ES_MULTILINE <> 0) then Change
У меня получается, что Change должен вызываться, если screen object не существует или его стиль multiline.
Что-то чушь какая-то
Вообще-то, кроме этого места, я нигде не увидел того, из-за чего OnChange где-то дохнет. Но и в этом месте я скорее всего не разобрался...
← →
Hint (2003-04-23 15:08) [10]Что, все безнадежно :o)?
← →
Dms (2003-04-23 15:11) [11]что, тебе же сказали - реальное изменение нужно
напиши
Edit1.Text:="1";
Edit1.Text:="1";
сколько раз вызовется OnChange ? Правильно - 1 РАЗ.
← →
MBo (2003-04-23 15:11) [12]> OnChange где-то дохнет
нигде он не дохнет.
Всю цепочку диспетеризации у меня приводить тут нет желания.
>кроме этого места
это место в данном случае роли не играет. все в inherited
← →
Skier (2003-04-23 15:15) [13]>Hint
Напиши
procedure TCorrespondForm.CorrGridSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
ShowMessage(CorrGrid.Cells[0, ARow]);
end;
Если постоянно будет выводиться одно и то же то заканчивай
флейм, если нет, и при этом OnСhange вызывается только 1 раз, то
пиши в Borland (но я думаю что сие не потребуется...)
← →
Hint (2003-04-23 15:19) [14]Однако понял в чем trouble.
Большое спасибо за ваше потраченое время.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c