![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Панель инструментов из DLL [XP]
Галинка © (2007-08-23 15:33:00)как можно создать панель инструментов в длл, по количеству классов в ней? Это во-первых. Как потом эту панель загрузить в приложение?
Галинка (2007-08-24 15:14:00) [1]clickmaker © (24.08.07 14:59) [23]
оказалось, что мало чем. И теперь она проживает в ДЛЛ ))
b z (24.08.07 15:06) [24]
если это все ради Assembly.GetTypes() то понятно. Собственно и работает ужо ))
Всем ура ...
b z (2007-08-24 15:06:00) [2]
> Галинка © (24.08.07 14:15) [20]
вот вкратце про офис
http://www.ablebits.com/office-toolbar-controls/
см в сторону интерфейсов
в "закромах" нашел (это когда-то делалось еще при FW 1)
Assembly assembly1 = Assembly.LoadFrom(Path.Combine(Path.GetDirectoryName(base.GetType().Assembly.Loc ation), (string) plugins[obj]));
Type[] typeArray = assembly1.GetTypes();
for (int num1 = 0; num1 < typeArray.Length; num1++)
{
Type type1 = typeArray[num1];
...
object[] objArray = new object[0];
IPlugin plugin = (IPlugin) Activator.CreateInstance(type1, objArray);
ну и т.д. это конечно не кул но как идея думаю понятно :)
clickmaker (2007-08-24 14:59:00) [3]
> [22] Галинка © (24.08.07 14:23)
ну если это плавающая панель, то чем она концептуально отличается от просто формы из другой сборки?
Галинка (2007-08-24 14:23:00) [4]clickmaker © (24.08.07 14:20) [21]
это уже есть )) спасибо тебе который раз. Но хотелось бы не
> В приложении
> for c := 0; c < classCount; c++ {
> создать панель
> for op := 0 op < class[c].operationCount; op++ {
> создать кнопку + привязать к ней имя метода класса из
> DLL
> }
> }
а ы самой длл-ке. И потом просто вызывать процедуру (?) и выалая панель тут ))
clickmaker (2007-08-24 14:20:00) [5]
> [18] Галинка © (24.08.07 13:47)
Допустим, есть DLL (.NET-сборка, как я понимаю?). В ней 3 класса, для каждого - набор операций.
В приложении
for c := 0; c < classCount; c++ {
создать панель
for op := 0 op < class[c].operationCount; op++ {
создать кнопку + привязать к ней имя метода класса из DLL
}
}
потом, с помощью рефлекшн, можно динамически (Invoke) дергать этот метод. Разумеется, параметры должны быть как-то формализованы.
Нечто наподобие плагинной архитектуры.
Акробат или Промпт работают через COM-интерфейсы, скорей всего
Галинка (2007-08-24 14:15:00) [6]b z (24.08.07 14:03) [19]
тогда расскажи как?
b z (2007-08-24 14:03:00) [7]
> Как например это делает Акробат или Промт
боюсь утверждать :), но они такого не делают
Галинка (2007-08-24 13:47:00) [8]Да не в этом проблема. Точнее эту я еще вчера решила.
Но пока на стороне приложения. Т.е. как clickmaker сказал, при инициализации главной формы идет "сборка" панели инструментов. Но это подразумевает, что при добавлении нового класса в длл, придется лезть в приложение и добавлять соотв обработку в функцию ToolStripCreate. Но хотелось бы просто "передавать" готовую панель из ДЛЛ в приложение. Как например это делает Акробат или Промт ))
clickmaker (2007-08-24 13:39:00) [9]
> [14] Галинка © (24.08.07 13:29)
ну а почему нет-то?
схематично так
for (i = 0; i < DLLClassesCount; i++)
Toolbar.AddButton(DLLClass[i]);
+ если библиотека реализует некие методы для работы с классом, то цеплять к кнопке имя метода
Игорь Шевченко (2007-08-24 13:37:00) [10]
> а возможно ли все же сделать динамически формируемую панель?
> Чтобы при добавлении классов в библиотеку панель менялась
> вместе с ней и не задевалось главное приложение?
возможно.
Reflection - rulezz fareva
Галинка (2007-08-24 13:34:00) [11]Что-то типа как у Adobe, например. Ставишь Акробат проффесиоанльный и получаешь его панель инструментов в офисе. Вот так бы и мне.
Галинка (2007-08-24 13:29:00) [12]а возможно ли все же сделать динамически формируемую панель? Чтобы при добавлении классов в библиотеку панель менялась вместе с ней и не задевалось главное приложение?
Галинка (2007-08-23 17:19:00) [13]Все получилось. Досталось и поставилось все. Всем спасибо.
b z (2007-08-23 16:26:00) [14]
> Как в соотв кнопку загрузить иконку из длл для соотв.класса?
см. Embedded Resource, System.Resources.ResourceManager, Assembly.GetManifestResourceStream ...
Игорь Шевченко (2007-08-23 16:19:00) [15]если .Net то очень просто ВСЕ достается через reflection.
> наверное надо перенестись в конференцию .Net
В "Начинающих" самое место
Галинка (2007-08-23 16:15:00) [16]все получилось. Всем спасибо. Особенно clickmaker'у )))
Leonid Troyanovsky (2007-08-23 16:11:00) [17]
> Галинка © (23.08.07 16:02) [8]
> В смысле? Классы оттуда достать можно. Но надо всегда заранее
Доктор сказал в bpl, значит в bpl.
> Пы Сы: наверное надо перенестись в конференцию .Net ((
А.. Ну, извини.
--
Regards, LVT.
Галинка (2007-08-23 16:02:00) [18]Leonid Troyanovsky © (23.08.07 16:00) [7]
В смысле? Классы оттуда достать можно. Но надо всегда заранее знать, что там есть.
Пы Сы: наверное надо перенестись в конференцию .Net ((
Leonid Troyanovsky (2007-08-23 16:00:00) [19]
> Галинка © (23.08.07 15:56) [5]
> Первый вопрос на вскидку: как опросить ДЛЛ какие классы
> в ней хранятся?
Не вижу смысла хранить там классы, если доставать можно
лишь простые типы. Ну, или ресурсы.
--
Regards, LVT.
Галинка (2007-08-23 15:57:00) [20]Как в соотв кнопку загрузить иконку из длл для соотв.класса?