Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2011, 15:21   #1
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию ответ от плагина в приложение

Привет!

Приложение имеет окно с редактором TMemo. И подключает плагины при запуске. Внутри плагинов (обычные dll) находится разный текст. Его нужно выводить в TMemo, когда активируются процедуры в плагине.

Подскажите, как сделать? Спасибо
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 21.05.2011, 15:58   #2
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Передаешь плагину указатель на процедуру через которую можно давалять строки, затем в самомо плагине вызываешь по этому указателю эту процедуру
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 21.05.2011, 16:07   #3
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Ну наверное нужен код с моей стороны, чтобы понятнее было

Код проги:
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

procedure ShowText(GBP: PChar); stdcall; external 'a.dll';
procedure DisplayText(S: string);

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowText(PChar('Текст')); // Это ShowMessage для теста
end;

// Вот как именно эту процедуру вызвать из плагина и передать ей S из плагина
procedure DisplayText(S: string);
begin
  Form1.Memo1.Text := S;
end;

end.
Код плагина:
Код:
library a;

uses SysUtils, Classes, Dialogs;

{$R *.res}

procedure ShowText(AA: PChar); stdcall;
begin
  ShowMessage(StrPas(AA)); // Это для теста,
  // а нужно вызывать процедуру из главной программы
  // DisplayText(StrPas(AA)); 
end;

exports
  ShowText;

begin
end.
Вложения
Тип файла: rar PluginsScripts.rar (4.7 Кб, 7 просмотров)
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 21.05.2011, 16:23   #4
KiL0z
Пользователь
 
Регистрация: 17.05.2010
Сообщений: 35
По умолчанию

Что-то в эту сторону:
Код:
type
    TFunc = procedure (S: string);

//---

procedure ShowText(DisplayText: TFunc); stdcall; external 'a.dll';
procedure DisplayText(S: string); stdcall;

//---

procedure ShowText(DisplayText: TFunc); stdcall;
begin
  DisplayText('текст');
end;
KiL0z вне форума Ответить с цитированием
Старый 21.05.2011, 16:35   #5
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

+1 Это действительно работает! Но как получить значение в самой dll?

Код:
library a;

uses SysUtils, Classes, Dialogs;

{$R *.res}

type TFunc = procedure (S: string);

procedure ShowText(DisplayText: TFunc); stdcall;
begin
  DisplayText('Текст');
  // А как здесь получить передаваемый текст?
end;

exports
  ShowText;

begin
end.
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 21.05.2011, 16:41   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Передаешь плагину указатель на процедуру через которую можно давалять строки, затем в самомо плагине вызываешь по этому указателю эту процедуру
Я бы лучше плагину передавал экземпляр TMemo в качестве параметра процедуры.
Или вообще - в плагине класс свой замутил бы.

Форма:
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
 procedure SetText(m:TMemo); external 'project2.dll';
 
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetText(Memo1);
end;

end.
ДЛЛ
Код:
library Project2;

uses
  StdCtrls,
  SysUtils,
  Classes;

{$R *.res}

procedure SetText(m:TMemo);begin m.Lines.Add(DateTimeToStr(now));end;

exports SetText;

begin
end.
Идея понятна?
I'm learning to live...

Последний раз редактировалось Stilet; 21.05.2011 в 16:46.
Stilet вне форума Ответить с цитированием
Старый 21.05.2011, 16:45   #7
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Все как бы сводится к тому, чтобы вызвать из плагина процедуру в главной программе. Как такое сделать?
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 21.05.2011, 17:18   #8
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Код:
library a;

uses SysUtils, Classes, Dialogs;

{$R *.res}
type TFunc = procedure (S: string);

DisplayText: TFunc;

procedure ShowText(AA: PChar); stdcall;
begin
  // а нужно вызывать процедуру из главной программы
 if assigned(DisplayText) then  DisplayText(StrPas(AA));
end;


procedure SetTextOutProc(v: TFunc);stdcall;
begin
 DisplayText := v;
end

exports
  ShowText, SetTextOutProc;

begin
end.

Код:
unit Unit1;

interface

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

type TFunc = procedure (S: string);

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

var
  Form1: TForm1;
 
implementation

{$R *.dfm}
procedure ShowText(AA: PChar); stdcall; external 'project2.dll';
procedure SetTextOutProc(v: TFunc);stdcall; external 'project2.dll';

procedure TextOut (S: string);
 begin
  form1.memo1.lines.add(s);
 end;

procedure TForm1.formcreate(Sender: TObject);
begin
 SetTextOutProc(@TextOut);// может без собаки
end;


end.

как то так, принцип вроде должен быть понятен
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 21.05.2011, 17:23   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чтобы вызвать из плагина процедуру в главной программе. Как такое сделать?
Как вариант. В каждом плагине делать процедуру инициализации, которая вызывается формой. Если плагин ничего не должен делать процедура пустая, иначе наполненная чем нибудь.
Такой себе аналог DLLMain функции.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2011, 18:56   #10
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Цитата:
Такой себе аналог DLLMain функции.
очень хороший подход, так делается R&Q есть одна функция PluginFun в нее передается указатель на структуру. структура представляет из себя массив указателей на все используемые функции, в том числе есть функция через котурую плагин отдает основной программе указатели на все свои остальные функции таким образом налаживается интерфейс
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка плагина SimpleModal Login vadimon WordPress и другие CMS 0 12.04.2011 14:07
Wordpress уствновка плагина gallery2 John1364 WordPress и другие CMS 1 01.03.2011 19:22
Как переинициализировать объект плагина jquery? 1datr JavaScript, Ajax 0 18.01.2011 20:55
ClassCastException при разработке плагина igorDanilov Общие вопросы по Java, Java SE, Kotlin 0 14.10.2009 16:11