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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вернуть несколько значений из модальной формы ? 
V
    Опции темы
spamER
Дата 5.11.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

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




В длл имеется модальная форма. На форме 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'в ?

Это сообщение отредактировал(а) spamER - 5.11.2009, 23:18
PM MAIL   Вверх
kami
Дата 5.11.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 72



Цитата(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 и закономерный вылет программы...
PM MAIL WWW   Вверх
spamER
Дата 5.11.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

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



Цитата

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


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

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

Это сообщение отредактировал(а) spamER - 5.11.2009, 23:49
PM MAIL   Вверх
kami
Дата 5.11.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 72



Первое "дубовое" решение, приходящее в голову - это:
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 и закономерный вылет программы...


PM MAIL WWW   Вверх
spamER
Дата 6.11.2009, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

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



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


Эксперт
***


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

Репутация: 23
Всего: 72



Как вариант (опять-таки, не уходя от строк и 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 и там и там.
PM MAIL WWW   Вверх
spamER
Дата 6.11.2009, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

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



Цитата

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

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

Это сообщение отредактировал(а) spamER - 6.11.2009, 00:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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