Форум: "Начинающим";
Текущий архив: 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.043 c