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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
14-12932
D
2003-04-18 09:47
2003.05.05
Delphi не запускается!


1-12711
NeshBriges
2003-04-21 16:16
2003.05.05
RichEdit


1-12753
Zilog
2003-04-18 15:47
2003.05.05
Тормоза при работе с потоком. API. CreateThread.


14-12889
Psibug
2003-04-17 10:06
2003.05.05
Существует ли спецификация для Explorer.exe


3-12651
RDA
2003-04-16 08:51
2003.05.05
Столбцы-массивы в Interbase