объекты с одинаковыми полными системными путями
#1
Отправлено 21 октября 2009 - 12:03
при тестировании программ, написанных на Delphi2010 обнаружилось в браузере существование объектов с полностью идентичными системными путями, причем один из них правильный, а второй глючный. Соответственно при работе скрипта если найден правильный объект - то все хорошо, если неправильный - то останов.
Как обойти эту проблему?
Сразу же уточняю, в отличие от предыдущей темы по объектам с одинаковыми именами, но разными индексами -
- индексов нет никаких и не должно быть, поскольку реально объект один.
#2
Отправлено 22 октября 2009 - 03:43
Я сталкивался с тем, что было 2 одинаковых объекта, но наполнение у них разное было... Также через Exists смотрел "внутренности" полученного объекта и по результатам отработки функции "понимал", что именно за объект мне попался.
#3
Отправлено 22 октября 2009 - 05:38
А Handle у этих объектов разный? Я встречал ситуации, когда в Delphi приложении были разные объекты с одинаковым именем.
А ещё у Delphi приложений есть особенность: пока объект не отобразился на экране в первый раз, он создан как-бы наполовину: для него не назначен handle и, соответственно, у него нет родительского окна. В результате, он может находится в дереве объектов в неправильном месте. Как только объект отрисовывается на экране, он сразу перепрыгивает на нужное место в дереве. Возможно, "глючный" объект в вашем случае как раз такой недосозданный объект.
Дмитрий
#4
Отправлено 22 октября 2009 - 09:27
путь объекта p1:=Sys.Process('PSO_DataInputClient').VCLObject('dlgLoginForm').VCLObject('dxLayoutControl1');Попробуйте метод Exists для объекта. Например, если по указанному пути метод возвращает для объекта true, значит это ваш объект, иначе перебором следующий берите...
Я сталкивался с тем, что было 2 одинаковых объекта, но наполнение у них разное было... Также через Exists смотрел "внутренности" полученного объекта и по результатам отработки функции "понимал", что именно за объект мне попался.
у обоих Exists=true
вопрос - как их перебирать в скрипте, а не в браузере?
#5
Отправлено 22 октября 2009 - 09:29
Handle у глючного отсутствуетЗдравствуйте.
А Handle у этих объектов разный? Я встречал ситуации, когда в Delphi приложении были разные объекты с одинаковым именем.
А ещё у Delphi приложений есть особенность: пока объект не отобразился на экране в первый раз, он создан как-бы наполовину: для него не назначен handle и, соответственно, у него нет родительского окна. В результате, он может находится в дереве объектов в неправильном месте. Как только объект отрисовывается на экране, он сразу перепрыгивает на нужное место в дереве. Возможно, "глючный" объект в вашем случае как раз такой недосозданный объект.
#6
Отправлено 22 октября 2009 - 09:37
А у самих объектов содержимое одинаковое? Можно получить оба объекта в переменную, например p1, p2 - а дальше искать у них то, в чём они отличаются.. p1.control1.exists, p2.control1.exists...путь объекта p1:=Sys.Process('PSO_DataInputClient').VCLObject('dlgLoginForm').VCLObject('dxLayoutControl1');Попробуйте метод Exists для объекта. Например, если по указанному пути метод возвращает для объекта true, значит это ваш объект, иначе перебором следующий берите...
Я сталкивался с тем, что было 2 одинаковых объекта, но наполнение у них разное было... Также через Exists смотрел "внутренности" полученного объекта и по результатам отработки функции "понимал", что именно за объект мне попался.
у обоих Exists=true
вопрос - как их перебирать в скрипте, а не в браузере?
Хотя ниже вы сами дали проще ответ "Handle у глючного отсутствует"
#7
Отправлено 23 октября 2009 - 06:12
Вопрос удалось успешно решить.
#8
Отправлено 23 октября 2009 - 06:18
#9
Отправлено 23 октября 2009 - 07:26
Присоединяюсь к вопросу, полезно будет.В общем то было бы неплохо выложить сюда решение, как думаете? :)
#10
Отправлено 26 октября 2009 - 14:55
как бороться с объектами с Child=0 пока и сам не знаю, а такие тоже есть
// proc - родительский процесс
// name_object - имя дублированного объекта
// ChildCount - минимальное число детей
function FindObject(proc,name_object,ChildCount);
var
n1,z1;
begin
n1 := ['ObjectIdentifier', 'ChildCount'];
z1 := [name_object, ChildCount];
result := proc.FindChild(n1, z1, 10);
while ((not result.exists) and (ChildCount < 20)) do
begin
ChildCount:=ChildCount+1;
z1 := [name_object, ChildCount];
result := proc.FindChild(n1, z1, 10);
end;
end;
объект
Sys.Process('PSO_TemplateCreatorClient').VCLObject('MainForm').VCLObject('TemplatePageControl').VCLObject('TemplateListTabSheet').VCLObject('frTC_ViewTemplateList').VCLObject('dxLayoutControl1').VCLObject('TemplateListGrid').Window('TcxGridSite')
ветвление в 2 точках:
TemplatePageControl
dxLayoutControl1
p1 := Sys.Process('PSO_TemplateCreatorClient').VCLObject('MainForm');
p1:=FindObject(p1,'TemplatePageControl',3);
p1:=p1.VCLObject('TemplateListTabSheet').VCLObject('frTC_ViewTemplateList');
p1:=FindObject(p1,'dxLayoutControl1',1);
#11
Отправлено 28 октября 2009 - 15:05
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных