Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
Доброго дня господа !

Delphi 10.3.3 64-bit
Имею
- основная форма на ней TStatusBar
- открытие DLL (библиотека реализована с участием TInterface)
- передача TStatusBar в функцию DLL и изменение значение панели
- возникает ошибка памяти в момент повторного обращение к семейству Panels
или при окончательном закрытие окна.
Впечатление что Panels удален DLL ...... или что-то сделал не так

Код приложен прошу уточнить где рукожопость
Спасибо.

P.S. - ранее вопрос рассматривался, здесь локализовал ситуацию и максимально
упростил конструкции.

К сообщению приложен файл (MyDLL.rar - 94Kb) cкачать
30 май 21, 08:26    [22328922]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
zedxxx
Member

Откуда:
Сообщений: 93
HOME_X
- передача TStatusBar в функцию DLL и изменение значение панели

Не надо так делать. Для таких случаев есть понятный и простой шаблон Observer:
автор
Шаблон observer — это шаблон, в котором объект, называемый subject, ведет список зависимых объектов, называемых observers, и автоматически уведомляет их о любых изменениях состояния, обычно вызывая один из их методов.


IObserver = interface
  procedure Notify(const AValue: что-то_там);
end;

ISubject = interface
  procedure AddObserver(const O: IObserver);
  procedure RemoveObserver(const O: IObserver);
end;


ISubject - живёт в dll и вызывает метод Notify у всех своих подписчиков, по мере необходимости.

IObserver - живёт в главном приложении, регистрируется в ISubject при создании формы, удаляется в деструкторе. В методе Notify обновляет TStatusBar формы (посылкой сообщения форме или через Syncronize).
30 май 21, 10:48    [22328934]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
zedxxx

В методе Notify обновляет TStatusBar формы (посылкой сообщения форме или через Syncronize)


Здесь не совсем ясно взаимодействие основной формы и поля объекта на ней с методом Notify
Как передать и где хранить указатель на TStatusBar - если это посылка сообщения
Syncronize - будет полезна я дальнейшем, планирую сделать потоковый метод

Не могли бы в мой небольшой пример внедрить Вам механизм - буду весьма признателен !
Спасибо !
30 май 21, 13:02    [22328951]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53435

HOME_X
Код приложен прошу уточнить где рукожопость

В третьем пункте. TStatusBar нельзя передавать в DLL.

Posted via ActualForum NNTP Server 1.5

30 май 21, 13:09    [22328954]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
HOME_X
zedxxx

В методе Notify обновляет TStatusBar формы (посылкой сообщения форме или через Syncronize)


Здесь не совсем ясно взаимодействие основной формы и поля объекта на ней с методом Notify
Как передать и где хранить указатель на TStatusBar - если это посылка сообщения
Syncronize - будет полезна я дальнейшем, планирую сделать потоковый метод

Не могли бы в мой небольшой пример внедрить Вам механизм - буду весьма признателен !
Спасибо !


Работаю со статьей
https://sourcemaking.com/design_patterns/observer/delphi
30 май 21, 13:25    [22328961]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
Dimitry Sibiryakov

HOME_X
Код приложен прошу уточнить где рукожопость

В третьем пункте. TStatusBar нельзя передавать в DLL.


Я хочу реализовать получение и визуализацию сообщения (промежуточного) из
DLL - как это реализовать ?
TStatusBar - это функциональный объекта именно для этого
- другого не предлагать
- панели не добавлять
(уже сделал)

На моем коде вложенном в сообщении можете провести корректировки ?

Спасибо
30 май 21, 13:53    [22328964]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
zedxxx
Member

Откуда:
Сообщений: 93
HOME_X
Как передать и где хранить указатель на TStatusBar - если это посылка сообщения
Syncronize - будет полезна я дальнейшем, планирую сделать потоковый метод


Все параметры передаются в конструкторе IObserver и хранятся внутри него в приватных полях. Лучше всего передать туда хэндл главного окна и использовать механизм обмена сообщениями.

Главная форма в конструкторе создаёт и конфигурирует IObserver, регистрирует его в ISubject. Далее она получает нотификации от IObserver, а при закрытии себя, в деструкторе удаляет IObserver из ISubject.

Сообщение было отредактировано: 30 май 21, 13:51
30 май 21, 13:59    [22328966]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53435

HOME_X
Я хочу реализовать получение и визуализацию сообщения (промежуточного) из
DLL - как это реализовать ?

Передавать можно интерфейсы или функциональные типы (в том числе function of object).

HOME_X
На моем коде вложенном в сообщении можете провести корректировки ?

На мой банковский счёт можете провести перечисление чтобы я сделал за тебя твою работу?

Posted via ActualForum NNTP Server 1.5

30 май 21, 14:11    [22328969]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Benten
Member

Откуда: Россия, Крым
Сообщений: 26
Dimitry Sibiryakov

HOME_X
Я хочу реализовать получение и визуализацию сообщения (промежуточного) из
DLL - как это реализовать ?

Передавать можно интерфейсы или функциональные типы (в том числе function of object).

HOME_X
На моем коде вложенном в сообщении можете провести корректировки ?

На мой банковский счёт можете провести перечисление чтобы я сделал за тебя твою работу?

HOME_X, лови реализацию паттерна Observer, который предлагают ребята выше.
За основу взят код из твоего примера.
Реализация упрощенная, но работает хорошо, проверил.

Сообщение было отредактировано: 30 май 21, 17:19
30 май 21, 17:26    [22328997]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Benten
Member

Откуда: Россия, Крым
Сообщений: 26
Benten
HOME_X, лови реализацию паттерна Observer, который предлагают ребята выше.
За основу взят код из твоего примера.
Реализация упрощенная, но работает хорошо, проверил.
Чего-то архив с исходниками не прикладывается ...

К сообщению приложен файл (YourDLL.7z - 42Kb) cкачать
30 май 21, 17:30    [22328999]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
Господа !

zedxxx
Спасибо за целеуказание - принято к изучению и разработке

Benten
Отдельное спасибо за корректировку, рабочий пример ВСЕГДА
ценен, при любой теории и понимании сущности вещей.

Буду еще вопрошать...
30 май 21, 17:45    [22329001]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
старые добрые коллбэки и не надо никаких паттернов function FuncfromDLL(params..., StatusCallback: TProcWithStringParam)
31 май 21, 10:32    [22329162]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
ziv-2014
Member

Откуда:
Сообщений: 599
Fr0sT-Brutal
старые добрые коллбэки и не надо никаких паттернов function FuncfromDLL(params..., StatusCallback: TProcWithStringParam)

Это плохой стиль программирования :)
31 май 21, 12:59    [22329277]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53435

Это работающий стиль программирования.

Posted via ActualForum NNTP Server 1.5

31 май 21, 13:03    [22329279]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
ziv-2014
Fr0sT-Brutal
старые добрые коллбэки и не надо никаких паттернов function FuncfromDLL(params..., StatusCallback: TProcWithStringParam)

Это плохой стиль программирования :)

Да, конечно, не хватает смузи, гироскутера и аджайла...
31 май 21, 14:04    [22329325]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
ziv-2014
Member

Откуда:
Сообщений: 599
Fr0sT-Brutal
ziv-2014
пропущено...

Это плохой стиль программирования :)

Да, конечно, не хватает смузи, гироскутера и аджайла...

Нет, ты ошибаешься. Хватает всего. Но твой вариант не удобный и плохо расширяемый.
31 май 21, 16:43    [22329427]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4653
ziv-2014
Fr0sT-Brutal
пропущено...

Да, конечно, не хватает смузи, гироскутера и аджайла...

Нет, ты ошибаешься. Хватает всего. Но твой вариант не удобный и плохо расширяемый.

Нормально он расширяемый, если вместо коллбэка передавать указатель на структуру с подобными коллбэками, и параметры самих коллбэков - тоже структуры.
Старые плугины, таким образом, не будут видеть новых элементов, и всё будет ок.
Ну, в параметрах струкрур, передаваемых в коллбэки, можно добавить параметр "размер структуры" навсякий.
31 май 21, 17:09    [22329442]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
ziv-2014
Нет, ты ошибаешься. Хватает всего. Но твой вариант не удобный и плохо расширяемый.

Вот так и появляются MVC Hello world-ы на три листа убористого кода
31 май 21, 17:09    [22329443]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
zedxxx
Лучше всего передать туда хэндл главного окна и использовать механизм обмена сообщениями.

Если окно VCL, то хэндл проживет до первого RecreateWnd
31 май 21, 17:11    [22329446]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4653
Fr0sT-Brutal
zedxxx
Лучше всего передать туда хэндл главного окна и использовать механизм обмена сообщениями.

Если окно VCL, то хэндл проживет до первого RecreateWnd
Можно же сделать коллбэк GetMainWindowHandle и передать его в dll
31 май 21, 18:08    [22329483]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53435

А потом трястись как бы эта DLL его не закэшировала или не вызвала того, что окно
пересоздаст. Наф-наф.

Posted via ActualForum NNTP Server 1.5

31 май 21, 18:12    [22329487]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Benten
Member

Откуда: Россия, Крым
Сообщений: 26
Fr0sT-Brutal
старые добрые коллбэки и не надо никаких паттернов function FuncfromDLL(params..., StatusCallback: TProcWithStringParam)
Дело вовсе не в паттернах, а в удобстве работы с интерфейсами, которые легко передавать из любой формы приложения в dll и(или) обратно. Но это уже лирика, главное, что цель достигнута.
31 май 21, 18:51    [22329507]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
Fr0sT-Brutal, Dimitry Sibiryakov, ziv-2014, YuRock

Господа !

Ваши замечания весьма существенны и ценны
Приведите свой РЕАЛЬНЫЙ ПРИМЕР решения вопроса,
основываясь на первичном коде

Полагаю Все Ваши решения будут оценены и применены в зависимости
от уровня разработчиков и степени сложности кода и приложения


Повторное спасибо Benten - вижу Ваш вариант как конечный результат
своих изысканий.
Работаю с предложением zedxxx, как с первичным базовым вариантом.

Благодарен за понимание
31 май 21, 22:40    [22329593]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
YuRock
Можно же сделать коллбэк GetMainWindowHandle и передать его в dll

Да уж :) легче потребовать, чтобы окно было специальное для сообщений, через AllocateHwnd. Но это мера административная, и никто не проверит, что вразрез с инструкциями туда не пихнули Form1.Handle.
1 июн 21, 10:53    [22329707]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 874
HOME_X
Fr0sT-Brutal, Dimitry Sibiryakov, ziv-2014, YuRock

Господа !

Ваши замечания весьма существенны и ценны
Приведите свой РЕАЛЬНЫЙ ПРИМЕР решения вопроса,
основываясь на первичном коде

Полагаю Все Ваши решения будут оценены и применены в зависимости
от уровня разработчиков и степени сложности кода и приложения


Разработчики понимают и оценивают и по советам. Код (если это разработчик, ага) он и сам напишет, главное на правильную идею навести.

А если совета недостаточно, а нужен только код - то это не разработчик, а копи-пастер.
1 июн 21, 11:20    [22329724]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1249
пожалуй оставлю тут, мало ли кому пригодится :)

https://github.com/RefactoringGuru/design-patterns-delphi
1 июн 21, 12:08    [22329758]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
zedxxx,

Доброго дня zedxxx !

Попытался реализовать Ваше предложение
взгляните пожалуйста верно ли Вас понял.

Ошибка ушла - это наверняка

InterAction.pas - здесь описание типов двух серверов
TExeServer - создание сервера-связи в EXE файле
TDllServer -создание сервера-связи в DLL файле

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

Код до конца не оптимизировал... кое-что можно наверняка сократить.

Сомнения
Не много ли уделено ресурсов на передачу данных между серверами ?
возможно это можно сделать через возврат переменной процедурного типа ?


Спасибо за Ваши предложения

К сообщению приложен файл (MyDll.rar - 77Kb) cкачать
2 июн 21, 16:05    [22330427]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
Vizit0r

А если совета недостаточно, а нужен только код - то это не разработчик, а копи-пастер.


Вы понимаете русский язык - суда по написанному - "ДА"
Я говорю - "A...."
Какой именно смысл я вложил в содержание фразы ?
Мне кажется гораздо проще изложить всю фразу....

P.S. функцией "копи- пастер" - без разбора содержание и сути здесь не обойдешься
2 июн 21, 16:14    [22330436]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
энди
пожалуй оставлю тут, мало ли кому пригодится :)

https://github.com/RefactoringGuru/design-patterns-delphi


Спасибо за Ваше участие
Не сомневайтесь непременно пригодиться.
Полная и целостная реализация фразы "А" - применима во всех случаях
2 июн 21, 16:20    [22330444]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
HOME_X

zedxxx,

Спасибо за Ваши предложения

Что-то файл на выкладывается ...



К сообщению приложен файл (MyDll.rar - 77Kb) cкачать

Сообщение было отредактировано: 2 июн 21, 16:13
2 июн 21, 16:20    [22330446]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
zedxxx
Member

Откуда:
Сообщений: 93
TDllServer и TExeServer должны реализовывать интерфейсы. А TDllLoop вообще не нужен, возвращайте из dll сразу TDllServer.

В IDllInterface нельзя использовать string в параметре. Вы же данные передаёте в чужое адресное пространство. Замените на WideString или PWideChar. Ну и, соответственно, никаких TComponent в параметрах тоже быть не должно, допустимы только интерфейсные переменные.
2 июн 21, 17:28    [22330500]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
zedxxx
TDllServer и TExeServer должны реализовывать интерфейсы.
А TDllLoop вообще не нужен, возвращайте из dll сразу TDllServer.

В IDllInterface нельзя использовать string в параметре. Вы же данные передаёте в чужое адресное пространство. Замените на WideString или PWideChar. Ну и, соответственно, никаких TComponent в параметрах тоже быть не должно, допустимы только интерфейсные переменные.


TDllLoop = - это базовый класс для прикладной задачи (в данному случае не существенно)
По типам замечания - принято - спасибо !

Хотелось бы услышать по поводу
Сомнения
Не много ли уделено ресурсов на передачу данных между серверами ?
возможно это можно сделать через возврат переменной процедурного типа ?

Не ?????
2 июн 21, 17:55    [22330503]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
zedxxx
Member

Откуда:
Сообщений: 93
Что вы подразумеваете под ресурсами? Сколько раз в секунду должен выполняться данный код?

Альтернативный вариант тут уже предлагали - написать всё на колбеках.
2 июн 21, 18:11    [22330507]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
zedxxx

вариант тут уже предлагали - написать всё на колбеках.


А такой стиль наверное не очень хорошо ?
Но работает ....

type
TReturnMessage = procedure(aValue: Integer);

type IDllInterface = interface(IInterface)
['{EDA14150-3969-44C5-A366-1586D407102A}']
procedure ReturnSave(Id: Integer; Value: TReturnMessage); stdcall;


unit DllInterface;

interface

uses Classes,
     Vcl.ComCtrls;

type
  TReturnMessage = procedure(aValue: Integer);

type IDllInterface = interface(IInterface)
  ['{EDA14150-3969-44C5-A366-1586D407102A}']
  procedure BegRegisterDll(Server: TComponent);     stdcall;
  procedure EndRegisterDll;                         stdcall;
  function  SendMessageDll(aText: String): Boolean; stdcall;
  procedure ReturnSave(Id: Integer; Value: TReturnMessage);      stdcall;
end;

implementation

end.


Спасибо за уделенное время

Сообщение было отредактировано: 2 июн 21, 23:14
2 июн 21, 23:21    [22330644]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
HOME_X,

Опять файл не приложился

К сообщению приложен файл (call_dll.rar - 78Kb) cкачать
2 июн 21, 23:24    [22330647]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
HOME_X
Member

Откуда:
Сообщений: 2685
zedxxx

Что вы подразумеваете под ресурсами?


На серьезный проект особо времени и писанины не жалко
Когда проект невелик - создавать свои классы не особо хочется
В моем конкретном случае - "дырка уже заткнута" с две неделя назад
Подключать связующие сервера не хочется,
Но понять и отработать варианты для дальнейшего нужно
вот и весь смысл текущей темы

Еще раз спасибо
2 июн 21, 23:31    [22330650]     Ответить | Цитировать Сообщить модератору
 Re: Использование TStatusBar в вызовах DLL  [new]
zedxxx
Member

Откуда:
Сообщений: 93
Обычно, написанный код ещё надо и сопровождать какое-то время. Поэтому усилия затраченные на написание хорошо структурированного и читаемого кода, окупают себя сторицей.
3 июн 21, 09:32    [22330735]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить