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

Вниз

Жизнь в Run-Time   Найти похожие ветки 

 
Dot   (2004-11-23 21:19) [0]

Мастера, посмотрите код, а потом как раз мой вопрос.

procedure ShowMyForm;
var
form: Tform;
Btn: TButton;
begin
 Application.CreateForm(TForm, Form);
 form.Caption:="DinamoForm";
 form.Position:=poScreenCenter;
 form.BorderIcons:=[biSystemMenu];
 form.BorderStyle:=bsSingle;
 form.Height:=300;
 form.Width:=300;

 Btn:=TButton.Create(Form);
 Btn.Left:=50;
 Btn.Top:=150;
 Btn.Width:=100;
 Btn.Height:=25;
 Btn.Caption:="ClickMe";
 Btn.Parent:=Form;
begin
ShowMyForm;
Application.Run;
end.
********************
Так вот господа это листинг файла проекта, поскольку в модуль я не смог занести это. Следовательно вопрос. Как мне сделать обработчик события нажатия на кнопку??? Или может есть другой способ


 
begin...end ©   (2004-11-23 21:26) [1]


> Dot   (23.11.04 21:19)

http://www.delphikingdom.com/helloworld/runtime_comp.htm

http://delphimaster.net/view/1-1101212600/


 
Dot   (2004-11-23 21:42) [2]

Спасибо там я уже был. Мне надо несколько другое.
Во всех примерах есть готовая ГЛАВНАЯ форма и уже на ней динамически можно все создавать и вызыватьдругие формы. Это не вызывает НИКАКИХ проблем. Проблема возникает именно когда я создаю главную форму. Почему то процедуру которую я привел выше приходится размещать только в файле проекта а не модуля, и получается процедуры прорисовок кнопок итд тоже надо делать там же.
Беда в том что в юниту то можно все сделать а вот в проекте я не знаю как. Поскольку на Btn.Onclick:=btnOnClick дельфя ругаецца и примеры предложенные тут (http://www.delphikingdom.com/helloworld/runtime_comp.htm)
Не помогают.. вот в чем дело...
кстати щас подумал .. вот в моем коде я е указывал Имя формы при создании .. это может повлиять?
И как мне само создание отловить то?


 
begin...end ©   (2004-11-23 21:50) [3]


> [2] Dot   (23.11.04 21:42)

А зачем так создавать главную форму? Можно ведь оставить её создание (Application.CreateForm) в файле проекта. А необходимые компоненты на ней создавать в обработчике TForm.OnCreate.


 
Dot   (2004-11-23 21:56) [4]

В том то и вся фишка!
Я сам не знаю возможно ли это вот и хочу узнать, должно быть возможно. На Апи писать не хочется да и нежелательно.
Просто таким образом я могу создать полнойценную форму со всеми компонентами, только без обработчиков событий =( (пока что)

И самое главное, декомпилирование такого проекта ничего не даст!!! Вообще ничего. декомпилятор покажет пустые поля. это проверенно. А если я оставлю ее создание то декомпилер выдаст мне все процедуры этой формы =(( что нежелательно.
Да и к тому же это чертовски интересно.


 
ЮЮ ©   (2004-11-24 03:07) [5]

>Поскольку на Btn.Onclick:=btnOnClick дельфя ругаецца

Потому что Onclick должен быть методом, а не просио процедурой.

Т.е. в модуле проекта надо описать некий класс, например, TMyMetods с методом btnOnClick

Btn.Onclick := TMyMetods.btnOnClick;

З.Ы. Возможно потреюуется создать экземпляр этого класса(точно не уверен, а проверять неохота :)
myMetods := TMyMetods.Create;
...  
Btn.Onclick := myMetods.btnOnClick;


 
KSergey ©   (2004-11-24 10:33) [6]

> [4] Dot   (23.11.04 21:56)
> И самое главное, декомпилирование такого проекта ничего
> не даст!!!
> Да и к тому же это чертовски интересно.

Фигней маятесь.
VCL построена так, что генерит код определенным образом. Ломать это - неблагодарное занятие. Декомпилятор ничего полезного не даст. обсуждалось.


 
TUser ©   (2004-11-24 10:52) [7]

Почему надо создавать главную форму таким хитрым образом - я не понимаю. И надо еще Application.Initialize писать.


> Потому что Onclick должен быть методом, а не просио процедурой.

Компилятор можно обмануть примерно так
var ne:TNotifyEvent;
begin
@ne:=@YourProc; // YourProc - просто процедура, а не метод
Button1.OnClick:=ne;
end;


 
KSergey ©   (2004-11-24 11:14) [8]

> [6] KSergey ©   (24.11.04 10:33)
> > Да и к тому же это чертовски интересно.

К стати. А вы в курсе, что VCL всегда создает невидимое окно, которое, на самом деле. и есть основное окно прилжения с точки зрения Windows? ;) Вас это не смущает? ;) Не возникает желания "что-то с этим сделать"? ;)


 
TUser ©   (2004-11-24 11:16) [9]


> А вы в курсе, что VCL всегда создает невидимое окно, которое,
> на самом деле. и есть основное окно прилжения с точки зрения
> Windows?

К слову пришлось - т.о. все Delphi-приложения  есть "Dialog-based" в понимании VC. Так?


 
KSergey ©   (2004-11-24 11:19) [10]

> [9] TUser ©   (24.11.04 11:16)
> К слову пришлось - т.о. все Delphi-приложения  есть "Dialog-based"
> в понимании VC.

Если такую аналогию и можно провести - то слишком условно. Я бы не стал так говорить.


 
Dot   (2004-11-24 21:43) [11]

2KSergey
> Фигней маятесь.
> VCL построена так, что генерит код определенным образом. Ломать > это - неблагодарное занятие. Декомпилятор ничего полезного не
> даст. обсуждалось.

Я вообще то сосвем про противоположные вещи говорил.
вот думаю все сказно хотя и непонятно
Как создать главную форму + создать обработчик события OnClick для нее  и все!


 
Юрий Зотов ©   (2004-11-24 22:07) [12]

> Dot   (24.11.04 21:43) [11]

> Как создать главную форму + создать обработчик события OnClick
> для нее


procedure MainFormClick(Self: TForm; Sender: TObject);
begin
 ShowMessage(Self.Caption + ": OnClick handler")
end;

procedure CreateMainForm;
var
 F: TForm;
 M: TMethod;
begin
 Application.CreateForm(TForm, F);
 M.Code := @MainFormClick;
 M.Data := Pointer(F);
 F.OnClick := TNotifyEvent(M)
end;

begin
 Application.Initialize;
 CreateMainForm;
 Application.Run
end.


Только изврат это...
:о)


 
Dot   (2004-11-26 21:53) [13]

Это конечно более чем отлично, однако теперь я столкнулся с другой проблемой.
Я не могу взаимодействовать с компонентами.
То есть если брать за основу код Юрия Зотова (тот что выше)
Я не могу сделать соответственно так
procedure MainFormClick(Self: TForm; Sender: TObject);
begin
Edit1.Text:="blablabla";
end;
поскольку Edit1 я получается не создал, хотя на момент вызова я уже создаю его, одлнако в коде он не определен, не создавать же заново.. да и как если свойство Parent опять не задашь (в смысле форму.. ее ведь нет =()
Вот короче и вопрос как мне теперь можно с компонентави общаться?


 
ЮЮ ©   (2004-11-29 07:12) [14]

>Edit1.Text:="blablabla";
>поскольку Edit1 я получается не создал, хотя ...

не потоиу, что не создал, а потоиу что Edit1 в контексте этой процедуры - неизвестный идентификатор. Edit1 - это publish поле какого-то объекта - наследника TForm, пусть например Form1, вот и указывай
Form1.Edit1.Text



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

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

Наверх




Память: 0.51 MB
Время: 0.024 c
1-1101740956
Wolffgang
2004-11-29 18:09
2004.12.12
Взаимосвязь между числами


14-1101284415
Ricko
2004-11-24 11:20
2004.12.12
"На самом деле"


14-1101127318
Erik1
2004-11-22 15:41
2004.12.12
Как найти какой unit добавляет QR4RunD5 и VirtualTreesD5?


1-1101723610
WondeRu
2004-11-29 13:20
2004.12.12
Интерфейс объявляется как класс!??? Эт как?


1-1101856183
bulanov
2004-12-01 02:09
2004.12.12
Притормаживание при загрузке рисунка