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

Вниз

Непредсказуемый порядок обхода контролов   Найти похожие ветки 

 
Циркуль   (2009-11-26 11:43) [0]

Есть вот такая функция для рекурсивного обхода контролов


function FindControl(AParentControl: TWinControl; AConditionFunc: TFindControlConditionFunc): TControl;
var
 I: Integer;
 Control: TControl;
begin
 Result := nil;
 if Assigned(AConditionFunc) then
 begin
   for I := 0 to AParentControl.ControlCount - 1 do
   begin
     Control := AParentControl.Controls[I];
     if AConditionFunc(Control) then
       Result := Control
     else
       if Control is TWinControl then
         Result := FindControl(TWinControl(Control), AConditionFunc);
     if Assigned(Result) then
       Break;
   end;
 end;
end;

TFindControlConditionFunc = function(AControl: TControl): Boolean of object;


На одной из форм она вызывается вот так


...
FindControl(Self, SetupNestedFrame);
...

TForm1.SetupNestedFrame(AControl: TControl): Boolean;
begin
 Result := False;
 if (AControl is TSomeFrame) then
   TSomeFrame(AControl).SomeAction.
end;


Так вот... На форме, где-то на панельках лежит 2 фрейма.
Сначала  вызывается SomeAction для Frame1, потом для Frame2.
Но в экзешнике, скомпиленом на одном из компов порядок получается обратный, т.е. сначала FindControl находит Frame2 а затем Frame1. pas и dfm в обоих случаях идентичные, CreationOrder у формы правильный (сначала создается Frame1 потом Frame2), настройки компиляции проекта одинаковые. В дебагере цикл внутри FindControl бегает как положено, с нуля.


 
Сергей М. ©   (2009-11-26 16:01) [1]

А какая разница, каков фактический порядок обхода ?
Тебя же, судя по логике в SetupNestedFrame, он вообще не интересует..


 
Циркуль   (2009-11-26 16:27) [2]

В общем случае - не интересует, но на данной конкретной форме Frame2 при загрузке (SomeAction) использует данные Frame1, который получает их во время своего SomeAction.

Саму проблему "рассогласования" фреймов я решил, дело не в этом. Мне просто интересно, какая может быть причина того, что при компиляции на одном из компов Frame2 находится на форме первее, чем Frame1, а при компиляции на других компах - первым находится Frame1 (в соответствии с CreationOrder формы), при условии идентичности исходников и настроек компиляции. ОС и версия Delphi тоже одинаковая на компах.

Понимаю, что не имея возможности воспроизвести ситуацию у себя под отладчиком, трудно мне ответить что-нить вразумительное, но мало ли... может кто уже натыкался на подобное и сможет развеять мою веру в чудеса :)


 
Сергей М. ©   (2009-11-26 21:30) [3]


> на данной конкретной форме Frame2 при загрузке (SomeAction)
> использует данные Frame1


Логика, не выдерживающая никакой критики.


 
Циркуль   (2009-11-27 13:37) [4]


> Логика, не выдерживающая никакой критики.


Заявление, не выдерживающее никакой критики :)


 
han_malign   (2009-11-27 16:28) [5]

ZOrder/TabOrder


 
Сергей М. ©   (2009-11-27 16:48) [6]


> Циркуль   (27.11.09 13:37) [4]


Ну смотри сама, кума, - тебе жить)


 
Ухарь   (2009-11-29 13:04) [7]

а каким образом происходит компиляция на другом компьютере?
Проект открывается в IDE и билдится, или же командной строкой?


 
Циркуль   (2009-11-29 18:49) [8]


> Ухарь   (29.11.09 13:04) [7]

открывается в IDE и билдится


 
Ухарь   (2009-12-01 19:19) [9]

можно попробовать сравнить после этого сорсы на двух компьютерах



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

Текущий архив: 2011.07.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
4-1248840141
Armature_Current
2009-07-29 08:02
2011.07.17
Ошибка функции ReadFile при работе с COM-портом


6-1237104256
Тимохов
2009-03-15 11:04
2011.07.17
Заголовок Proxy-Connection при использовании библиотеки WinINet


2-1301928036
novichek
2011-04-04 18:40
2011.07.17
ADO поле Int64


15-1301622421
Palladin
2011-04-01 05:47
2011.07.17
1 апреля


2-1302005274
Германн
2011-04-05 16:07
2011.07.17
Как запретить изменение ширины колонок в ListView?