Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
11-1183307342
Rusya
2007-07-01 20:29
2008.02.10
Тики в тракбаре


2-1200803639
_Shuler_
2008-01-20 07:33
2008.02.10
новая строка


15-1200211384
No_Dead
2008-01-13 11:03
2008.02.10
Это ж что вводить надо&#133


2-1200107272
дучф_ч
2008-01-12 06:07
2008.02.10
приложение без установки BDE


2-1200304108
Washington
2008-01-14 12:48
2008.02.10
Перехват вызова контекстного меню