Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-12978
cult
2003-03-06 13:18
2003.05.05
Как загрузить ресурсы из DLL-ки?


6-12847
AlexRush
2003-03-10 17:12
2003.05.05
Сетевой адаптер - отправка данных в сеть


14-12892
zatochka
2003-04-16 22:26
2003.05.05
Как сдаелать программу невидимой


14-12897
asafr
2003-04-16 11:16
2003.05.05
Интересно. А почему таким успехом пользуются темы о религии?


11-12678
SPeller
2002-07-26 16:16
2003.05.05
Создание окна вне TControl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский