powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / формы и фрэймы из dll
54 сообщений из 54, показаны все 3 страниц
формы и фрэймы из dll
    #38857690
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для приложения нужен плагин в виде dll, в нем будет TForm и TFrame.

Меня ждало эпичное разочарование как вы уже могли догадаться.

В начале начал считать себя полным дураком когда TFrame не хотел отрисовываться и когда выдавал "not Assign TFont"
Пошел гуглить и я был разачораван еще больше, решения нет в природе.

Потом решил использовать TForm вместо фрэйма, и тут блин меня ждет опять разочарования.
Код: pascal
1.
2.
3.
Form := TForm1.Create(AOwner);
  Form.ParentWindow := TWinControl(AOwner).Handle;
  Form.Show;


Форма рисуется в окне но управление могут получить только кнопки, edit и memo в ступоре.

Есть пара вопросов:
bpl-ки не предлогать

1. Есть ли у кого нибудь рабочее решения по Созданию и отображению TFrame из dll ????
2. Как исправить ситуацию с TForm, что бы форма получала управление???
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857694
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause1. Есть ли у кого нибудь рабочее решения
Поверить первому впечатлению в третьей строке и сменить работу на адекватную.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857710
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня моя работа вполне устраивает.

Такая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже самое?
Или Windows виноват?
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857737
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause,
Form.ParentWindow := TWinControl(AOwner).Handle;
т.е. внутри формы должна быть другая форма?
или твоя форма должна просто открыться что-то сделать и закрыться.

Если вариант 1, то ответ здесь 16027901
Если вариант два, то не назначай Parent.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857785
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да именно первый вариант.

Такая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже самое?
Или Windows виноват?

Как строить модульное приложение на Delphi? Что бы в качестве плагинов были dll и можно было на главной форме рисовать формы и фрэймы?
Как это делают корпаративные клиенты Embarcadero? Или они все в одно приложение пихают и когда нужно что то новое добавить компилят весь проект заново?

Спасибо за внимание!!!
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857814
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseКак это делают корпаративные клиенты Embarcadero? Или они все в одно приложение пихают и когда нужно что то новое добавить компилят весь проект заново?


До решения этой задачи нужно пройти долгий мучительный путь, длиной не в один год.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857830
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же не прошу код или библиотеку.
Смысл и теорию. Если знаете поделились бы идеей.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857832
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause,

1) Сходи на сайт TotalCommander - там есть статейка (старая правда), как организовать плагин в виде формы с RichEdit`ом для Тотала. Пример работоспособный.
2) Фреймы в ДЛЛ - без правки исходников VCL - забудь - ничего путного не получится.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857835
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMastercrause,

1) Сходи на сайт TotalCommander - там есть статейка (старая правда), как организовать плагин в виде формы с RichEdit`ом для Тотала. Пример работоспособный.
2) Фреймы в ДЛЛ - без правки исходников VCL - забудь - ничего путного не получится.

Фрэймы откинул сразу после чтения гугла.

Такая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже самое?
Или Windows виноват?
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857840
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseИли Windows виноват?Билл Гейтс
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857842
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseДа именно первый вариант.

Такая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже самое?
Или Windows виноват?

Как строить модульное приложение на Delphi? Что бы в качестве плагинов были dll и можно было на главной форме рисовать формы и фрэймы?
Как это делают корпаративные клиенты Embarcadero? Или они все в одно приложение пихают и когда нужно что то новое добавить компилят весь проект заново?

Спасибо за внимание!!!
Я ж тебе ссылку показал на сообщение для первого варианта.
йодновременное присутствие WS_CHILD и WS_CAPTION в стиле класса окна (что получится при Panent=someParentForm и BorderStyle<>bsNone) не позволяют такому окну нормально активироваться по клику юзера (кэпшен серый, в эдиты нельзя войти) - это багофича винды
для нормальной активации приходится делать фокусируемому дочернему окну
SendMessage(ChildFormThat Got Focus.Handle, WM_NCACTIVATE , 1 , 0);
а его брату-соседу, потерявшему фокус -
SendMessage(ChildFormThat Lost Focus.Handle, WM_NCACTIVATE , 0 , 0);
багофича винды.

Я реализовывал плагинную систему через псевдо MDI.
1 Dll(Bpl) - 1 форма.
окна обычные, но ведут себя как MDI. Переопределив класс TForm и некоторые методы по расположению и поведению окон. Все формы плагина унаследуются только от нее.

Вот тебе для размышления поведения VCL.
На кнопку вешаешь.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm3.Button1Click(Sender: TObject);
var
  a: TForm;
begin
  a := TForm.Create(Self);
  a.Show;
end;


И дочерняя форма всегда поверх главной. При том Parent у нее nil.
А вот ее запрет за выход за границы основной формы разворачивание и прочее (аля MDI) уже реализовываешь сам.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857846
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovДо решения этой задачи нужно пройти долгий мучительный путь, длиной не в один год.
Неверно. Есть два пути. Либо иметь мозги и за тридцать секунд поставить одну галку, либо мозгов не иметь, и тогда "долгий мучительный путь" будет вечным, до тех пор, пока не найдётся начальник либо сменщик с мозгами. Далее см. пункт 1.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857850
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseДа именно первый вариант.

Такая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже самое?
Или Windows виноват?

Как строить модульное приложение на Delphi? Что бы в качестве плагинов были dll и можно было на главной форме рисовать формы и фрэймы?
Как это делают корпаративные клиенты Embarcadero? Или они все в одно приложение пихают и когда нужно что то новое добавить компилят весь проект заново?

Спасибо за внимание!!!
Все по-разному.
Я модули расширения в базе данных храню: залил новые модули, вот они сразу у всех клиентов и доступны. И доступ к модулям легко разграничить.
В модулях всего одна экспортируемая функция, которая возвращают экземпляр класса, реализующего набор интерфейсов.
Один из интерфейсов - содержит свойства, описывающие модуль (название, тип модуля и т.п.). Другие интерфейсы описывают группы свойство и методов, соответствующие конкретному типу модуля. Например, есть модули, которые встраиваются в визуальный интерфейс(появляются дополнительные пункты меню, панельки, закладки и т.п.) . А есть модули вообще невидимые, выполняющие какие-то специальные задачи - например, регистрирующие бизнес - события (утверждение документов, удаление справочников и т.п.).
Реализовать легко, расширять легко. Только надо быть осторожными: например, можно умудриться выгрузить модуль при живой ссылке на интерфейс. Ну, такиеопасные вещи нужно собрать в общую библиотеку и тщательно отладить их.
...
...
Для расширения функциональности вместо .dll еще можно использовать скриптовые языки.

Кому что в голову взбредет, короче.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857854
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster...
2) Фреймы в ДЛЛ - без правки исходников VCL - забудь - ничего путного не получится.

crause...
Фрэймы откинул сразу после чтения гугла.
...

Какие-то чудовищные заявления.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857858
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseТакая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже
самое?
Только в Embarcadero. Переходи на Visual Studio и будет тебе счастье.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857864
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДВ модулях всего одна экспортируемая функция, которая возвращают экземпляр класса, реализующего набор интерфейсов. Один из интерфейсов - содержит свойства, описывающие модуль (название, тип модуля и т.п.).
Имхо тут гораздо лучше обратный дизайн. Модуль вообще ничего не экспортирует; вместо этого он обращается к ядру и регистрирует свои фичи (для этого достаточно прописать такие вызовы в initialization). Как следствие, процесс становится проще, менее связанным и гораздо удобнее с точки зрения внесения изменений.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857871
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer...
Имхо тут гораздо лучше обратный дизайн. Модуль вообще ничего не экспортирует; вместо этого он обращается к ядру и регистрирует свои фичи (для этого достаточно прописать такие вызовы в initialization). Как следствие, процесс становится проще, менее связанным и гораздо удобнее с точки зрения внесения изменений.

Может, в этом и есть смысл. Вопрос особенностей технической реализации. Мы особо не заморачивались выбором.
Может, из-за того, что слишком быстро все заработало, и мы больше ядро не трогали, а все силы на прикладной функционал модулей бросили.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857901
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseЕсть ли у кого нибудь рабочее решения по Созданию и отображению TFrame из dll ?

Если посмотреть дерево наследования, то можно заметить, что TFrame не сильно отличается от TForm. И, насколько я еще помню VCL, ничто не мешает расположить одну форму в другой.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38857926
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseТакая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже самое?
Или Windows виноват? Больше всех виноват Borland, который придумал пакеты и строго настрого запретил ими пользоваться.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858145
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crauseЯ же не прошу код или библиотеку.
Смысл и теорию. Если знаете поделились бы идеей.

crause,

Добрый день,

Делал такую штуку: приложение не создает форму, ее создает dll. Приложение работает с dll, хранящейся в БД. При запуске приложение соединяется с БД, вытягивает dll, если версия dll в БД не совпадает с текущей версией dll, вытянутой на предыдущих запусках приложения.

Главная форма приложения создается в dll. На ней, кстати, есть frame-ы.

Идея такой реализации очевидна: приложение стоит у многих пользователей. Чтобы изменить интерфейс меняем dll в одном месте(БД), все приложения ее подхватывают. Futuron от Dom.ru, если кто знаком, судя по отсутствию хинтов в приложении, так и работает.

Основной совет - передавать в dll Application и Screen.

Код(кусочно):

Приложение:

Код: pascal
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.
type
  RInitArgs = packed record
    iApplication: TApplication;
    iScreen: TScreen;

    oForm: TForm; // идея возвращать форму, не нашла продолжения
  end;

  RCloseArgs = packed record
    //урезал в рамках примера
  end;

  TInit = function(var aInitArgs: RInitArgs): Boolean; stdcall;
  TClose = function(var aCloseArgs: RCloseArgs): Boolean; stdcall;

var
  lFilePath: String;

  lHandle: THandle;
  lInit: TInit;
  lClose: TClose;

  lInitArgs: RInitArgs;
  lCloseArgs: RCloseArgs;

  lConnectError: String;
begin
// ...код загрузки dll, означивание lFilePath...
  try
      Application.Initialize;
      Application.MainFormOnTaskbar := True;

      lHandle := LoadLibrary(PChar(lFilePath));
      if lHandle = 0 then
        RaiseExceptionFormat(rsLoadLibraryError, [lFilePath, GetLastError]);

      lInit := GetProcAddress(lHandle, cEntryInit);
      if not assigned(lInit) then
        RaiseExceptionFormat(rsLibraryEntryNotFound, [lFilePath, cEntryInit]);

      lClose := GetProcAddress(lHandle, cEntryClose);
      if not assigned(lClose) then
        RaiseExceptionFormat(rsLibraryEntryNotFound, [lFilePath, cEntryClose]);

      lInitArgs.iApplication := Application;
      lInitArgs.iScreen := Screen;

      if not lInit(lInitArgs) then
        RaiseException(rsInitError);
      try
        Application.Run;
      finally
        lClose(lCloseArgs);
      end;
    except
      on E: Exception do
        begin
          ShowMessage(rsAppRunError);
        end;
    end;
end.



DLL:

Код: pascal
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.
function Init(var aInitArgs: RInitArgs): Boolean; stdcall;
var
  lCloseArgs: RCloseArgs;
begin
  Result := False;
  try
    gApplication := Application;
    gScreen := Screen;

    Application := aInitArgs.iApplication;
    Screen := aInitArgs.iScreen;

    Application.ShowHint := True;
    Application.CreateForm(TMainForm, gForm);
    Application.CreateForm(TResourceForm, ResourceForm); // все ImageList-ы на TResourceForm
    aInitArgs.oForm := gForm;

    gForm.Initialize;

    Result := True;
  except
    on E: Exception do
      begin
        Result := False;

        Close(lCloseArgs);
      end;
  end;
end;

function Close(var aCloseArgs: RCloseArgs): Boolean; stdcall;
begin
   if gForm <> nil then
     begin
       gForm.Finalize();
       gForm.Free;
       gForm := nil;
     end;

  Application := gApplication;
  Screen := gScreen;
end;

exports
  Init,
  Close;

begin
end.



Форма в dll(демонстрация frame, TPageNavigatorFrame в свою очередь также содержит frame-ы):

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TMainForm = class(TForm)
  PageNavigatorFrameMain: TPageNavigatorFrame;
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
private
public
  procedure Initialize();
  procedure Finalize();
