Форум по 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,087
Версия 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" пишем
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // чтото делаем
end;
В Unit1
Код:
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
По умолчанию

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

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

Код:
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 ), можно типа такого сделать
Код:
destructor Tbox.Close_box();
begin
  Unit1.box_Destructor(<необходимые поля>);
end;
.
Или посмотри в сторону obj файлов и директивы {$LINK filename}. Только не уверен что так методы можно выносить, знаю только про функции.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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