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

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

Функция в другой форме [D7, XP]


Страницы:   1 2

Unforgiven ©   (2009-03-02 12:54:00) 

Такая ситуация. В одном Unit1 у меня написана функция по рисованию в PaintBox. Так же во второй форме Unit2 мне нужно использовать эту же фукцию. То есть вызвать функцию первой формы во второй...
Как это реализовать? таким способом невышло Form1.MyFync;


ЮЮ   (2009-03-03 10:36:00) [1]

Если функция должна рисовать одинаково и на Form1.PaintBox1 и на Form2.PaintBox2, то она должна рисовать как минимум на "абстрактном" PaintBox-е, переданном ей в качестве параметра:

procedure DrawOnPaintBox(APaintBox: TPaintBox);
...

и тогда на любой форме мы можем её вызвать:

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
   DrawOnPaintBox(TPaintBox(Sender));
end;

а лучше рисовать не на  TPaintBox-е, а на TCanvas, ибо все равно все сведется к нему. Но тогда  DrawOnPaintBox сможет рисовать не только на  TPaintBox, но и на Form1.Canvas, Image1.Canvas, TBitmap.Canvas  и т.д.


Anatoly Podgoretsky   (2009-03-02 14:38:00) [2]

> Плохиш  (02.03.2009 14:13:19)  [19]

Неправда варианты есть!!!


Плохиш   (2009-03-02 14:13:00) [3]

О, круто, ветка для тренировки телепаторов :-))

Что ж, мой говорит, что у аФФтара ошибка в 17й строке, без вариантов.


ZiZiTop   (2009-03-02 14:09:00) [4]

Если сильно надо, то можно сделать новый класс (наследник), добавить пару методов и брать как образ для всех будущих форм. Хотя никакого выйгрыша всё-равно нет. Проще выделить код (который явно повторяется в методах обоих форм) согласовать параметры, вынести (хоть) в отдельный модуль и из обоих форм вызывать, так удобнее.


clickmaker   (2009-03-02 13:57:00) [5]

> [16] Unforgiven   (02.03.09 13:53)

как-то кривовато... я бы вынес тогда эту функцию в отдельный юнит, если она конкретно ни к одной форме не привязана.
А PaintBox и вообще любые данные можно передавать туда в параметрах.

В любом случае общедоступные функции должны быть объявлены под модификатором public


Unforgiven   (2009-03-02 13:53:00) [6]

>clickmaker
Дело в том что в функции я юзаю много данных из юнита1, но так же нужно вызвать эту же функцию через 2 форму. Как бы запустить ее.


clickmaker   (2009-03-02 13:51:00) [7]

> [14] Unforgiven   (02.03.09 13:49)
> >clickmaker
> PaintBox у меня на форме2. А функция в юнит1

а почему? Какое отношение имеет рисование на паинтбоксе одной формы к юниту другой?


Unforgiven   (2009-03-02 13:49:00) [8]

>clickmaker
PaintBox у меня на форме2. А функция в юнит1


clickmaker   (2009-03-02 13:47:00) [9]

> [10] Unforgiven   (02.03.09 13:23)

из юнита 2 нужно что-то нарисовать именно на паинтбоксе формы 1 ?


Сергей М.   (2009-03-02 13:31:00) [10]


> Unforgiven   (02.03.09 13:23) [10]


> TForm2.PaintGraphic


Это не функция.

TForm2 - это идентификатор класса, объявленного тобой в юните Unit2
PaintGraphic - это идентификатор методаэтого класса.

А где же функция ?


Б   (2009-03-02 13:25:00) [11]


> Добавил в Uses Unit1. Пытался вызвать функцию, но кроме
> переменных больше ничего не вызывается.



interface

// Прототипы объявляются здесь.

implementation


Unforgiven   (2009-03-02 13:23:00) [12]


> во, это уже ближе к делу.
> Ты не ответил на вопрос: что ты предпринял для достижения
> своей цели, кроме кидания кнопки на форму и дабл-клика на
> ней?

Добавил в Uses Unit1. Пытался вызвать функцию, но кроме переменных больше ничего не вызывается. Пробывал добавлять в Type прототип но получал в ответ "[DCC Error] Unit2.pas(14): E2065 Unsatisfied forward or external declaration: 'TForm2.PaintGraphic'"


Ega23   (2009-03-02 13:14:00) [13]


> Мне надо чтобы во второй форме я мог нажимая на кнопку вызывать
> функцию первого юнита.
> То есть тут надо как то вызвать фукцию первого юнита.


во, это уже ближе к делу.
Ты не ответил на вопрос: что ты предпринял для достижения своей цели, кроме кидания кнопки на форму и дабл-клика на ней?


Anatoly Podgoretsky   (2009-03-02 13:12:00) [14]


> Мне надо чтобы во второй форме я мог нажимая на кнопку вызывать
> функцию первого юнита.
> То есть тут надо как то вызвать фукцию первого юнита.
>
> procedure TForm2.ButtonClick(Sender: TObject);
> begin
>
> end;

Тут просто
procedure TForm2.ButtonClick(Sender: TObject);
begin
  unit1.FuncName;
end;


Сергей М.   (2009-03-02 13:11:00) [15]


> таким способом невышло Form1.MyFync


Невышло ? А зачем засовывал ?)

Что значит "невышло" ?


Б   (2009-03-02 13:10:00) [16]

Прототип функции нужно объявить в интерфейсной части подключаемого модуля, а потом этот модуль прицепить к телу программы (главного модуля). Вот и все дела.


Unforgiven   (2009-03-02 13:07:00) [17]

>Ega23
Мне надо чтобы во второй форме я мог нажимая на кнопку вызывать функцию первого юнита.
То есть тут надо как то вызвать фукцию первого юнита.

procedure TForm2.ButtonClick(Sender: TObject);
begin

end;


clickmaker   (2009-03-02 13:03:00) [18]

функции, которые не привязаны к формам, лучше выносить в отдельный юнит. А в других - uses его


Ega23   (2009-03-02 13:02:00) [19]


> Хм. Попробывал через юнит, в нем только мои публик переменные


У юнита нет public-переменных, они есть у класса и называются полями.
Короче, что тебе нужно и какие конкретные шаги ты для достижения этой цели выполнил?


Unforgiven   (2009-03-02 12:59:00) [20]

Хм. Попробывал через юнит, в нем только мои публик переменные


Страницы:   1 2

Наверх

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