Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.105 c
14-1106046507
syte_ser78
2005-01-18 14:08
2005.02.06
Нужно ли выключать телефон?


8-1098395688
фантазер
2004-10-22 01:54
2005.02.06
Список форматов


14-1105903451
Hypercube
2005-01-16 22:24
2005.02.06
Citizen SRP-285II


4-1103374521
Ал
2004-12-18 15:55
2005.02.06
Как добавить свою страницу в TabControl Свойства: Экран


1-1106300186
Garry_c
2005-01-21 12:36
2005.02.06
Есть форма F1 на которой есть CheсkBox1и F2 на которой есть





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский