![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TForm.OldCreateOrder, особенности поведения. [D5, XP]
Skyle © (2008-01-17 12:28:00)Есть такое мнение
"это свойство [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?
Skyle (2008-01-18 13:45:00) [1]
> clickmaker © (18.01.08 13:30) [14]
>
> > каким запросом к гуглю ты на эту ссылку вышел?
>
> OldCreateOrder, вроде )
Видимо у тебя другой гугль :)
clickmaker (2008-01-18 13:30:00) [2]
> каким запросом к гуглю ты на эту ссылку вышел?
OldCreateOrder, вроде )
Skyle (2008-01-18 06:21:00) [3]
> clickmaker © (17.01.08 15:47) [12]
Если честно, то изгуглился весь..:(
Спасибо, эта ссылка многое объясняет. Видимо так и сделаю.
Подскажи пожалуйста, каким запросом к гуглю ты на эту ссылку вышел?
clickmaker (2008-01-17 15:47:00) [4]кстати, гуглить не пробовал?
я вот чего нашел
http://qc.borland.com/wc/qcmain.aspx?d=1348
Skyle (2008-01-17 15:37:00) [5]
> clickmaker © (17.01.08 15:28) [10]
Ну у меня такие же выводы.. Спасибо за участие.
clickmaker (2008-01-17 15:28:00) [6]ну вариантов 3 всего
1. сбой при чтении свойства в Reader.ReadData(Self);
2. сбой при записи свойства
3. руками поставили где-то в коде или в dfm
отловить первые 2 можно только путем экспериментов под отладчиком
ну а для 3-го - паяльник или утюг, как известно... o)
Skyle (2008-01-17 15:17:00) [7]
> clickmaker © (17.01.08 15:06) [8]
> а где это видно? в отладчике или в dfm?
Это было написано в dfm когда он выложил форму на Visual SourceSafe. Я смотрел изменения dfm и случайно заметил.
Теперь вот ищу механизм возникновения чтобы пресечь на корню.
clickmaker (2008-01-17 15:06:00) [8]
> Просто дело в том, что одна из форм большого проекта после
> некоторых изменений программистом (убрал кнопку, добавил
> PopupMenu) выставила себе это свойство в True
а где это видно? в отладчике или в dfm?
Skyle (2008-01-17 14:11:00) [9]Не нашёл там ничего криминального. Тогда другой вопрос: что из себя внутренне представляют собой Legacy свойства? Где написано (или как определяется) что они Legacy?
Skyle (2008-01-17 13:41:00) [10]
> clickmaker © (17.01.08 13:34) [5]
Я немного до этого кода не дошёл. Изумился, что с самого факта создания оно уже True и там завис. Сейчас копну здесь.
clickmaker (2008-01-17 13:34:00) [11]
> это противоречит 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:24:00) [12]
> 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:19:00) [13]
> [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:11:00) [14]
> 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:07:00) [15]sysInit.VclInit вызывается сишной RTL
в дельфи ModuleIsCPP = false
OldCreateOrder := not ModuleIsCPP => true