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

Вниз

Как обратиться к свойству объекта   Найти похожие ветки 

 
pavel_guzhanov   (2005-01-25 14:14) [0]

Вопрос такой: У Объекта имеется множество свойств. Мне нужно получить значение только одного свойства, например свойства "name". Приходится в цикле перебирать все свойства, и, дойдя до свойства "name" присвоить его значение какой- либо переменной. А можно ли обратиться к свойству непосредственно по его имени, не перебирая все остальные? И если можно, то как?


 
Pentium133 ©   (2005-01-25 14:21) [1]

Объек.Name := "pavel_guzhanov"


 
pavel_guzhanov   (2005-01-25 14:27) [2]

В ответ на это получаю сообщение об ошибке, Cannot assign to a read-only property. Так что это не прокатывает....


 
Pentium133 ©   (2005-01-25 14:31) [3]

Ха, ну так если проперти ТОЛЬКО ДЛЯ ЧТЕНИЯ, чего вы еще хотите?


 
PVOzerski ©   (2005-01-25 14:32) [4]

2pavel_guzhanov   (25.01.05 14:27) [2]
Тебе же, кажется, получить значение, а не присвоить надо.
Например, MyStringVariable:=ThisObject.Name;


 
pavel_guzhanov   (2005-01-25 15:01) [5]

Вот фрагмент кода, где идет переборка свойств объекта SProp
while (PropEnum.Next(1, TempObj, Value) = S_OK) do
begin
SProp:= IUnknown(TempObj) as SWBemProperty;
if (SProp.Get_Value <> null) then
begin
 if SProp.Name = "Name" then
   begin
     Result:=Trim(SProp.Get_Value);
     break;
   end;
end;
end;{while}

Вопрос заключается в том, чтобы установить(Без переборки) SProp.Name равным "Name", а потом получить значение, находящееся в этом свойстве, т.е. SProp.Get_Value. Извиняюсь, если как-то сумбурно объяснил задачу, но по другому не получается...


 
Digitman ©   (2005-01-25 15:08) [6]


> где идет переборка свойств объекта SProp


не "перебока свойств" у тебя идет, а перебор объектов !


 
pavel_guzhanov   (2005-01-25 15:16) [7]


> не "перебока свойств" у тебя идет, а перебор объектов

Возможно я путаюсь в терминологии, но, как мне кажется, из приведенного примера должен быть понятен смысл вопроса....


 
Digitman ©   (2005-01-25 15:41) [8]


> мне кажется, из приведенного примера должен быть понятен
> смысл вопроса


Он мне как раз и вполне понятен.

Ты перебираешь некий список объектов, какжый из которых реализует интерфейс SWBemProperty. Этот интерфейс предоставляет как минимум 2 св-ва : Name и Value. И если св-во Value (OleVariant) не равно Null, то если имя св-ва ТЕКУЩЕГО объекта равно "Name", то ты получаешь зн-е св-ва Value ТЕКУЩЕГО объекта и обрываешь цикл.

разве не так ?


 
Digitman ©   (2005-01-25 15:44) [9]


> pavel_guzhanov   (25.01.05 15:16) [7]


следы ведут к тому, ЧТО есть метод PropEnum..
а он есть функц.метод некоего интерфейса, возвращающий некий интерфейсный объект..


 
pavel_guzhanov   (2005-01-25 16:03) [10]


> разве не так ?


Так.

> если имя св-ва ТЕКУЩЕГО объекта равно "Name"

Я как раз спрашиваю, как мне сделать имя свойства текущего объекта равным "Name"b получить его Value? Можно ли это сделать без цикла переборки?


 
Digitman ©   (2005-01-25 16:10) [11]


> свойства текущего объекта


вот именно - ТЕКУЩЕГО !
а когда он, этот объект, станет у тебя текущим ?
именно тогда когда он им станет в очередной итерации твоего цикла !

у тебя же хренова туча объектов ! и у каждого из них есть как минимум 2 св-ва : Имя и Значение

ты же не свойства перебираешь - ты перебираешь объекты, каждый из которых обладает не менее чем 2-мя св-вами с известными тебе именами !


 
pavel_guzhanov   (2005-01-25 16:16) [12]


> а когда он, этот объект, станет у тебя текущим ?


Хорошо, тогда вопрос несколько перефразирую: Как сделать этот объект текущим, не пользуясь циклом, и возможно ли это вообще?


 
Digitman ©   (2005-01-25 16:22) [13]


> pavel_guzhanov   (25.01.05 16:16) [12]