end;




Проблема Cannot assign TFont с хинтами(а еще со скроллом одного из компонент) остается. Пока решение нашлось только в билде и приложения и библиотеки с опцией Link with runtime packages. При этом достаточно одного пакета vcl. Рядом с приложением после такого билда необходимо будет положить файлы rtlXXX.bpl и vclXXX.bpl. XXX - зависит от версии Delphi. Точные названия файлов также можно будет узнать, запустив приложение на машине без установленного Delphi - при запуске будут сообщения об отсутствии данных файлов.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858191
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисcrauseТакая грабля только в Embarcadero-продуктах или в том же Visual Studio тоже самое?
Или Windows виноват? Больше всех виноват Borland, который придумал пакеты и строго настрого запретил ими пользоваться.

BPL - всем удобны за исключением одной маленькой штуки - они должны компилироваться одной версией во избежание. Поддержка от сторонних плагинописателей становится проблематичной.

В принципе у GunSmoker`a есть хороший набор статей о написании плагинов - для ТС - самое то.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858226
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseПотом решил использовать TForm вместо фрэйма, и тут блин меня ждет опять разочарования.
Код: pascal
1.
2.
3.
Form := TForm1.Create(AOwner);
  Form.ParentWindow := TWinControl(AOwner).Handle;
  Form.Show;


Форма рисуется в окне но управление могут получить только кнопки, edit и memo в ступоре.

Есть пара вопросов:
bpl-ки не предлогать

1. Есть ли у кого нибудь рабочее решения по Созданию и отображению TFrame из dll ????
2. Как исправить ситуацию с TForm, что бы форма получала управление???

Я делаю так:
Код: pascal
1.
2.
3.
4.
5.
    frm := TConfigForm.CreateParented(ParentHandle);
    frm.Left := 0;
    frm.Top := 0;
    frm.Show;
    Application.InsertComponent(frm);


Тоже не идеальный вариант (не работает перебор контролов клавишей Tab), но хотя бы использовать можно.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858245
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterBPL - всем удобны за исключением одной маленькой штуки - они должны компилироваться одной версией во избежание. Поддержка от сторонних плагинописателей становится проблематичной.
Поддержка от сторонних плагинописателей нужна в 0.01% проектов; остальные играют роль неуловимого Джо. Тем не менее, проблематичной она не становится, поскольку есть два пути её сделать, один простой, другой правильный.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858264
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе у GunSmoker`a есть хороший набор статей о написании плагинов - для ТС - самое то Замечательный набор статей, но там описывается прнцип работы. Если не ошибаюсь там строчки не было как frame или form нарисовать на из dll

RWolf , еще и Tab не работает. Спасибо что подсказади, потом бы мучался.

AntonioPermskiy , у вас Tab работает в окнах и фрэймах?

Знатоки!!! Я думаю проблему с табами можно решить каким то сообщением для окна или параметром. Подсказку в студию пожалуйста.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858270
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerDarkMasterBPL - всем удобны за исключением одной маленькой штуки - они должны компилироваться одной версией во избежание. Поддержка от сторонних плагинописателей становится проблематичной.
Поддержка от сторонних плагинописателей нужна в 0.01% проектов; остальные играют роль неуловимого Джо. Тем не менее, проблематичной она не становится, поскольку есть два пути её сделать, один простой, другой правильный.

Может сэр приведет правильный пример кода?
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858346
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterМожет сэр приведет правильный пример кода?
Образцом для этого случая сэр всегда называл автоматизацию MS Office-а. Код, простите, не приведу - многовато, а в вопросе "как правильно поддерживать плагины посторонних производителей" ответ довольно очевиден - опубликовать для них API создания форм, кнопок итп. Примеры можно посмотреть, например, в FARе.

Если не хочется тратить много времени на развесистое API вида "создать тот-другой-десятый-двадцатый компонент и установить его свойства", можно использовать ту или иную автоматизацию. Например, опубликовать метод "десериализовать dfm" или "выполнить fastscript-скрипт", и, соответственно, там и описывать конструируемую форму. Главное, итог должен быть один - в результате вызова API сконструированы родные для ядра компоненты.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858359
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot crause] AntonioPermskiy , у вас Tab работает в окнах и фрэймах?


Tab работает. Если вы имеете ввиду переключение фокуса между компонентами с TabStop=true.

Проверил переход между вкладками у PageControl-а по Ctrl+Tab. Работает только для основного PageControl-а. Но это свойственно и простому приложению, в котором, например, на форме лежит PageControl, на одной странице которого размещен еще PageControl или Frame с PageControl-ом.
Возможно, есть другие сочетания для подобных переходов с клавиатуры, не озадачивался.

PS. Лучше на ты
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38858396
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerответ довольно очевиден - опубликовать для них API создания форм, кнопок
итп. Примеры можно посмотреть, например, в FARе.
Зачем же так далеко ходить? Достаточно посмотреть на Winapi CreateWindow() к которому
полно примеров.

softwarerможно использовать ту или иную автоматизацию. Например, опубликовать метод
"десериализовать dfm" или "выполнить fastscript-скрипт", и, соответственно, там и
описывать конструируемую форму.

За примерами вызова CreateDialog() тоже далеко ходить не надо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38859082
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдруг до меня дошел смысл вопроса. Мне захотелось написать рассказ о том как windows взаимодействует с приложением, как делать обработку событий... А потом, ради интереса, ввел в гугл строку "delphi frame in dll". Первый же пример оказался рабочим.

Поскольку я потратил время на гугл и проверку работы, привожу ссылку на статью и код:


Код: pascal
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.
library DLLFrame;

uses
  SysUtils, Classes, Controls, Forms, Windows,
  DllFrameFrame in 'DllFrameFrame.pas' {Frame1: TFrame};

procedure AddFrame(ApplicationHandle, ParentHandle: THandle); stdcall;
var
  Frame1: TFrame1;
  AppHandle: THandle;
begin
  AppHandle := Application.Handle;
  Application.Handle := ApplicationHandle;
  Frame1 := TFrame1.Create(Application);
  Frame1.ParentWindow := ParentHandle;
  SetParent(Frame1.Handle, ParentHandle);
  Frame1.Align := alClient;
  Frame1.Visible := True;
  Application.Handle := AppHandle;
end;

exports
  AddFrame;

begin
end.

unit DllFrameFrame;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
  TFrame1 = class(TFrame)
    Label1: TLabel;
    Label2: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

end.

program LoadDLLFrame;

uses
  Forms, LoadDLLFrameMn in 'LoadDLLFrameMn.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

unit LoadDLLFrameMn;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure AddFrame(ApplicationHandle, ParentHandle: THandle); stdcall;

implementation

{$R *.dfm}

procedure AddFrame(ApplicationHandle, ParentHandle: THandle); stdcall;
  external 'DLLFrame.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  AddFrame(Application.Handle, Panel1.Handle);
end;

end.


...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #38859170
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarВдруг до меня дошел смысл вопроса. Мне захотелось написать рассказ о том как windows взаимодействует с приложением, как делать обработку событий... А потом, ради интереса, ввел в гугл строку "delphi frame in dll". Первый же пример оказался рабочим.

Поскольку я потратил время на гугл и проверку работы, привожу ссылку на статью и код:


Код: pascal
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.
library DLLFrame;

uses
  SysUtils, Classes, Controls, Forms, Windows,
  DllFrameFrame in 'DllFrameFrame.pas' {Frame1: TFrame};

procedure AddFrame(ApplicationHandle, ParentHandle: THandle); stdcall;
var
  Frame1: TFrame1;
  AppHandle: THandle;
begin
  AppHandle := Application.Handle;
  Application.Handle := ApplicationHandle;
  Frame1 := TFrame1.Create(Application);
  Frame1.ParentWindow := ParentHandle;
  SetParent(Frame1.Handle, ParentHandle);
  Frame1.Align := alClient;
  Frame1.Visible := True;
  Application.Handle := AppHandle;
end;

exports
  AddFrame;

begin
end.

unit DllFrameFrame;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
  TFrame1 = class(TFrame)
    Label1: TLabel;
    Label2: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

end.

program LoadDLLFrame;

uses
  Forms, LoadDLLFrameMn in 'LoadDLLFrameMn.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

unit LoadDLLFrameMn;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure AddFrame(ApplicationHandle, ParentHandle: THandle); stdcall;

implementation

{$R *.dfm}

procedure AddFrame(ApplicationHandle, ParentHandle: THandle); stdcall;
  external 'DLLFrame.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  AddFrame(Application.Handle, Panel1.Handle);
end;

end.




Тоже его находил, да работает, но фрэйм получается Ctl3d := False;
Фиг знает что он еще там выкидывает.

Если мы только для себя пишем приложение и будем только мы добавлять дополнительные модули функций (плагины), то такой подход можно и использовать, но как писал GunSmoker в других версиях той же delphi уже могут возникнуть проблемы (если я правильно понял), из-за использования Thandle в данном случае (Объект Tapplication), а так же из-за модификации этих объектов.

На мой взгляд лучше всего использовать формы, даже при отладке, что не рисовать нашу форму на нужном месте просто отображаем ее модально например.


RWolfТоже не идеальный вариант (не работает перебор контролов клавишей Tab), но хотя бы использовать можно.
Проблема Tab решается в статье от GunSmoker вроде 6 часть, в исходнике посмотреть придется как и что. И Да я ошибался он писал про рисование компонентов.
Что бы окно новое нарисованное получило каретку ввода в мемо или edit нужно послать при Show формы Perform(WM_NCActivate, 1, 0);
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015373
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поторопился я с повледним постом насчет клавиши Tab.

имеем приложение с главной формой,
имеем загруженную dll в это приложение и созданную форму из dll (TForm.Create(nil);)

через SetParent(ChildForm, MainForm) добавляем форму из dll в форму приложения.

единственная беда, форма из dll не обрабатывает клавишу Tab

как починить данное неприятность?
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015379
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseединственная беда
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015391
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarercrauseединственная беда


что меня еще ждет?

посоветуйте что нибудь насчет Tab
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015697
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy> Основной совет - передавать в dll Application и Screen.

Application.Handle необходим, а Screen - не нужен абсолютно.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015706
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorAntonioPermskiy> Основной совет - передавать в dll Application и Screen.

Application.Handle необходим, а Screen - не нужен абсолютно.

хотелось бы Application.Handle;
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015715
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseчто меня еще ждет?
Представьте себе, что по экватору планеты Земля через каждые десять метров положены грабли. Так вот, Вас ждёт кругосветное путешествие.

crauseпосоветуйте что нибудь насчет Tab
От разумного совета Вы отказались ещё год назад. А глупых я предпочитаю не давать, ибо не компетентен.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015725
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause> Что мешает его передать в DLL?

Классика. Примеры в любой книжке по Delphi.
И всё разжёвано.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015811
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseпоторопился я с повледним постом насчет клавиши Tab.

имеем приложение с главной формой,
имеем загруженную dll в это приложение и созданную форму из dll (TForm.Create(nil);)

через SetParent(ChildForm, MainForm) добавляем форму из dll в форму приложения.

единственная беда, форма из dll не обрабатывает клавишу Tab

как починить данное неприятность?
У формы в dll нужно переопределить
Код: pascal
1.
    function WantChildKey(Child: TControl; var Message: TMessage): Boolean; override;  



вот таким кодом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function TForm.WantChildKey(Child: TControl;
  var Message: TMessage): Boolean;
begin
  Result := ((Message.Msg = WM_CHAR) and (Message.WParam = VK_TAB)) or
    (Child.Perform(CN_BASE + Message.Msg, Message.WParam,
      Message.LParam) <> 0);
end;



PS: на Delphi7 работало, откопал я это в исходниках ActiveXForm, на более старших версиях надо проверять
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39015841
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Классическая "труба" для сообщений.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39016214
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterkealon(Ruslan),

Классическая "труба" для сообщений.
вся VCL в таких трубах + куча "неоконных контролов" , из-за этого и грабли всякие будут переть постоянно, чуть шаг в сторону

PS: автор бы хоть отписался, появился у него реакция на таб или нет
PPS: для себя я решил, что лучше для winAPI простые обёртки использовать, а нужные контролы самому сделать в пределах оконной системы - меньше проблем
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39016228
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)для себя я решил, что лучше для winAPI простые обёртки использовать, а нужные контролы самому сделать в пределах оконной системы - меньше проблемэто по нашему. Разобраться с работающим кодом сложнее, чем написать свой велосипед
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39016238
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторPS: автор бы хоть отписался, появился у него реакция на таб или нет
выходные были, не мог ответить.
Xe5, Xe7 - tab заработал.

Спасибо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
формы и фрэймы из dll
    #39493279
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. если у меня есть Handle какого-нибудь окна, который с кучей всего там, то никак нельзя положить это окно к себе на TPanel/TForm? Потому что когда делал SetParent - ну, никаких дочерних контролов не отрисовалось с того окна. В своем же процессе, кстати. Известен только хэндл.

softwarerDarkMasterМожет сэр приведет правильный пример кода?Главное, итог должен быть один - в результате вызова API сконструированы родные для ядра компоненты.Вот к этому все и идет походу, типа CreateDialog.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493331
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кар-КарТ.е. если у меня есть Handle какого-нибудь окна, который с кучей всего там, то никак нельзя положить это окно к себе на TPanel/TForm? Потому что когда делал SetParent - ну, никаких дочерних контролов не отрисовалось с того окна. В своем же процессе, кстати. Известен только хэндл.

а ты емe место указал потом? SetWindowPos
Кар-Карsoftwarerпропущено...
Главное, итог должен быть один - в результате вызова API сконструированы родные для ядра компоненты.Вот к этому все и идет походу, типа CreateDialog.можно конечно, не так сложно кстати - регистрируешь свой класс окна и создавай его сколько влезет
вот только с VCL косячок, не особо оно заточено для этого
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493396
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Не указал, но панель появилась на форме, просто пустая без дочерних контролов. Пофиксил так:
Код: pascal
1.
2.
3.
4.
5.
procedure TUnknownPlugin.Parent(const Window:THandle);
begin
FForm.Parent := nil;
FForm.ParentWindow := Window;
end;



Вообще у меня "плагины" в самом экзешнике, но делается вид как будто в сторонней длл-ке. Реально делаю экспорт чисто интерфейса и LoadLibrary / GetProcAddress на себя же. У мну задача была формошлёпство оставить любой ценой =) Tab работает кстати, только между разными плагинскими формами не переходит.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493417
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кар-Кар,

если вы используете статическую линковку рантайма и VCL нужно знать как реализованы объекты на низком уровне

между модулями (dll) можно свободно передавать только простые типы: Int..., Double, ..., Interface

не выпускать исключения, созданные в одном модуле, в другой модуль - здравствуйте коды возврата

освобождать память только в том модуле где она выделена, или использовать глобальный менеджер памяти

по возможности использовать общепринятые декларации вызовов: stdcall, ccall
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493561
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)между модулями (dll) можно свободно передавать только простые типы: Int..., Double, ..., Interface

И следствие из этого, которое никому не приходит в голову: в модулях нельзя создавать объекты, функционирование которых подразумевает такую передачу (TForm, TControl, TDataset и так далее).
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493677
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerkealon(Ruslan)между модулями (dll) можно свободно передавать только простые типы: Int..., Double, ..., Interface

И следствие из этого, которое никому не приходит в голову: в модулях нельзя создавать объекты, функционирование которых подразумевает такую передачу (TForm, TControl, TDataset и так далее).ну почему, создавать то можно, передавать их нельзя.
C TForm только много мороки, тянет слишком много за собой, но к VCL в целом и так куча претензий - проще WinApi пользоваться через легковесные обёртки типа WTL
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493680
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)...TForm ... тянет слишком много за собой, но к VCL в целом и так куча претензий - проще WinApi пользоваться ...
Привет, приплыли.
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493691
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да лишь бы формочки можно было бы лепить визуально . Удобно же: понакидал контролов, накалякал кода в ButtonXClick , экспортировал интерфейс с 8 методам (у меня столько) и пускай прога показывает как хочет - в окне в углу в меню.

Щаз так, они там сами должны подписываться на сообщения которые прога будет испускать.
Код: pascal
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.
  //Визуальная поддержка детектед
  IRender = interface
  ['{5773D16D-00EE-4125-B5A8-F22E1C7CEC3A}']
    //помести себя сюда
    procedure Parent(const Window:THandle); 
    //на всякий случай, всякие OnWheel / OnMouse / OnKey
    procedure Process(var Message);
    //Хэндл не знает где он и что происходит, так что просим там внутри задать размеры
    procedure Placement(const Left,Top,Height,Width:Integer); 
    //тебя покажут - запускай работу
    procedure Show; 
    //тебя скрывают - приостанови работу
    procedure Hide;  
    //готов показаться?
    function OKToShow:BOOL; 
  end;
  
  //Плагин детектед
  IPlugin = interface
  ['{C800BE91-C6CF-4F95-B4B5-18CC7B08D298}']
    function ClassName:WideString;
    function ClassDesc:WideString;
    function ClassHint:WideString;
    function ClassGuid:TGUID;
    function ClassMode:TGUID;
    function ClassCategory:WideString;
    function Load(const Stream:IStream):BOOL;
    function Save(const Stream:IStream):BOOL;
  end;



Вообще, только один вопрос: а что если этот интерфейс реализует, допустим, Qt/C#/Java? Там у них внутри сможет переместиться ко мне в Delphi, если я передам ему хэндл куда? Т.е. пусть сами разбираются) Мне это не нужно, но просто интересно. Знаю, что они могут делать 75 скриншотов себя в секунду и так отрисовываться lol
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493767
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДkealon(Ruslan)...TForm ... тянет слишком много за собой, но к VCL в целом и так куча претензий - проще WinApi пользоваться ...
Привет, приплыли. проблема не в раз реализовать - выкуривается модуль ActiveX и потом по багам, проблема это поддерживать в переходах между разными версиями дельфи
второе раз реализовал, и работает и на Delphi и на fpc, обычно что-то архисложное в плагине не требуется

Кар-Кар,
достаточно получить хэндл окна плагина, а дальше уже можно полностью с ним работать
позиционирование, удаление - всё в WinAPI есть, протягиваются только сервисные функции плагина, которых естественно в WinAPI нет

Кар-КарВообще, только один вопрос: а что если этот интерфейс реализует, допустим, Qt/C#/Java? Там у них внутри сможет переместиться ко мне в Delphi, если я передам ему хэндл куда? Т.е. пусть сами разбираются) Мне это не нужно, но просто интересно такого же рода проблема что и с VCL, только куда заморочнее. С системными языками если, делать без фреймвоков, проблем особых нет
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493841
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кар-КарВообще, только один вопрос: а что если этот интерфейс реализует, допустим, Qt/C#/Java? Там у них внутри сможет переместиться ко мне в Delphi, если я передам ему хэндл куда? Т.е. пусть сами разбираются) Мне это не нужно, но просто интересно. Знаю, что они могут делать 75 скриншотов себя в секунду и так отрисовываться lol
Из коробки только через COM.
Эти языки не заточены под desktop приложения, у них область применения более перспективная
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493881
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteКар-КарВообще, только один вопрос: а что если этот интерфейс реализует, допустим, Qt/C#/Java? Там у них внутри сможет переместиться ко мне в Delphi, если я передам ему хэндл куда? Т.е. пусть сами разбираются) Мне это не нужно, но просто интересно. Знаю, что они могут делать 75 скриншотов себя в секунду и так отрисовываться lol
Из коробки только через COM.
Эти языки не заточены под desktop приложения, у них область применения более перспективная
JaDi, перелогиньтесь!
...
Рейтинг: 0 / 0
формы и фрэймы из dll
    #39493917
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteИз коробки только через COM.
Эти языки не заточены под desktop приложения, у них область применения более перспективная
Нет, не обязательно. Главное реализовать интерфейсы корректно, а регистрировать через COM не обязательно.
В си# это проходит на ура, в qt думаю тоже. А на java придется использовать JNI и будет не такой большой проблемой работать с интерфейсами. Проблема скорее в маршаленге данных между языками.
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / формы и фрэймы из dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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