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

Вниз

TForm.OldCreateOrder, особенности поведения.   Найти похожие ветки 

 
Skyle ©   (2008-01-17 12:28) [0]

Есть такое мнение
"это свойство [OldCreateOrder] ставится дельфой само, причем как-то глючно. по логике, для всех форм, созданных в D5, оно должно было быть False. но иногда почему то оно принимает значение True вопреки возложенной на него логике. без прямого вмешательства программиста. думаю, что оно просто глючное"

Интересует внутренняя логика установки этого свойства.

Просто дело в том, что одна из форм большого проекта после некоторых изменений программистом (убрал кнопку, добавил PopupMenu) выставила себе это свойство в True. Программист как таковой вообще это свойство, можно сказать, впервые видит.

Вот и стало мне интересно, чего это оно так.

Наковырял следующее: это свойство выставляется при чтении формы из dfm и равно оно not ModuleIsCPP.
ModuleIsCPP означает "True if this module is compiled using C++ Builder", но при этом в sysInit.VclInit жестко ставится в True.
О_О

Я нигде больше не нашёл присвоения ни OldCreateOrder, ни ModuleIsCPP.

Так какого же рожна оно может стать True?


 
clickmaker ©   (2008-01-17 13:07) [1]

sysInit.VclInit вызывается сишной RTL
в дельфи ModuleIsCPP = false
OldCreateOrder := not ModuleIsCPP => true


 
Skyle ©   (2008-01-17 13:11) [2]


> clickmaker ©   (17.01.08 13:07) [1]

А как же он True, когда 99.(9)% случаев он False?
Реально смотрю в Delphi5/Source/Rtl/Sys/sysinit.pas и вижу там

procedure VclInit(isDLL, isPkg: Boolean; hInst: LongInt; isGui: Boolean); cdecl;
begin
 if isPkg then
 begin
   ModuleIsLib := True;
   ModuleIsPackage := True;
 end else
 begin
   IsLibrary := isDLL;
   ModuleIsLib := isDLL;
   ModuleIsPackage := False; //!!! really unnessesary since DATASEG should be nulled
 end;
 HInstance := hInst;
 Module.Instance := hInst;
 Module.CodeInstance := 0;
 Module.DataInstance := 0;
ModuleIsCpp := True;
 InitializeModule;
 if not ModuleIsLib then
 begin
   Module.CodeInstance := FindHInstance(@VclInit);
   Module.DataInstance := FindHInstance(@DataMark);
   CmdLine := GetCommandLine;
   IsConsole := not isGui;
 end;
end;


И при этом в Delphi5/Source/Vlc/Forms.pas вижу

procedure TCustomForm.ReadState(Reader: TReader);
var
 NewTextHeight: Integer;
 Scaled: Boolean;
begin
 DisableAlign;
 try
   FClientWidth := 0;
   FClientHeight := 0;
   FTextHeight := 0;
   Scaled := False;
   FOldCreateOrder := not ModuleIsCpp;
..дальше неинтересно


Да, у человека вроде стоит билдер, но казалось бы, при чём тут это...


 
clickmaker ©   (2008-01-17 13:19) [3]


> [2] Skyle ©   (17.01.08 13:11)

насколько я понял, VclInit вызывается только при запуске "билдерного" приложения.
в дельфовом ModuleIsCpp должно же быть False

судя по этому:
{ Invoked by C++ startup code to allow initialization of VCL global vars }
procedure VclInit(isDLL, isPkg: Boolean; hInst: LongInt; isGui: Boolean); cdecl;


 
Skyle ©   (2008-01-17 13:24) [4]


> clickmaker ©   (17.01.08 13:19) [3]

Тогда получается, что исходя из If you don’t explicitly initialize a global variable, the compiler initializes it to 0 переменная ModuleIsCPP будет False и FOldCreateOrder будет True, как сказано в [1], но  это противоречит When OldCreateOrder is False (the default)

И действительно, оно False... Непонятно.


 
clickmaker ©   (2008-01-17 13:34) [5]


> это противоречит When OldCreateOrder is False (the default)

FOldCreateOrder := not ModuleIsCpp; // здесь оно True
inherited ReadState(Reader);
а здесь уже False

так что глюк может быть при чтении свойства из ресурса, где-то здесь
procedure TComponent.ReadState(Reader: TReader);
begin
 Reader.ReadData(Self);
end;


 
Skyle ©   (2008-01-17 13:41) [6]


> clickmaker ©   (17.01.08 13:34) [5]

Я немного до этого кода не дошёл. Изумился, что с самого факта создания оно уже True и там завис. Сейчас копну здесь.


 
Skyle ©   (2008-01-17 14:11) [7]

Не нашёл там ничего криминального. Тогда другой вопрос: что из себя внутренне представляют собой Legacy свойства? Где написано (или как определяется) что они Legacy?


 
clickmaker ©   (2008-01-17 15:06) [8]


> Просто дело в том, что одна из форм большого проекта после
> некоторых изменений программистом (убрал кнопку, добавил
> PopupMenu) выставила себе это свойство в True

а где это видно? в отладчике или в dfm?


 
Skyle ©   (2008-01-17 15:17) [9]


> clickmaker ©   (17.01.08 15:06) [8]
> а где это видно? в отладчике или в dfm?

Это было написано в dfm когда он выложил форму на Visual SourceSafe. Я смотрел изменения dfm и случайно заметил.

Теперь вот ищу механизм возникновения чтобы пресечь на корню.


 
clickmaker ©   (2008-01-17 15:28) [10]

ну вариантов 3 всего
1. сбой при чтении свойства в Reader.ReadData(Self);
2. сбой при записи свойства
3. руками поставили где-то в коде или в dfm

отловить первые 2 можно только путем экспериментов под отладчиком
ну а для 3-го - паяльник или утюг, как известно... o)


 
Skyle ©   (2008-01-17 15:37) [11]


> clickmaker ©   (17.01.08 15:28) [10]

Ну у меня такие же выводы.. Спасибо за участие.


 
clickmaker ©   (2008-01-17 15:47) [12]

кстати, гуглить не пробовал?
я вот чего нашел
http://qc.borland.com/wc/qcmain.aspx?d=1348


 
Skyle ©   (2008-01-18 06:21) [13]


> clickmaker ©   (17.01.08 15:47) [12]

Если честно, то изгуглился весь..:(
Спасибо, эта ссылка многое объясняет. Видимо так и сделаю.

Подскажи пожалуйста, каким запросом к гуглю ты на эту ссылку вышел?


 
clickmaker ©   (2008-01-18 13:30) [14]


> каким запросом к гуглю ты на эту ссылку вышел?

OldCreateOrder, вроде )


 
Skyle ©   (2008-01-18 13:45) [15]


> clickmaker ©   (18.01.08 13:30) [14]
>
> > каким запросом к гуглю ты на эту ссылку вышел?
>
> OldCreateOrder, вроде )

Видимо у тебя другой гугль :)



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

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

Наверх




Память: 0.48 MB
Время: 0.046 c
1-1193937748
antonioxxx
2007-11-01 20:22
2008.02.10
Обработка события: нажатие и удержание клавиши мыши


15-1199714934
Parus
2008-01-07 17:08
2008.02.10
PHP: register_shutdown_function для рекламы


2-1200519655
Malik
2008-01-17 00:40
2008.02.10
Остановка потока


9-1167271020
maxProg
2006-12-28 04:57
2008.02.10
Direct3D


15-1199355046
(MiTch)
2008-01-03 13:10
2008.02.10
Установка компонента Hhopen.





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