![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброе время суток всем.
У меня такая проблема: есть необходимость выделить каждый метод класса в отдельный файл. Пытался связать их, как обычные модули с помощью uses - не помогло, возможно что-то не так сделал. Этот метод не понимает, что он относится к какому-то классу и компилятор ругается на точку, которая стоит после имени его класса. Внимание, вопрос: как быть? |
#2
|
|||
|
|||
![]() К сожалению, в Дельфи такого понятия, как partial class, нет.
Варианта 3: 1. Через наследование и/или интерфейсы. 2. Через директиву включения {$I file.pas} 3. Забить на это и сделать просто набор процедур и функций, а для их объединения можно просто использовать свой клас контекста, в котором хранить все промежуточные данные. |
#3
|
|||
|
|||
![]() Разумеется третий вариант самый эффективный, но, к сожалению, таково задание.
Через наследование тоже нельзя, тк метод должен пренадлежать конкретному классу, а не его потомку, к дерективе, думаю, преподаватель тоже придерется. Через интерфейсы я пробовал, но ничего не получается, может я что-то не так делаю? Можете хотя бы кратко описать как это должно выглядеть? |
#4
|
||||
|
||||
![]() Может выложишь полный текст задания, а то у меня подозрение.
Может быть речь идет просто о директиве {$I file.pas} ? - вариант 2 Пример: В файле "FormCreate.inc" пишем Код:
procedure TForm1.FormCreate(Sender: TObject); begin // чтото делаем end; Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {$I 'FormCreate.inc'} end. |
#5
|
|||
|
|||
![]() Ну, допустим, вот один из юнитов программы (в каждом юните свой класс). Это такой контейнер, он умеет считывать и выдавать информацию.
Здесь три метода, как вы видите. нужно, чтобы в этом юните по сути осталось только описание класса, а описания методов должны быть в отдельных файлах. Дерективой я пользоваться умею. Может кто-нибудь знает другие способы реализации? Код:
unit Box; interface type Tbox=class a: array [1..10] of Pointer; kol:integer; public destructor Close_box(); constructor Read_Box(); procedure Write_box(); end; var booo:Tbox; implementation uses Shar, Parallep ,SysUtils,Base, unit1 ; var sh : PSharik; ps : PSparal; {procedure Tbox.Write_box(); var i:integer; FOut: TextFile; begin assign(FOut,'Out.txt'); rewrite(FOut); writeln(FOut,'Kolichestvo elementov v konteiynere: '+inttostr( booo.kol)); for i := 1 to booo.kol do begin if PSharik(booo.a[i])^.PrintTe=1 then begin sh:=PSharik( booo.a[i]); writeln( i,': '+sh^.Print(sh^)); writeln(FOut, i,': '+sh^.Print(sh^)); end else if PSparal(booo.a[i])^.PrintTe=2 then begin ps:=PSparal(booo.a[i]); writeln( i,': '+ps^.Print(ps^)); writeln(FOut, i,': '+ps^.Print(ps^)); end; end; close(FOut); end; } destructor Tbox.Close_box(); var i:integer; begin for i := 1 to booo.kol do begin dispose(booo.a[i]); booo.a[i]:=nil; end; end; constructor Tbox.Read_Box(); var fi:TextFile; s,s1,s2,a,b,c,z: string; i,j,kol:integer; begin AssignFile(fi,'in.txt'); reset(fi); j:=0; while (not eof(fi))and (booo.kol<10) do begin inc(j); if booo.kol<11 then //Переполнение begin Readln(fi,s); Readln(fi,s1); Readln(fi,s2); Readln(fi,z); if s<>'' then begin if StrToInt(s)=1 then // опред. фиг. begin new(sh); inc(booo.kol); booo.a[j]:=sh; sh^:= Sharik.Create; sh^.SetParam( sh^, strtoint(s1),strtofloat(s2),j,1); end else begin new(ps); booo.a[j]:=ps; ps^:=Parallelepiped.Create; inc(booo.kol); kol:=0; a:=''; b:=''; c:=''; for i := 1 to length(s2) do // деление на а b c begin if s2[i]<>' ' then begin if kol=0 then a:=a+s2[i] else if kol=1 then b:=b+s2[i] else c:=c+s2[i] end else inc(kol); end; ps^.SetParam(ps^,StrToInt(a),StrToInt(b),StrToInt(c),StrToFloat(s1),j,StrToInt(s)); end; end; end; end; end; end. |
#6
|
||||
|
||||
![]() Так вот этого
Цитата:
И почему написано "в отдельных файлах", а не модулях ? По существу директива инклуде это и делает. Если же цель например скрыть реализацию от потребителей ( т.е. передаете библиотеку с описаниями а реализация скрыта в dcu ), можно типа такого сделать Код:
destructor Tbox.Close_box(); begin Unit1.box_Destructor(<необходимые поля>); end; Или посмотри в сторону obj файлов и директивы {$LINK filename}. Только не уверен что так методы можно выносить, знаю только про функции. |