![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разделение программы на модули [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]можно