Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.05;
Скачать: CL | DM;

Вниз

Указаель на TForm...   Найти похожие ветки 

 
Rimdus   (2009-05-14 08:55) [0]

Добрый день!

Имеем такой код:

type
 TFormsEnum=record
   FormName:string;
   Form:^TForm;
 end;

 TFormDll = class(TForm)
   BtnOk: TButton;
   BtnCancel: TButton;
   EDResult: TEdit;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
   CallForm:THandle;
 public
   { Public declarations }
 end;

Последовательно вызываем процедуры:

procedure EnumForms;
begin
FormsEn[0].FormName:="FormDll";
FormsEn[0].Form:=@FormDll;
end;

procedure ShowForm(App, form: THandle);
begin
 Application.Handle:=App;
 FormsEn[0].Form^:=TFormDll.Create(Application); // отработало нормально
 FormsEn[0].Form^.CallForm:=form; Ошибка! CallForm не продекларирован
 FormsEn[0].Form^.Show; //FormDll.Show; // Тоже не продекларирован.
end;

Собсвенно вопрос, как обратиться к переменным формы через указатель на форму. Собственно почему нужно использовать указатель: для того, чтоб из основого приложения можно было открывать формы по их имени, например из приложения вызываем ShowForm("MyForm1"), ShowForm("MyForm2")...ShowForm("MyFormN")


 
MBo ©   (2009-05-14 09:00) [1]

TForm - уже указатель, и здесь ни к чему еще указатель на указатель делать.


 
Сергей М. ©   (2009-05-14 10:02) [2]


> Rimdus



> можно было открывать формы по их имени


И где же имя формы фигурирует в списке формальных параметров процедуры ShowForm ?

К тому же о каком имени может идти речь, если форма на момент вызова ShowForm еще не существует ?


 
Юрий Зотов ©   (2009-05-14 10:27) [3]

type
 TMyForm1 = class(TForm)
   ...
 end;

 TMyForm2 = class(TForm)
   ...
 end;

 ...

 TMyFormN = class(TForm)
   ...
 end;

function ShowForm(App: TApplication; FormClass: TFormClass): TForm;
begin
 Application.Handle := App.Handle;
 Result := TFormClass.Create(Application);
 Result.Show
end;

Вызов:
 ShowForm(Application, TMyForm1);
 ShowForm(Application, TMyForm2);
 ...
 ShowForm(Application, TMyFormN);

Если так уж нужно передавать в ShowForm именно строку, а не класс формы, то можно передавать имя класса - но тогда этот класс сначала надо зарегистрировать. По этому поводу см. RegisterClass(es) и FindClass.

Только совершенно непонятно, зачем все это надо? Похоже, что Вы выбрали какой-то не тот способ решения задачи. В частности - зачем потребовалось создавать и показывать формы именно кодом из DLL, раз они все равно объявлены в основном приложении? Если компилировать EXE и DLL обычным способом (без run-time пакетов), то, во-первых это приведет к немалому дублированию кода, а, во-вторых могут возникнуть проблемы (потому что TMyForm1 в EXE и TMyForm1 в DLL - это два совершенно разных класса.)

Думаю, что если Вы обрисуете саму задачу, простыми человеческими словами, то Вам почти наверняка подскажут более простой способ ее решения.


 
Юрий Зотов ©   (2009-05-14 10:31) [4]

Поправочка:
 Result := FormClass.Create(Application);
(без буквы T).


 
Rimdus   (2009-05-14 13:21) [5]

Собственно немного неправильно привел код )))
По человечески нужно:
Основной модуль программы(exe) имеет только одну форму(class TMainForm).
Так же есть нескольколько dll c несколькими формами каждая, например в dll(1): TDll1Form1, TDll1Form2, TDll1FormN.
В dll(2): TDll2Form1, TDll2Form2, TDll2FormN
Формы, помещенные в DLL полностью готовы к использованию, т.е. спроектированы визуально.

Так вот, предполагалось вызывать эти формы из основного модуля программы примерно таким образом:

ShowForm(FormName:PCHAR) // где, FormName есть некое имя нужной формы.
Т.е. если обстрагироваться от кода, то нужно при вызове ShowForm("TDll1Form1") открывалась форма TDllForm1.

Вообще предполагалось сделать так:
При инициализации DLL, сапихнуть в массив Тектовое название формы и соответствующую ей ссылку на переменную, хранящую адрес переменной. Переменные всех форм определены в var модуля dll.
FormsEn[n].FormName:="FormDll";
FormsEn[n].Form:=@FormDll;

Далее процедура ShowForm перебирает if FormName = FormsEn[n].FormName then

создаем и отображаем форму, ссылка на переменную в FormsEn[n].Form.

Так вот хотел с помощью FormsEn[n].Form создать и отобразить форму.
Если можно проще, то с удовольствием выслушаю Ваши предложения.


 
Сергей М. ©   (2009-05-14 13:34) [6]


> с удовольствием выслушаю Ваши предложения


Предложение традиционное - отказаться от dll в пользу bpl


 
Rimdus   (2009-05-14 13:40) [7]

>Юрий Зотов ©   (14.05.09 10:27) [3]

>function ShowForm(App: TApplication; FormClass: TFormClass): TForm;
>begin
> Application.Handle := App.Handle;
> Result := TFormClass.Create(Application);
> Result.Show
>end;

Такая конструкция не позволяет обащаться к свойствам и методам передаваемого FormClass. В моем случае это переменная CallForm - сюда записываю handle основной формы, дабы при закрытии текущей формы, послать главной фоме сообщение.


 
Сергей М. ©   (2009-05-14 15:59) [8]


> Rimdus   (14.05.09 13:40) [7]


Тип результата ф-ции ShowForm - это TForm, а у этого класса нет ни метода ни свойства с именем CallForm, зато оно есчть у наслединка TFormDll.

Какие три буквы добавить к "конструкции", чтобы она "позволяла" - сам догадаешься)


 
Юрий Зотов ©   (2009-05-14 16:35) [9]

> Rimdus   (14.05.09 13:40) [7]

> Такая конструкция не позволяет обащаться к свойствам и методам
> передаваемого FormClass.

Позволяет. Надо только привести класс формы к реальному.

Result := FormClass.Create(Application);
with TMyFormN(Result) do
begin
 ...
end;

=============================

Используйте BPL вместо DLL. Избежите большой кучи проблем.


 
Rimdus   (2009-05-14 20:25) [10]

Уважаемые мастера, подскажите, где можно найти описание как пишутся bpl.


 
Сергей М. ©   (2009-05-14 22:13) [11]


> Rimdus   (14.05.09 20:25) [10]


Ты не поверишь - прямо в стандартной справке.

F1 + "Packages and standard DLLs"

Плясать следует именно отсюда.



Страницы: 1 вся ветка

Текущий архив: 2009.07.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
15-1240870957
DillerXX
2009-04-28 02:22
2009.07.05
ActiveSync


2-1242548602
Чипырик
2009-05-17 12:23
2009.07.05
Вопрос по WordApplication


15-1241013895
andre17
2009-04-29 18:04
2009.07.05
Ошибка при работе с BOLD for Delphi


2-1242718910
Trifle
2009-05-19 11:41
2009.07.05
Имя и права юзера


15-1241037795
Германн
2009-04-30 00:43
2009.07.05
Очередной "дурацкий вопрос"