Форум: "Основная";
Текущий архив: 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