Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа / 7 сообщений из 7, страница 1 из 1
29.03.2010, 07:45
    #36547400
ZLOI13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа
Здравствуйте, задумка такова:
необходимо строить дерево, узлы которого это экземпляры класса. В случае, если у экземпляра есть потомки, то хотелось бы из него строить ещё ветку, а в случае потомков у потомков строить ещё ветки. И хочется динамически располагать контролы для ввода переменных.
Есть ограничение: Microsoft Visual Stidio 2005/2008 и C#.
Что посоветуете, не хочу использовать прокси классы.
...
Рейтинг: 0 / 0
29.03.2010, 10:20
    #36547562
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа
ZLOI13,

Что-то в постановке задачи неверно, на мой взгляд.
У экземпляра не может быть потомков - он на то и экземпляр конкретного класса.
...
Рейтинг: 0 / 0
29.03.2010, 10:32
    #36547582
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа
Похоже ZLOI13 имеет ввиду под потомками свойства-объекты.
...
Рейтинг: 0 / 0
29.03.2010, 10:48
    #36547618
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа
Вообще есть сомнения в целесобразности решения задачи в универсальной форме.
Но возможно вам поможет моя давняя страничка. Сразу оговорюсь, что она не пригодилась, соответвенно ее не дорабатывал и практически не использовал.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
<html>
<head>
</head>
<style>
body {font-family:Verdana,Arial;font-size: 15 ;}
th {background-color:#b0b0c0;}
.d {background-color:#e0e0e0;color=#a0a0a0}
.l {background-color:#CFD1DA;}
.b {background-color:#aAaFC1;}
.gray {background-color:#CFD1DA;border-style:none;}
.error {background-color:#FFCCCC;font-weight:bold;color:red}
td,th {border-style:none;text-align:left}
a {text-decoration:none;color:blue;}
</style>
<body>
<script language=cache runat=server>
 s classname=%request.Get("classname")
 s id=%request.Get("id")
 s addon=%request.Get("addon")
 
 s ClassList=##class(%ResultSet).%New("%ClassDefinition:ClassInfo")
 d ClassList.Execute()
 w "<form name=f1>"
 w "<table border=1><tr class=l>"
 w "<td><select name=classname>"
 while ClassList.Next() 
 	   {s clname=ClassList.Get("Name")
 	    if (ClassList.Get("Persistent")= 1 ) && ($f(clname,"%")= 0 )
 		      {w "<option ",$case(clname,classname:"selected",:""),">",clname,"</option>"
 		      }
 	   }
 d ClassList.%Close()
 w "<td><input type=text name=id value=",id," >"
 w "<td><input type=submit class=b value='==>'>"
 w "<input type=button class=b value='<==' onclick='history.back()'>"
 w "</table>"
 w "<form>"
 
 //Открываем объект по Id и classname
 q:(classname="")&&(addon="")
 if addon=""
     {s exist="",classlist="",ob=""
      x:id'="" "s exist=##class("_classname_").%ExistsId("_id_")"    //проверить, существует ли объект
      x:exist=1 "s ob=##class("_classname_").%OpenId("_id_")"   //открыть объект
     } 
 else 
     {x addon
      s classname=ob.%ClassName(1)
      s exist=1
     }
 
 w "<table border=1 valign=top><th>Поле<th>Значение<th><th>Тип<th>Описание"
 s def=##class(%ClassDefinition).%OpenId(classname)
 s classlist=def.Super_","_classname
 d def.%Close()

 f i=1:1:$l(classlist,",")
     {s classname=$p(classlist,",",i)
      w "<tr><td>",classname
      
      s def=##class(%ClassDefinition).%OpenId(classname)      
      s key=""
      d def.Properties.GetNext(.key)  
      while key'="" 
         {s fieldname=def.Properties.GetAt(key).Name 
 	        s collection=def.Properties.GetAt(key).Collection
 	        s type=def.Properties.GetAt(key).Type
 	        s private=def.Properties.GetAt(key).Private 
 	        s description=def.Properties.GetAt(key).Description

 	        w "<tr class=l><td>",fieldname
 	        w "<td>"
 	        g:'exist next
 	        if private=1 w "<i><закрыто>" g next                                               //закрытое поле	        
 	        if collection=""
 	            {s val=""
 	             x "s val=ob."_fieldname  
 	             s addon=##class(%CSP.Page).EscapeURL("s ob=##class("_classname_").%OpenId("_id_"),ob=ob."_fieldname)                                                         
 	             w ..DecodeValue(val,type,addon)
 	            }
 	        if collection="array"
 	            {s key2=""                                                       
 	             x "d ob."_fieldname_".GetNext(.key2)"
 	             w:key2="" "<i><пусто>"
 	             while key2'=""
 	                 {x "s val=ob."_fieldname_".GetAt(key2)"
 	                  s addon=##class(%CSP.Page).EscapeURL("s ob=##class("_classname_").%OpenId("_id_"),ob=ob."_fieldname_".GetAt("_key2_")")
 	                  w "<div>",key2,"->",..DecodeValue(val,type,addon),"</div>"
 	                  x "d ob."_fieldname_".GetNext(.key2)"
 	                 }
 	            }
:next 	        
 	        w "<td>",collection
 	        w "<td>",type
 	        w "<td><pre>",description,"</td>"
          d def.Properties.GetNext(.key)
         }
     }
 w "</table>" 
</script>
<script language=cache method=DecodeValue Arguments='data:%String,fieldtype:%String,addon:%String=""' returntype="%String">
 n def2,persistent,id2,ret,i
 if data="" q "<i><пусто>"                                                                               //пустое поле
 if (type="%Library.Date")||(fieldtype="%Date") q:data= 0  "<i><нулевая дата>"                             //нулевая дата
 if (type="%Library.Date")||(fieldtype="%Date") q:$zd(data, 3 ,, 4 )="" "<i><неправильная дата>("_val_")"    //нулевая дата
 if (type="%Library.Date")||(fieldtype="%Date") q $zd(data, 3 ,, 4 )                                             //дата
 if (type="%Library.List")||(fieldtype="%List") q "<i><список>"  

 //проверим, является ли тип хранимым классом
 s def2=##class(%ClassDefinition).%OpenId(fieldtype)
 s persistent=def2.Persistent
 s:persistent id2=data.%Id()
 d def2.%Close()	 
 if persistent q "<a href=Browser.csp?classname="_fieldtype_"&id="_id2_">"_id2_"</a>" 
 q:$e(type, 1 , 1 )'="%" "<a href='Browser.csp?addon="_addon_"'>OREF</a>"
 q "<b>"_val
</script>

</body>
</html>
...
Рейтинг: 0 / 0
29.03.2010, 10:49
    #36547620
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа
ZLOI13,

Если не хотите создавать прокси-классы из пакета %Dictionary , то работайте через ADO.NET с ними же, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  using (var cn = new CacheConnection("server=localhost;port=1972;namespace=USER;uid=_system;pwd=SYS"))
  {
    cn.Open();
    var ds = new DataSet();
    using (var cmd = new CacheCommand("select Name,Super from %dictionary.compiledclass", cn))
    //using (var cmd = new CacheCommand("select * from %dictionary.compiledproperty", cn))
    {
      var da = new CacheDataAdapter { SelectCommand = cmd };
      da.Fill(ds);

      dataGrid1.DataSource = ds;
      dataGrid1.DataMember = "Table";
    }
  }
...
Рейтинг: 0 / 0
05.04.2010, 06:33
    #36560416
ZLOI13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа
Спасибо за реакцию, я вроде нажал подписаться, но письма не пришли, может невнимателен был.
Да, универсальную форму удалось сделать благодаря ClassDefinition и PropertyDefinition.
Универсальность нужна, потому что классы со временем будут обрастать новыми свойствами. И переделывать потом везде номенклатуру контролов на формах не хочется. А так можно делать более менее универсальные формочки :)
Теперь вопрос в том, что нужно записывать в контролы значения и они должны записываться в базу... а это не сделать через те же самые прокси. Как бы прокси я буду использовать, когда уже точно буду знать, что вот этот класс с 99% вероятностью будет иметь вот эти свойства, чтобы выполнить вот эту операцию в автокаде. Как бы всё разрабатывается для него, а соответственно обращений к базе будет мало и мне не нужна большая скорость, но с базой потом надо будет работать через веб интерфейс и ещё левые программулины будут подключаться, так что решил использовать единую БД для всего комплекса ПО.
Есть такой CativeX контрол VisM. Предполагается, что будет такой общий контрол, который будет получать от всех методов задачи на выполнения. Попытался его прикрутить... ругается... если есть варианты на C# буду рад :)
...
Рейтинг: 0 / 0
05.04.2010, 07:07
    #36560422
ZLOI13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа
Пишу вот такой простенький код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
private void button1_Click(object sender, EventArgs e)
        {
            VV = new VisMClass();
            VV.Server= "CN_IPTCP:127.0.0.1[57772]:SYS:_SYSTEM";
            
            //VV.NameSpace = "@USER";
            //VV.Execute("Set Value=5");
            //this.Text = VV.VALUE.ToString();
        }
И в ответ аларм: Server Recieve timed out.
Я понял, что контрол заточен под VB и C++. Но по С++ ничего не объяснено и примеров нет.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как узнаь динамически какие есть классы и какие у них атрибуты и какого типа / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]