Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.12.2009, 22:20
Mostovoi Mostovoi вне форума
Прохожий
 
Регистрация: 22.12.2009
Сообщения: 8
Репутация: 10
По умолчанию Метод в отдельном файле

Доброе время суток всем.

У меня такая проблема: есть необходимость выделить каждый метод класса в отдельный файл. Пытался связать их, как обычные модули с помощью uses - не помогло, возможно что-то не так сделал. Этот метод не понимает, что он относится к какому-то классу и компилятор ругается на точку, которая стоит после имени его класса.

Внимание, вопрос: как быть?
Ответить с цитированием
  #2  
Старый 22.12.2009, 22:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,093
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

К сожалению, в Дельфи такого понятия, как partial class, нет.
Варианта 3:
1. Через наследование и/или интерфейсы.
2. Через директиву включения {$I file.pas}
3. Забить на это и сделать просто набор процедур и функций, а для их объединения можно просто использовать свой клас контекста, в котором хранить все промежуточные данные.
Ответить с цитированием
  #3  
Старый 22.12.2009, 22:36
Mostovoi Mostovoi вне форума
Прохожий
 
Регистрация: 22.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

Разумеется третий вариант самый эффективный, но, к сожалению, таково задание.

Через наследование тоже нельзя, тк метод должен пренадлежать конкретному классу, а не его потомку, к дерективе, думаю, преподаватель тоже придерется.

Через интерфейсы я пробовал, но ничего не получается, может я что-то не так делаю? Можете хотя бы кратко описать как это должно выглядеть?
Ответить с цитированием
  #4  
Старый 23.12.2009, 10:04
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Может выложишь полный текст задания, а то у меня подозрение.

Может быть речь идет просто о директиве {$I file.pas} ? - вариант 2

Пример: В файле "FormCreate.inc" пишем
Код:
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
  // чтото делаем
end;
В Unit1
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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.
В место {$I 'FormCreate.inc'} компилятор вставит текст файла. И так можно практически для любого участка кода.
Ответить с цитированием
  #5  
Старый 23.12.2009, 11:24
Mostovoi Mostovoi вне форума
Прохожий
 
Регистрация: 22.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

Ну, допустим, вот один из юнитов программы (в каждом юните свой класс). Это такой контейнер, он умеет считывать и выдавать информацию.
Здесь три метода, как вы видите.
нужно, чтобы в этом юните по сути осталось только описание класса, а описания методов должны быть в отдельных файлах.

Дерективой я пользоваться умею. Может кто-нибудь знает другие способы реализации?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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  
Старый 23.12.2009, 12:06
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Так вот этого
Цитата:
описания методов должны быть в отдельных файлах.
и не пойму ( смысл, суть или цель, которая должна быть достигнута ) - именно так и звучит в задании ?
И почему написано "в отдельных файлах", а не модулях ?
По существу директива инклуде это и делает.
Если же цель например скрыть реализацию от потребителей ( т.е. передаете библиотеку с описаниями а реализация скрыта в dcu ), можно типа такого сделать
Код:
1
2
3
4
destructor Tbox.Close_box();
begin
  Unit1.box_Destructor(<необходимые поля>);
end;
.
Или посмотри в сторону obj файлов и директивы {$LINK filename}. Только не уверен что так методы можно выносить, знаю только про функции.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025