а никак.
ты же не можешь знать заранее содержимое списка объектов ..

мало ли какие объекты в каком кол-ве этот список содержит в каждый момент времени !

сейчас в этом списке M объектов, а через час, может статься, в этом списке будет N объектов .. и все они имеют минимум два св-ва : Name и Value


 
pavel_guzhanov   (2005-01-25 16:31) [14]

жаль. Из-за циклов очень сильно тормозится программа, и памяти расходуется немеряно.Дело ведь в том, что мне надо обратиться всего к одному, конкретному объекту, с именем "Name", а все остальные меня не волнуют....


 
Набережных С.   (2005-01-25 16:49) [15]

У SWbemPropertySet есть метод Item, который принимает строковое имя свойства и возвращает соответствующий объект SWbemProperty. Енумератор не нужен.
Если, конечно, речь об этом.


 
Digitman ©   (2005-01-25 16:54) [16]


> Набережных С.   (25.01.05 16:49) [15]


въезд через анус - оно, конечно, хорошо).. но ты б хоть объяснил человеку, куда и на ком он туда въезжает ?)


 
Набережных С.   (2005-01-25 17:05) [17]

>Digitman ©   (25.01.05 16:54) [16]

Дык трудновато объяснить дорогу, если не понятно, куда ему нужно:) ИМХО, инфы мало. Наугад ткнул пальцем - авось попаду:)


 
Digitman ©   (2005-01-25 17:24) [18]

хорошо если SWBemProperty.Name() - дифолт-св-во объекта ..

хотя и в этом случае цикл фигурирует ... только - скрытый ..
внутренняя реализация подобна реал-ции кода
TDataSet.FieldByNames("чего-то там").Value ..


 
Набережных С.   (2005-01-25 18:17) [19]

>Digitman ©   (25.01.05 17:24) [18]
>хотя и в этом случае цикл фигурирует ... только - скрытый ..

Да, конечно, только обмена со службой WMI будет намного меньшь, а это значительно сократит время выполнения. Впрочем, возможно, у него мой совет вообще не применим, без всего кода не берусь судить.


 
Игорь Шевченко ©   (2005-01-25 18:44) [20]

Набережных С.   (25.01.05 18:17) [19]

<offtopic>
Ты б перерегистрировался.
</offtopic>

С уважением,


 
Набережных С.   (2005-01-25 18:48) [21]

>Игорь Шевченко ©   (25.01.05 18:44) [20]

Да я, вероятно, скоро опять исчезну, так что вряд ли стоит:)


 
pavel_guzhanov   (2005-01-26 08:45) [22]


> Дык трудновато объяснить дорогу, если не понятно, куда ему
> нужно:)

А что непонятно? Выложить больший кусок кода, или что-то объяснить поподробнее? Спроси, я отвечу. Дело в том, что, мне  кажется, твой совет - это как раз то, что может мне помочь, так что хотелось бы немного прояснить, как этим советом воспользоваться....


 
Digitman ©   (2005-01-26 08:58) [23]


> pavel_guzhanov   (26.01.05 08:45) [22]


видишь ли, Набережных С. в [15] дает верный совет..

обращение к св-ву SWbemPropertySet.Item, принимающему параметром стр.значение имени объекта, точно так же вызывает к выполнению внутренний (скрытый) цикл перебора объектов, входящих в список.

но в этом случае накл.расходы по интерфейсным преобразованиям (IUnknown(TempObj) as SWBemProperty) сводятся к минимуму, что явно и благотворно влияет на сквозную производительность твоего алгоритма


 
pavel_guzhanov   (2005-01-26 09:42) [24]

Правильно ли я понял?
Мне надо объявить переменную X:ISWbemPropertySet, а SProp:=X.Item("Name", 0)? А после этого получить уже SProp.Get_Value?
Или я не так понял? Если не так, то объясните пожалуйста поподробнее, ибо а хелпе я ничего похожего не нашел...


 
pavel_guzhanov   (2005-01-26 09:55) [25]

И еще, вдогонку.. Как мне увязать эту переменную X с компьютером, к которому я подключаюсь? Насколько я понимаю, в моем коде (хотя он практически весь не мой, а взятый из статьи) связь SProp с компьютером идет через TempObj.


 
REA   (2005-01-26 10:06) [26]

Приведи кода побольше, а то так можно долго спорить. И укажи что тебе надо и зачем.


 
pavel_guzhanov   (2005-01-26 10:28) [27]

