powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интеграция
25 сообщений из 44, страница 1 из 2
Интеграция
    #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
Интеграция
    #34808259
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?
...
Рейтинг: 0 / 0
Интеграция
    #34808336
maybeleo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К? оно?
...
Рейтинг: 0 / 0
Интеграция
    #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
Интеграция
    #34808457
maybeleo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСобственно, выделенное жирным и настораживает. Я даже знаю, что этим specific container-ом является Internet Explorer. К сожалению, я не знаю более разумного способа вставить контрол из .Net в Delphi.

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

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

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

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

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

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


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

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

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

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

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

ЗЫ: Если встречу там какие-нибудь траблы с рефлекшеном - напишу. Пока кроме недавней проблемы траблов больше не замечено.
...
Рейтинг: 0 / 0
Интеграция
    #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
Период между сообщениями больше года.
Интеграция
    #39129459
Ashoorup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень интересует данная тема.
Есть ли какой-нибудь рабочий пример ActiveX контрола? Весь тырнет перерыл... все как-то про COM, а данная тема так нигде нормально не раскрыта...
...
Рейтинг: 0 / 0
Интеграция
    #39129783
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интеграция
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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