Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача данных из формы, хранящейся в DLL, Форма в DLL 
V
    Опции темы
former
Дата 1.3.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Народ! Помогите НОВИЧКУ с такой вот проблемой:

Есть форма, хранящаяся в DLL, которая вызывается основной программой. Посли загрузки формы из DLL, выполнив некоторые операции ввода информации, необходимо при её закрытии (нажав на определённую кнопку) передать текст из Label в основную программу в ShortString виде.

Как это реализовать?


Если можно пришлите или опубликуйте пример.

Заранее огромное спасибо!


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Демо
Дата 1.3.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



В DLL:

Код

function GetLabel: ShortString;
begin
  Result := MyForm.Label1.Caption;
end;

...
...
exports
   GetLabel;



--------------------
    
PM MAIL ICQ Skype   Вверх
former
Дата 1.3.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Спасибо за совет. Немного не понятно.
Вот так, приблизительно выглядит форма:
Цитата

    ________________________________________
    |                                                                              |
    |  Label                                                          |
    |                                                                              |
    |  Другой Label                                                      |
    |                                                                              |
    |                      Наша кнопка      Другая кн.  |
    |_______________________________________|


Форму из библиотеки вызываем модально, работаем с фреймами внутри неё, и в конце получаем эту самую форму
с нужным нам текстом в Label.
При нажатии на Наша кнопка , при определённом внутренней переменной (формы) типа integer,
Форма должна закрыться, а текст из Label передаться переменной в основной программе.


Хотелосьбы по подробней.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Демо
Дата 2.3.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



У тебя не видно, как ты форму модальную используешь (создаешь, показываешь, закрываешь, удаляешь).

В тот момент, пока у тебя форма еще не освобождена, в DLL вполне можно использовать так, как тебе хочется, любые переменные, свойства формы.

Т.е. схема такая:

1. Вызываем функцию для создания формы.
2. Вызываем функцию для показа формы.
3. Закрываем форму.
4. Вызываем фуекцию для получения нужных свойств.
5. Уничтожаем форму.


--------------------
    
PM MAIL ICQ Skype   Вверх
former
Дата 2.3.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Сделал по твоему совету. В результате форма из DLL открывается копирует из Label текст в главную форму и закрывается.

Вот текст формы из DLL:
Код

var
  Form1: TForm1;

  procedure CreateForm(AppHandle: THandle);
  function GetLabelText:ShortString;
  procedure DestroyForm;

implementation

{$R *.dfm}

procedure CreateForm(AppHandle: THandle);
begin
  Application.Handle:=AppHandle;
  Form1:=TForm1.Create(Application);
  Form1.Show;
end;

function GetLabelText:ShortString;
begin
  Result:=Form1.Label1.Caption;
end;

procedure DestroyForm;
begin
  Form1.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Close;
end;

end. 

[U]Вот сама DLL:[/U]

library smpl;

uses
  ShareMem,
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

exports
  CreateForm,
  GetLabelText,
  DestroyForm;
begin
end.

[U]А вот программа, которая её вызывает:[/U]

implementation

{$R *.dfm}

procedure CreateForm(AppHandle: THandle); external 'smpl.dll';
function GetLabelText: ShortString;  external 'smpl.dll';
procedure DestroyForm; external 'smpl.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateForm(Application.Handle);
  Label2.Caption:=GetLabelText;
  DestroyForm;
end;

end.



Что не так?

Это сообщение отредактировал(а) Girder - 3.3.2006, 10:55


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Guedda
Дата 2.3.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Правильно, и будет закрываться. Ты же сразу ее уничтожаешь!!!
Лучше так:
Код

//Вот текст формы из DLL:
var
Form1: TForm1;

function GetLabelText:ShortString;

implementation

{$R *.dfm}

function GetLabelText:ShortString;
begin
Result:=Form1.Label1.Caption;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Close;
end;

end.

//Вот сама DLL:

library smpl;

uses
ShareMem,
SysUtils,
Classes,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}


procedure CreateForm;
begin
  Form1:=TForm1.Create(nil);
  Form1.Show;
end;

exports
CreateForm,
GetLabelText;
begin
end.

А вот программа, которая её вызывает:

implementation

{$R *.dfm}

procedure CreateForm; external 'smpl.dll';
function GetLabelText: ShortString; external 'smpl.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
CreateForm;
Label2.Caption:=GetLabelText;
end;

end.


Все будет работать замечательно.

Это сообщение отредактировал(а) Guedda - 2.3.2006, 19:37


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
former
Дата 2.3.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Всё хорошо, но копирование текста из формы в DLL происходит при её открытии, а нужно, чтобы при нажатии на кнопку формы (в DLL) после ряда операций с фрэймами (типа теста), расположенными на ней.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Демо
Дата 2.3.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Непонятна технология работы.

Есть основной модуль;
Есть DLL, из в которой создается форма, которая затем вызывается модально из основного модуля(?)
Или как?



--------------------
    
PM MAIL ICQ Skype   Вверх
former
Дата 2.3.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



1) Есть основной модуль.

2) При нажатии на кнопку в основном модуле, происходит вызов модальной формы из DLL.

3) После загрузки формы из DLL, на ней выполняются операции с фрэймами, чекбоксами и радиобатонами,
в результате чего формируется строковое выражение, которое записывается в Label (в DLL), расположенном
на последнем фрэйме.
4) После нажатия на кнопку, расположенную на последнем фрэйме, форма должна закрыться
и передать текст из Label переменной из основного модуля.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Демо
Дата 2.3.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Вот пример:

DLL:

Код

library test;

uses
  SysUtils,
  Classes,
  Unit1 in 'FormInDLL\Unit1.pas' {Form1};

exports
    CreateForm,
    GetLabelText,
    DestroyForm;
end.



Форма из DLL:

Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;

procedure CreateForm(AppHandle: THandle);
function GetLabelText:ShortString;
procedure DestroyForm;

implementation

{$R *.dfm}

procedure CreateForm(AppHandle: THandle);
begin
    Application.Handle:=AppHandle;
    Form1:=TForm1.Create(Application);
    Form1.ShowModal;
end;

function GetLabelText:ShortString;
begin
    Result:=Form1.Label1.Caption;
end;

procedure DestroyForm;
begin
    Form1.Free;
end;

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

end.





Вызывающая программа:

Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;

procedure CreateForm(AppHandle: THandle); external 'DLL\test.dll';
function GetLabelText:ShortString; external 'DLL\test.dll';
procedure DestroyForm; external 'DLL\test.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    CreateForm(Application.Handle);
    ShowMessage(GetLabelText);
    DestroyForm;
end;

end.



Обрати внимание на процедуру

Код

procedure CreateForm(AppHandle: THandle);    
begin    
    Application.Handle:=AppHandle;    
    Form1:=TForm1.Create(Application);    
    Form1.ShowModal;    
end;


Здесь не Form1.Show, а Form1.ShowModal

Вот полностью весь готовый тестовый проект:

Это сообщение отредактировал(а) Демо - 2.3.2006, 23:16

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  TestProj.zip 9,95 Kb


--------------------
    
PM MAIL ICQ Skype   Вверх
former
Дата 3.3.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Спасибо. Всё работает замечательно.

А возможен ли вариант динамической загрузки из библиотетки? Если да, то как это сделать?


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Демо
Дата 3.3.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Вот простой пример:

DLL:

Код

library Sample;


uses
  windows,
  SysUtils,
  classes;

function RetPChar(out Len:Integer): PChar;
var
  s: String;
begin
  s := 'Эта строка будет передана в основной модуль';
  Len := Length(s);
  Result := AllocMem(Len+1);
  move(s[1],Result[0],Length(s));
end;

procedure FreePChar(P: PChar);
begin
  FreeMem(P);
end;

procedure DllMain(fdwReason:DWORD);
begin
   case fdwReason of
     DLL_THREAD_ATTACH: ;
     DLL_THREAD_DETACH: ;
     DLL_PROCESS_ATTACH:
       begin
       end;
     DLL_PROCESS_DETACH:
       begin
       end;
   end;
end;

exports
  RetPChar,
  FreePChar;

begin
  DllProc:=@DllMain;
  DllProc(DLL_PROCESS_ATTACH);
end.



Вызывающий модуль

Код

unit Unit1;

interface

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

type

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

var
  Form1: TForm1;

  HLib: HModule;
  RetPChar: function(out Len:Integer): PChar;
  FreePChar: procedure (P: PChar);

//  function RPChar(out Len:Integer): PChar; external 'DLL\Sample.dll' name 'RetPChar';
//  procedure FPChar(P: PChar); external 'DLL\Sample.dll' name 'FreePChar';


implementation

{$R *.dfm}

function LoadLib(const DLLName: String): HModule;
begin
  Result := LoadLibrary(PChar(DLLName));
  if Result=0 then raise Exception.Create(SysErrorMessage(GetLastError));

  @RetPChar := GetProcAddress(Result,'RetPChar');
  if @RetPChar=nil then raise Exception.Create(SysErrorMessage(GetLastError));

  @FreePChar := GetProcAddress(Result,'FreePChar');
  if @RetPChar=nil then raise Exception.Create(SysErrorMessage(GetLastError));
end;

procedure UnloadLib(var H: HModule);
begin
  FreeLibrary(H);
  H := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Len: Integer;
  P: PChar;
  s: String;
begin
  if HLib=0 then HLib := LoadLib('dll\sample.dll');
  P := RetPChar(Len);
  SetLength(s,Len);
  Move(p[0],s[1],Len);
  FReePChar(P);
  ShowMessage(s);
  UnLoadLib(HLib);
end;

initialization
  HLib := 0;
end.



--------------------
    
PM MAIL ICQ Skype   Вверх
former
Дата 3.3.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Спасибо за помощь. Всё работает.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.