function GetInfo(Service_:ISWbemServices; Cl:String; Name:Str2):String;  
 var   SProp:ISWbemProperty;
       PropEnum:IEnumVariant;                              
       SObject:ISWbemObject;                              
       ObjectSet:ISWbemObjectSet;                          
       PropSet:ISWbemPropertySet;                        
       TempObj:OleVariant;                                
       Value:Cardinal;                                  
begin                                                    
try                                                               SObject:= Service_.Get(Cl, wbemFlagUseAmendedQualifiers, nil);        
ObjectSet:= SObject.Instances_(0,nil);                              
Enum:= (ObjectSet._NewEnum) as IEnumVariant;                          
Enum.Next(1, TempObj, Value);                                        
SObject:= IUnknown(TempObj) as SWBemObject;                          
PropSet := SObject.Properties_;                                      
     PropEnum:= (PropSet._NewEnum) as IEnumVariant;                        
except                                                           Abort;                                                           end;                                                      
  Ищем нужное свойство (параметр name)                                  
try
while (PropEnum.Next(1, TempObj, Value) = S_OK) do                      
begin                                                             SProp:= IUnknown(TempObj) as SWBemProperty;                        
if (SProp.Get_Value <> null) then                                  
begin                                                               if SProp.Name = Name then                                        
 begin
   Result:=Trim(SProp.Get_Value);                                  
break;                                                          
end;                                                             end;                                                    
end;                                                          
except                                                           Abort;                                                           end;                                                             end;                    
//==============================================================
procedure TInfo.Execute;
var
 Enum:IEnumVariant;
 CPU:String[50];
 Service:ISWbemServices;
begin
  Service:= MainForm.SWbemLocator1.ConnectServer(CompName, "root\CIMV2",                                        MainForm.EUser.Text, MainForm.MEPassword.Text, "",  "", 0, nil);
// процессор
 try
   CPU:=GetInfo(Service, "Win32_Processor", "Name");
 except
   continue;
 end;                                                


Это практически полный код определения названия процессора на компьютере с именем CompName. В функции GetInfo находится Объект "Name" класса "Win32_Processor" в цикле, перебором всех объектов этого класса. Этот цикл съедает много времении и памяти. Я же хочу сразу, без цикла, обратиться к объекту "Name" этого класса, и прочитать его значение. Дело в том, что я определяю не только процессор, а еще много различных устройств, и компьютеров у меня в сети около 200, так что программа работает очень долго, и съедает много памяти. Поэтому я и хочу уйти от этих циклов.


 
pavel_guzhanov   (2005-01-26 10:30) [28]

даааа... Как то у меня код отформатировался хитро... Извиняюсь. Это я не специально...


 
REA   (2005-01-26 10:57) [29]

SProp := SObject.Properties_.Item[Name];
насчет синтаксиса не уверен, но смысл такой.

Оригинал из MSDN на VB:
wbemCimtypeString = 8
Set objSWbemService = GetObject("Winmgmts:root\default")
Set objClass = objSWbemService.Get()
objClass.Path_.Class = "NewClass"

" Add a property
objClass.Properties_.add "PropertyName", wbemCimtypeString  " String property
" Make the property a key property
objClass.Properties_("PropertyName").Qualifiers_.add "key", true

" Write the new class to the root\default namespace in the repository
Set objClassPath = objClass.Put_
WScript.Echo objClassPath.Path

"Create an instance of the new class using SWbemObject.SpawnInstance
Set objNewInst = GetObject("Winmgmts:root\default:NewClass").Spawninstance_

objNewInst.PropertyName = "My Instance"

" Write the instance into the repository
Set objInstancePath = objNewInst.Put_
WScript.Echo objInstancePath.Path


 
pavel_guzhanov   (2005-01-26 11:15) [30]


> SProp := SObject.Properties_.Item[Name];


Вот то, что мне было нужно!!! Спасибо всем, кто помогал!!!



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

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

Наверх




Память: 0.56 MB
Время: 2.045 c
1-1106639800
Aleks
2005-01-25 10:56
2005.02.06
Доки HELP как проверить есть ли по адресу (http//) нужный ресурс


14-1106037527
}|{yk
2005-01-18 11:38
2005.02.06
Линуксоиды!


3-1104753098
alexXn
2005-01-03 14:51
2005.02.06
Данные из системных таблиц Oracle


1-1106537456
Евг
2005-01-24 06:30
2005.02.06
Ошибка при закрытии книги в Excel


14-1106042582
-Lesha_-
2005-01-18 13:03
2005.02.06
Delphi7 работа со сканером