Потоки и как их передавать как параметры...

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
PapaNT
постоялец
Сообщения: 162
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Потоки и как их передавать как параметры...

Сообщение PapaNT »

Уважаемые друзья, я все далее зарываюсь от привычного процедурного стиля в объекты. Докодился до работы с потоками, но как-то оно пока не катит...

Имеется код:

Код: Выделить всё

Type
 { TForm1 }
  TForm1 = class(TForm)
  // Чего-то там
  Button2 : TButton;
  Procedure MyProc(s : Stream);
  Private
 { Private Declarations }
  Public
    SrcStream : TStream; // Файловый поток для анализируемого файла
  end;
Var
 Form1 : TForm1;
Implementation
{$R *.lfm}
{ TForm1 }
// Ещё чего-то там
Procedure TForm1.MyProc(AStream : TStream);
begin
// Код...
end;
Procedure TForm1.Button2Clic(Sender : TObject);
begin
  // код...

  TForm1.MyProc(Form1.SrcStream); // вот тут аж две ошибки компиляции
// Error: Only class methods, class properties and class variables can be accessed in class methods
// Error: Only class methods, class properties and class variables can be referred whith class references

  // код...


Не подскажите ли как правильно передавать поток в процедуру/функцию?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

PapaNT писал(а):TForm1.MyProc(Form1.SrcStream);


Код: Выделить всё

MyProc(SrcStream);


То, как вы это делаете, годится только для вызова статических членов класса

Добавлено спустя 2 минуты 24 секунды:
более того, внутри экземпляра класса SrcStream виден в каждом методе... Его вообще никуда передавать не надо
xdsl
постоялец
Сообщения: 131
Зарегистрирован: 15.01.2009 12:49:03

Сообщение xdsl »

Экземпляры классов (определенные через class, а не через object) являются указателями. Следовательно их можно передавать в функции и они везде будут ссылаться на один и тот-же объект.

Однако у Вас проблема в другом. Вы вызываете Myproc не у объекта Form1, а у класса TForm1. Если это описка, то исправьте на Form1.myproc(). Если так и задумано, то подобный вызов возможен только для класс-методов, определенных, например, так:

Код: Выделить всё

 TForm1 = class(TForm)
   ...
  class Procedure MyProc(s : Stream);
  ...
  end;
wavebvg
постоялец
Сообщения: 352
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

У объектного программирования, в отличии от процедурного, понятие контекста формализовано и для его передачи используется понятие объекта.

Т.е. для передачи потока не нужно его передавать как параметр, достаточно просто вызвать нужный член класса так, как это предусмотрено.
xdsl
постоялец
Сообщения: 131
Зарегистрирован: 15.01.2009 12:49:03

Сообщение xdsl »

wavebvg писал(а):У объектного программирования, в отличии от процедурного, понятие контекста формализовано и для его передачи используется понятие объекта.
Т.е. для передачи потока не нужно его передавать как параметр, достаточно просто вызвать нужный член класса так, как это предусмотрено.
Да ну? Повсеместно объекты-потоки передаются параметрами в методы классов. Банальный пример: http://freepascal.org/docs-html/rtl/cla ... tream.html
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Да ну? Повсеместно объекты-потоки передаются параметрами в методы классов. Банальный пример: http://freepascal.org/docs-html/rtl/cla ... tream.html

Речь была про передачу потока внутри одного класса.
xdsl
постоялец
Сообщения: 131
Зарегистрирован: 15.01.2009 12:49:03

Сообщение xdsl »

Дож писал(а):Речь была про передачу потока внутри одного класса.
Если речь идет о Form1.Myproc(), то да. Однако автор поста применяет TForm1.Myproc(), а это уже попытка вызова метода у класса, а не у объекта. В таком случае из Myproc обратиться к полям внутри класса нельзя, их просто физически не существует.
wavebvg
постоялец
Сообщения: 352
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

xdsl писал(а):Да ну? Повсеместно объекты-потоки передаются параметрами в методы классов. Банальный пример: http://freepascal.org/docs-html/rtl/cla ... tream.html


Интересно, где по ссылке передан контекст объекта для последующего использования? Передается объект. Можно потом вызвать методы объекта в контексте именно этого объекта. Либо нужен другой пример, либо уборка в теме.

ЗЫ Хотя всё это демагогия, потому что во множестве языков нет соответсвующих механизмов и они как-то же работают! Просто использую средства формализации на уровне языка проще накапливать возможности и быстро обучаться их использованию.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

xdsl писал(а):В таком случае из Myproc обратиться к полям внутри класса нельзя, их просто физически не существует.


Можно. Если поля объявлены как static;
и если процедуры объявлены как static;
Подобный подход исчезающе редко применяется в Object Pascal по очевидным причинам - язык дает возможность создавать процедуры вне объектной модели.
Ответить