Текущий архив: 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.48 MB
Время: 0.004 c