Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Жизнь в Run-Time [D7, Win2k]


Dot ©   (2004-11-23 21:19:00) 

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

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.
********************
Так вот господа это листинг файла проекта, поскольку в модуль я не смог занести это. Следовательно вопрос. Как мне сделать обработчик события нажатия на кнопку??? Или может есть другой способ


ЮЮ   (2004-11-29 07:12:00) [1]

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

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


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

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


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

> 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-24 21:43:00) [4]

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

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


KSergey   (2004-11-24 11:19:00) [5]

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

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


TUser   (2004-11-24 11:16:00) [6]


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

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


KSergey   (2004-11-24 11:14:00) [7]

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

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


TUser   (2004-11-24 10:52:00) [8]

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


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

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


KSergey   (2004-11-24 10:33:00) [9]

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

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


ЮЮ   (2004-11-24 03:07:00) [10]

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

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

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

Btn.Onclick := TMyMetods.btnOnClick;

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


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

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

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


begin...end   (2004-11-23 21:50:00) [12]


> [2] Dot   (23.11.04 21:42)

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


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

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


begin...end   (2004-11-23 21:26:00) [14]


> Dot   (23.11.04 21:19)

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

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1101212600&n=0


Наверх

Титульная страница Поиск, карта сайта Написать письмо