Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

Handle + ReadOnly   Найти похожие ветки 

 
vecna ©   (2005-11-21 18:39) [0]

На самом деле я не уверен, просто наткнулся на такой код...

в StdCtrls.pas есть вот такая процедура:


procedure TCustomEdit.SetReadOnly(Value: Boolean);
begin
 if FReadOnly <> Value then
 begin
   FReadOnly := Value;
   if HandleAllocated then
     SendMessage(Handle, EM_SETREADONLY, Ord(Value), 0);
 end;
end;


Очень смущает проверка на HandleAllocated. Понятно, что Handle в дельфях может и не быть, и соответственно SendMessage не случится, но ведь обращение к Handle в самом SendMessage создаст хендл.
Простой пример, создаем Edit на второй (неактивной) закладке PageControl"a. Судя по всему (чесслово не проверял), в момент TForm.FormShow, у Edit"a будет Handle = 0. Делаем ReadOnly=True, и событие не случится, хотя могло бы. Или случится? В чем я не прав?


 
umbra ©   (2005-11-21 20:21) [1]

Если эдит создан и при этом не случилось ошибок, то у него есть ненулевой хэндл, поскольку эдит - полноценное окно. Вообще класс TCustomEdit - обертка для text - стандартного контрола винды.


> но ведь обращение к Handle в самом SendMessage создаст хендл

вовсе нет. хэндл окну выдается в момент создания.


 
vecna ©   (2005-11-21 21:01) [2]

2 umbra
> вовсе нет. хэндл окну выдается в момент создания.
видимо, это не так, в противном случае нафига нужны
HandleNeeded, CreateHandle, HandleAllocated, проверки на что Handle создан и создание его если нет. И вот эта фраза из документации:

The underlying window does not exist until the first time the Handle property is referenced. When this occurs, the HandleNeeded method is called automatically.


 
tesseract ©   (2005-11-21 22:03) [3]


> создаем Edit на второй (неактивной) закладке PageControl"a.

А в момент когда она активна, что handle  у окон отсутствует?


 
vecna ©   (2005-11-21 22:10) [4]

2 tesseract
> А в момент когда она активна, что handle  у окон отсутствует?
естественно нет,
активна первая закладка, а едит на второй. Handle = 0 в чем можно убедится позвав HandleAllocated. Но с этим-то все ясно. Не ясно, нафига делать такую проверку в SetReadOnly


 
tesseract ©   (2005-11-21 22:13) [5]


> активна первая закладка, а едит на второй. Handle = 0 в
> чем можно убедится позвав HandleAllocated. Но с этим-то
> все ясно. Не ясно, нафига делать такую проверку в SetReadOnly

Как на фига ? чтобы случайно не послать сообщения окну с Handle=0!
Если не ошибаюсь  - Desktop.


 
vecna ©   (2005-11-21 22:22) [6]

Причем тут декстоп?
при обращении к свойству Handle, создается тот самый Handle (см. TWinControl.GetHandle)


 
tesseract ©   (2005-11-21 22:45) [7]

Да реальный прикол - это единственная функция где идёт проверка на Handle Allocated. Скорее всего надо поставить ServicePack :-)


 
tesseract ©   (2005-11-21 22:52) [8]

Мдя половина функция с двойной проверкой,  половина без. интересно зачем? При это нет проверки на INVALID_HANDLE_VALUE.


 
vecna ©   (2005-11-21 22:56) [9]

D6 + все известные мне сервис паки (пять штук!)...
в седьмой дельфи тоже самое.


 
Владислав ©   (2005-11-22 09:18) [10]


> Очень смущает проверка на HandleAllocated. Понятно, что
> Handle в дельфях может и не быть, и соответственно SendMessage
> не случится, но ведь обращение к Handle в самом SendMessage
> создаст хендл.


Переведем код на русский.
Если окно не создано, сообщение отправляться не будет. Почувствуйте разницу.


 
Владислав ©   (2005-11-22 09:28) [11]


> При это нет проверки на INVALID_HANDLE_VALUE.


Казалось бы, при чем здесь создание окна???


 
umbra ©   (2005-11-22 12:58) [12]

2 vecna ©   (21.11.05 21:01) [2]

а откуда именно из справки эта фраза?


 
vecna ©   (2005-11-22 14:26) [13]

2 Владислав
> Если окно не создано, сообщение отправляться не будет.
Не чувствую... я спрашиваю для чего так?

2 umbra
> а откуда именно из справки эта фраза?
F1 -> TWinControl,Handle


 
Владислав ©   (2005-11-22 14:49) [14]


> Не чувствую... я спрашиваю для чего так?


Ну может нет смысла создавать окно только для того, чтобы установить ReadOnly?...


 
Игорь Шевченко ©   (2005-11-22 14:55) [15]

Свойство ReadOnly может устанавливаться при загрузке dfm, когда никаких окон не создано. Для этого и требуется проверка. Это же свойство используется при создании окна Windows-контрола Edit.


 
vecna ©   (2005-11-22 16:14) [16]

2 Владислав
> Ну может нет смысла создавать окно только для того, чтобы установить ReadOnly?...
Да ну?!

2 Игорь Шевченко
вот это убедительно, спасибо.


 
Владислав ©   (2005-11-22 16:29) [17]


> Да ну?!


Ну да.


> вот это убедительно, спасибо.


Какой недоверчивый :о)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
2-1133196046
Дмитрий_05
2005-11-28 19:40
2005.12.18
Диномическое создать и убить форму.


14-1133255756
КаПиБаРа
2005-11-29 12:15
2005.12.18
Вы Леви читали? Как вам его книги?


2-1133348698
LG
2005-11-30 14:04
2005.12.18
Итерфейс в стиле Office


14-1132075768
bogdan
2005-11-15 20:29
2005.12.18
запуск из коммандной строки


4-1129312446
Fay
2005-10-14 21:54
2005.12.18
Переключить раскладку их хука





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский