Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вернуть несколько значений из модальной формы ?


Автор: spamER 5.11.2009, 23:18

В длл имеется модальная форма. На форме 3 Edit'a и кнопка. Мене необходимо из этих Edit'в вернуть введенные значения в основную программу. 
Я это пытался реализовать так: по нажатии кнопки на MDI форме вызываются функции которые бы возвращали значения Edit'в в главную форму. Но тут то и получилась у меня проблема, жму в проекте по кнопке, которая вызывает мои функции из DLL, первый раз MDI форма появляется, но нечего не возвращает из Edit'в. Жму второй раз - проект просто закрывается.
Код

DLL:
var
  FAdd: TFAdd;    // MDI форма

  procedure ShowAddForm(Handle : THandle); export; stdcall;
  function ResEdit1 : String; export; stdcall;    //Функция для возврата значения из Edit1
  //Остальные функции для возврата пока не стал писать

...

function ResEdit1 : String;
begin
  Result := FAdd.Edit1.Text;
end;

procedure ShowAddForm(Handle : THandle);
begin
  Application.Handle := Handle;
  FAdd := TFAdd.Create(Application);
  FAdd.ShowModal;
  if FAdd.ModalResult = mrOK then
    ResEdit1;
  FAdd.Free;
end;

//---------------------//

exports
  ShowAddForm,
  ResEdit1;


Project:

...

  procedure ShowAddForm(Handle : THandle);external'Project1.dll';
  function ResEdit1 : String; external'Project1.dll';

...

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowAddForm(Handle);
Caption := ResEdit1;
end;



Вот собственно вопрос, как довести до ума то, что я написал, что бы модальная форма осталась в DLL и возвращала в главную форму(проект) значения из Edit'в ?

Автор: kami 5.11.2009, 23:42
Цитата(spamER @  5.11.2009,  23:18 Найти цитируемый пост)
Жму второй раз - проект просто закрывается.

ShareMem подключен ПЕРВЫМ модулем в uses и в основном проекте и в dll?

Добавлено через 4 минуты
Цитата(spamER @  5.11.2009,  23:18 Найти цитируемый пост)
 
if FAdd.ModalResult = mrOK then    
  ResEdit1;  
FAdd.Free;

И смысл вызова ResEdit1? В Dll он ничего не дает, а когда вызывается из основной программы, то формы FAdd уже не существует, отсюда - AV и закономерный вылет программы...

Автор: spamER 5.11.2009, 23:47
Цитата

ShareMem подключен ПЕРВЫМ модулем в uses и в основном проекте и в dll?


Пробовал я подключать этот модуль и туда и туда. Но всеравно оно не работает((((((((
А как бы Вы предложи решить мене данную проблему? 

з.ы. может я вариант решения данной проблемы не правильный выбрал.

Автор: kami 5.11.2009, 23:52
Первое "дубовое" решение, приходящее в голову - это:
1. после отработки формы не уничтожать ее или запомнить нужные данные в глобальные для dll переменные (для совсем дубового решения второе - предпочтительнее).
2. изменить функцию, возвращающую результаты на что-то типа:
Код

function GetRes(ResIndex:integer):string;
begin
  case ResIndex of
    1: Result:=sEdit1Text; (это - глобальная для dll строковая переменная из п.1
    2: Result:=sEdit2Text;
  else
    Result:='';
end;

И, понятное дело, не забыть про ShareMem, хоть мне и не нравится его использование - предпочитаю PChar...

Добавлено через 1 минуту и 39 секунд
Цитата(spamER @  5.11.2009,  23:47 Найти цитируемый пост)
Пробовал я подключать этот модуль и туда и туда. Но всеравно оно не работает((

Цитата(kami @  5.11.2009,  23:42 Найти цитируемый пост)
когда вызывается из основной программы, то формы FAdd уже не существует, отсюда - AV и закономерный вылет программы...


Автор: spamER 6.11.2009, 00:16
kami, спасибо. Вроде получилось.  smile 

Автор: kami 6.11.2009, 00:20
Как вариант (опять-таки, не уходя от строк и ShareMem соответственно):
Код

function ShowAddForm(Handle:THandle):string;
begin
  Result:='';
  ........
  if IsPositiveResult(FAdd.ShowModal) then
    Result:=FAdd.Edit1.Text+#13#10+FAdd.Edit2.Text+#13#10 ...;
  FAdd.Free;
end;

in main project:
Код

var
  SL:TStringList;
begin
  SL:=TStringList.Create;
  SL.Text:=ShowAddForm(Application.Handle);
  if SL.Text<>'' then
    // SL[0] - это значение Edit1 и т.п.
  SL.Free;
end;

A ShareMem подключал первым в файле проекта (dpr) или формы? Надо в dpr и там и там.

Автор: spamER 6.11.2009, 00:27
Цитата

A ShareMem подключал первым в файле проекта (dpr) или формы? Надо в dpr и там и там.

Эх вот где я и протупил. Я подключал в файл формы. А теперь подключил в файл проекта и все работает. Спасибо, что уточнили

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)