Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.07.05;
Скачать: [xml.tar.bz2];

Вниз

Указаель на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
10-1158834548
MaxCmd
2006-09-21 14:29
2009.07.05
Кодировки в Excel


15-1240993263
Diha
2009-04-29 12:21
2009.07.05
Компонент шрифтов


2-1242384937
evgenij
2009-05-15 14:55
2009.07.05
опять смена форматов


2-1242569052
Святослав
2009-05-17 18:04
2009.07.05
Вывод текста на форме вертикально


15-1240862526
tesseract
2009-04-28 00:02
2009.07.05
Языки свервысокого уровня.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский