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

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

Разделение программы на модули [D7, Win95/98]


DelPHist ©   (2004-06-15 00:18:00) 

Возникла такая проблема: программа должна находиться в одном окне (т.е. форма у неё - одна), но вот реализация обработчиков всех компонентов занимает очень уж много места - неудобно (всё, что можно было сделать в другом модуле, я сделал). Нельзя ли объявление какого-либл метода/обработчика и т.д. разместить в главном модуле, а его реализацию - в другом?


Sandman25   (2004-06-17 12:35:00) [1]

>реализация обработчиков всех компонентов занимает очень уж много места

Скорее всего, идет большая обработка данных. В таком случае следует вынести всю обработку в отдельную процедуру.

типа

Button1Click
begin
 Edit1.Text := GetAnalyzeResults(Edit2.Text);
end;


PVOzerski   (2004-06-17 12:27:00) [2]

IMHO, разбиение по модулям не слишком много удобств добавит. Так, в design-time назначить обработчик из другого модуля уже не выйдет. Вынести реализацию методов в include-файлами - мысль занятная (и работает, надо сказать), но уж больно неудобно в design-time "кликом" новые обработчики делать: стирать, переписывать (вставлять из буфера) в другом файле... И как-то нетрадиционно, что ли.

Вот примерчик с юнитами (работает в D3):

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
uses
unit2;
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Button1.OnClick:=FakeForm.myHandler;
end;

end.

unit Unit2;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
tFakeForm=class(TForm)
public
 procedure MyHandler(AOwner:tObject);
end;
var
FakeForm:tFakeForm;
implementation
procedure tFakeForm.MyHandler(AOwner:tObject);
begin
 ShowMessage('Hello!');
end;
initialization
FakeForm:=tFakeForm.CreateNew(nil);
end.

program Project1;

uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1},
 Unit2 in 'd:\pas\Borland\Delphi 3\Unit2.pas';

{$R *.RES}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

object Form1: TForm1
 Left = 200
 Top = 108
 Width = 544
 Height = 375
 Caption = 'Form1'
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 208
   Top = 112
   Width = 75
   Height = 25
   Caption = 'Button1'
   TabOrder = 0
 end
end


Германн   (2004-06-17 03:09:00) [3]

И кстати
2 DelPHist ©   (17.06.04 00:20) [5]
> Он ведь поля класса из другого Unit не увидит :(

А это - смотря какие!


Andy BitOff   (2004-06-17 01:01:00) [4]

Помоему это ты не понял.

DrPass ©   (16.06.04 01:19) [3]

Это как раз то, что тебе надо. Надеюсь понятно, что с $iможно использовать любое имя нужного тебе файла.


DelPHist   (2004-06-17 00:20:00) [5]

Нет, вы не поняли - я не такой тормоз, каким, наверное, кажусь.
Вы сами-то пробовали, скажем, обработчик нажатия кнопки вынести в другой модуль (при этом этот обработчик ещё пол-формы изменяет). Он ведь поля класса из другого Unit не увидит :(


Ozone   (2004-06-16 05:18:00) [6]

New->Unit


DrPass   (2004-06-16 01:19:00) [7]

Разбей модуль на несколько файлов. Аналог сишного #include выглядит так:
{$i my_realization.inc}


DelPHist   (2004-06-16 00:37:00) [8]

Спасибо за толковый ответ. А если серьёзно, то как?


Fay   (2004-06-15 00:21:00) [9]

можно


Наверх

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