Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интеграция / 25 сообщений из 44, страница 1 из 2
18.09.2007, 08:17
    #34806742
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Очень хочу сделать элемент управления ActiveX и положить его на форму, разработанную на Delphi 7. Есть способ, правда он недокументированный:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    // тут всякие атрибуты для COM Expose
    public class MyBeautifulControl : UserControl, IMyBeautifulControl 
    {
        [ComRegisterFunction()]
        public static void RegisterClass(string key)
        {
            using (RegistryKey k = Registry.ClassesRoot.OpenSubKey(TrimClassesRoot(key), true))
            {
                RegistryKey ctrl = k.CreateSubKey("Control");
                ctrl.Close();
            }
        }

        [ComUnregisterFunction()]
        public static void UnregisterClass(string key)
        {
            using (RegistryKey k = Registry.ClassesRoot.OpenSubKey(TrimClassesRoot(key), true))
                k.DeleteSubKey("Control", false);
        }
    }
Суть метода состоит в том, что необходимо при регистрации COM объекта пометить, что он является контролом. Получается, что .Net Control реализует все необходимые интерфейсы, но почему-то не регистрируется в реестре как ActiveX Control. В .Net Framework 2.0 "это" вроде работает нормально. Вопрос в следующем. Какова вероятность того, что в будущих версиях .Net Framework "это" перестанет работать? Интересно Ваше мнение.
...
Рейтинг: 0 / 0
18.09.2007, 14:56
    #34808259
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
?
...
Рейтинг: 0 / 0
18.09.2007, 15:10
    #34808336
maybeleo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Алексей К? оно?
...
Рейтинг: 0 / 0
18.09.2007, 15:25
    #34808413
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
maybeleo Алексей К? оно?
MSDNRegistry Entry
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\

{CLSID}\Control

Remarks
This optional entry is used by containers to fill in dialog boxes. The container uses this subkey to determine whether to include an object in a dialog box that displays ActiveX Controls. A control can omit this entry if it is designed to work only with a specific container and therefore does is not intended to be inserted in other containers.
Да, это оно. Собственно, выделенное жирным и настораживает. Я даже знаю, что этим specific container-ом является Internet Explorer. К сожалению, я не знаю более разумного способа вставить контрол из .Net в Delphi.

В принципе, там необязательно использовать ActiveX. Задача, чтобы на .Net было разработано содержимое MDI Child формы. Мне показалось, что наиболее разумно MDI Child форму сделать в Delphi, а на неё положить "ActiveX.Net".
...
Рейтинг: 0 / 0
18.09.2007, 15:32
    #34808457
maybeleo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Алексей КСобственно, выделенное жирным и настораживает. Я даже знаю, что этим specific container-ом является Internet Explorer. К сожалению, я не знаю более разумного способа вставить контрол из .Net в Delphi.

В принципе, там необязательно использовать ActiveX. Задача, чтобы на .Net было разработано содержимое MDI Child формы. Мне показалось, что наиболее разумно MDI Child форму сделать в Delphi, а на неё положить "ActiveX.Net".Имхо, это вполне нормальный способ (все остальное мне видится только через большую ж...). Насчет будущих версий - так WinForms вроде менятся не будет... А значит, и способ, каким .NET контролы будут видны для натива, не поменяется.
...
Рейтинг: 0 / 0
18.09.2007, 15:42
    #34808513
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
maybeleoвсе остальное мне видится только через большую ж...Вчера целый день колдовал в виндовыми хэндлами, изучал реализацию MDI в WinForms и VCL. В итоге MDI форма получилась, но коряво. Разместить контрол на Delphi форме вроде получилось. Не получилось изменение фокуса в нём по кнопке Tab. Наверняка ещё много чего не получилось, но я просто пока не заметил. :-) Полная ж@па. В общем ладно, похоже вариантов больше нет. Остановлюсь на COM Expose + ActiveX Control.
...
Рейтинг: 0 / 0
18.09.2007, 15:43
    #34808521
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
maybeleoНасчет будущих версий - так WinForms вроде менятся не будет... А значит, и способ, каким .NET контролы будут видны для натива, не поменяется.Очень на это надеюсь. :-)
...
Рейтинг: 0 / 0
18.09.2007, 15:59
    #34808602
maybeleo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Алексей КНе получилось изменение фокуса в нём по кнопке TabЭто известный прикол. Когда-то я как-то решал такую проблемку, точно уже не помню, как. По-моему, в хосте ActiveX-компонента отдельно засылал такое событие в WndProc самого ActiveX-компонента. А в нем, при достижении "последнего" контрола, слал нажатие Tab-а "наверх", хосту компонента. Примерно так, конечно, немного гемморно. Ну да в сети можно нарыть примеры работающего решения, это точно, т.к. лажа сия, повторюсь, известная.
ЗЫ. <joke>Может, 1 известный дельфи-гуру подскажет точнее? :)</joke>
...
Рейтинг: 0 / 0
18.09.2007, 16:48
    #34808827
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
maybeleo Алексей КНе получилось изменение фокуса в нём по кнопке TabЭто известный прикол. Когда-то я как-то решал такую проблемку, точно уже не помню, как. По-моему, в хосте ActiveX-компонента отдельно засылал такое событие в WndProc самого ActiveX-компонента. А в нем, при достижении "последнего" контрола, слал нажатие Tab-а "наверх", хосту компонента. Примерно так, конечно, немного гемморно. Ну да в сети можно нарыть примеры работающего решения, это точно, т.к. лажа сия, повторюсь, известная.
ЗЫ. <joke>Может, 1 известный дельфи-гуру подскажет точнее? :)</joke>С ActiveX там вроде нормально, есть одна трабла, но её описание где-то раньше видел в MSDN. Проблема с Tab-ом была, когда я .Net Control размещал на "дельфийской" форме с помощью SetParent из WinAPI.
...
Рейтинг: 0 / 0
15.11.2007, 13:03
    #34941782
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Пипец кароче...
1. В ActiveX.Net создаём PropertyGrid.Net.
2. В "MDI child форма".Delphi7 создаём ActiveX.Net.

PropertyGrid начинает дико тормозить с при отрисовке. Скорость отрисовки напрямую зависит от количества видимых ячеек. Тот же PropertyGrid в обычном .Net приложении работает нормально. Кто-нибудь может объяснить природу траблы?
...
Рейтинг: 0 / 0
15.11.2007, 14:22
    #34942144
Volhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Алексей КПипец кароче...
1. В ActiveX.Net создаём PropertyGrid.Net.
2. В "MDI child форма".Delphi7 создаём ActiveX.Net.

PropertyGrid начинает дико тормозить с при отрисовке. Скорость отрисовки напрямую зависит от количества видимых ячеек. Тот же PropertyGrid в обычном .Net приложении работает нормально. Кто-нибудь может объяснить природу траблы?

ето от природы активХ =)
...
Рейтинг: 0 / 0
15.11.2007, 14:24
    #34942159
maybeleo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Алексей КИ это все время так, или только при первой прорисовке пропертигрида?
...
Рейтинг: 0 / 0
15.11.2007, 14:27
    #34942178
Volhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Volhv Алексей КПипец кароче...
1. В ActiveX.Net создаём PropertyGrid.Net.
2. В "MDI child форма".Delphi7 создаём ActiveX.Net.

PropertyGrid начинает дико тормозить с при отрисовке. Скорость отрисовки напрямую зависит от количества видимых ячеек. Тот же PropertyGrid в обычном .Net приложении работает нормально. Кто-нибудь может объяснить природу траблы?

ето от природы активХ =)


в актив Х - не стоит запихивать часто перерисовываемые обьекты - потому что показывается картинка а не прямая отрисовка (буферизируемая кароче)
...
Рейтинг: 0 / 0
15.11.2007, 14:28
    #34942179
Volhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
по етому в обычном приложении обновляется только регион - а в ActiveX - весь блок контролла
...
Рейтинг: 0 / 0
15.11.2007, 14:44
    #34942246
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
maybeleoИ это все время так, или только при первой прорисовке пропертигрида?Всё время. При вызове PropertyGrid.Refresh();
Volhvето от природы активХ =)
Ну вообще странно. В этом же контроле находится мегатормозной DataGridView. Отрисовывается не хуже чем обычно. Скрываем панель с PropertyGrid-ом - всё нормализовывается. Резайзим SplitContainer, чтобы в PropertyGrid отображалась одна ячейка - всё летает. Ладно, завтра дальше буду разбираться. Похоже весёлые будут выходные.
...
Рейтинг: 0 / 0
15.11.2007, 15:06
    #34942332
maybeleo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Алексей КВсё время. При вызове PropertyGrid.Refresh();Так-так... Именно при рефреше? Т.е. если у него позвать Invalidate() + Update(), а не Refresh(), эффект тот же? (смотрю в рефлекторе на евойный рефреш)
...
Рейтинг: 0 / 0
15.11.2007, 15:09
    #34942348
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
maybeleo Алексей КВсё время. При вызове PropertyGrid.Refresh();Так-так... Именно при рефреше? Т.е. если у него позвать Invalidate() + Update(), а не Refresh(), эффект тот же? (смотрю в рефлекторе на евойный рефреш)Пока ещё не пробовал. Спасибо. Завтра попробую.
...
Рейтинг: 0 / 0
16.11.2007, 07:00
    #34943580
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Как-то странно он себя ведёт:

Refresh() - ~300 милисекунд
Invalidate() + Update() - ~1 милисекунда

Просто перерисовка происходит быстро. Долго происходит обновление значений свойств + перерисовка. Ладно, ещё поэкспериментирую.
...
Рейтинг: 0 / 0
16.11.2007, 07:14
    #34943590
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Там у меня подсоединён CustomTypeDescriptor. Если в GetProperties возвращается та же коллекция PropertyDescriptor-ов, то всё работает быстро. А у меня она каждый раз пересоздаётся. Попробую по-другому написать. Всем спасибо. :-))
...
Рейтинг: 0 / 0
16.11.2007, 07:23
    #34943592
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Всё, проверил. Нельзя каждый раз создавать новую PropertyDescriptorCollection.

ЗЫ: странно, что в обычном .Net приложении работало нормально...
...
Рейтинг: 0 / 0
16.11.2007, 10:57
    #34944056
maybeleo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Алексей КВсё, проверил. Нельзя каждый раз создавать новую PropertyDescriptorCollection.

ЗЫ: странно, что в обычном .Net приложении работало нормально...Хи-хи, вот я так и подумал.
ЗЫ. Алексей, если будет повод, не могли бы Вы как-нить на досуге проверить скорость работы рефлексии, когда что-то нетовское оформлено в виде ActiveX и хостится в нативном приложении? Косяк, как Вы увидели, какой-то с этим есть, только действительно непонятно, почему...
...
Рейтинг: 0 / 0
16.11.2007, 11:20
    #34944148
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
maybeleoпроверить скорость работы рефлексииА там у меня рефлексии как таковой нет. Там обращение идёт через мой наследник от CustomTypeDescriptor + MyPropertyDescriptor. Дальше оно обращается к ICustomTypeDescriptor реализации в DataRowView.

ЗЫ: Если встречу там какие-нибудь траблы с рефлекшеном - напишу. Пока кроме недавней проблемы траблов больше не замечено.
...
Рейтинг: 0 / 0
27.11.2007, 06:56
    #34966925
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Условия задачи те же. Имеем форму на Delphi 7. На ней лежит ActiveX.Net. Возникла следующая проблема. Неправильно обрабатываются клавиши "вправо", "влево", "вверх" и "вниз". Например, когда фокус ввода находится в TextBox, вместо перемещения курсора происходит изменение фокуса. Если поместить тот же контрол на форму в Excel 2003, то все работает нормально. Интересуют следующие вопросы:

1. Почему такое имеет место быть в Delphi?
2. Ваше мнение о моём решении проблемы. Чего я ещё мог не учесть? В каких условиях это может не работать?

Код: 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.
//экспортируемый контрол
public class MyControl : UserControl, IMyControl
{
        #region Arrow Keys Management

        private const int WM_GETDLGCODE = 0x0087;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_KEYUP = 0x0101;

        private const int DLGC_WANTARROWS = 0x0001;

        [DllImport("User32.dll")]
        private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_GETDLGCODE)
            {
                m.Result = (IntPtr)DLGC_WANTARROWS;
                return;
            }

            if (m.Msg == WM_KEYDOWN || m.Msg == WM_KEYUP)
            {
                int keyCode = (int)m.WParam;
                if (keyCode == (int)Keys.Left || keyCode == (int)Keys.Right ||
                    keyCode == (int)Keys.Up || keyCode == (int)Keys.Down)
                {
                    Control activeControl = FormUtils.GetActiveControl(this);
                    SendMessage(activeControl.Handle, m.Msg, m.WParam, m.LParam);
                    return;
                }
            }

            base.WndProc(ref m);
        }

        #endregion
}

public static class FormUtils
{
        public static Control GetActiveControl(Control ac)
        {
            while (ac != null && ac is IContainerControl)
                ac = ((IContainerControl)ac).ActiveControl;
            return ac;
        }
}
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.12.2015, 10:56
    #39129459
Ashoorup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
Очень интересует данная тема.
Есть ли какой-нибудь рабочий пример ActiveX контрола? Весь тырнет перерыл... все как-то про COM, а данная тема так нигде нормально не раскрыта...
...
Рейтинг: 0 / 0
16.12.2015, 14:10
    #39129783
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интеграция / 25 сообщений из 44, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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