Страница 1 из 1

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

СообщениеДобавлено: 07.04.2014 15:19:50
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

  // код...


Не подскажите ли как правильно передавать поток в процедуру/функцию?

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

СообщениеДобавлено: 07.04.2014 15:34:02
SSerge
PapaNT писал(а):TForm1.MyProc(Form1.SrcStream);


Код: Выделить всё
MyProc(SrcStream);


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

Добавлено спустя 2 минуты 24 секунды:
более того, внутри экземпляра класса SrcStream виден в каждом методе... Его вообще никуда передавать не надо

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

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

Однако у Вас проблема в другом. Вы вызываете Myproc не у объекта Form1, а у класса TForm1. Если это описка, то исправьте на Form1.myproc(). Если так и задумано, то подобный вызов возможен только для класс-методов, определенных, например, так:
Код: Выделить всё
TForm1 = class(TForm)
   ...
  class Procedure MyProc(s : Stream);
  ...
  end;

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

СообщениеДобавлено: 10.04.2014 17:34:27
wavebvg
У объектного программирования, в отличии от процедурного, понятие контекста формализовано и для его передачи используется понятие объекта.

Т.е. для передачи потока не нужно его передавать как параметр, достаточно просто вызвать нужный член класса так, как это предусмотрено.

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

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

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

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

Речь была про передачу потока внутри одного класса.

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

СообщениеДобавлено: 11.04.2014 11:01:40
xdsl
Дож писал(а):Речь была про передачу потока внутри одного класса.
Если речь идет о Form1.Myproc(), то да. Однако автор поста применяет TForm1.Myproc(), а это уже попытка вызова метода у класса, а не у объекта. В таком случае из Myproc обратиться к полям внутри класса нельзя, их просто физически не существует.

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

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


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

ЗЫ Хотя всё это демагогия, потому что во множестве языков нет соответсвующих механизмов и они как-то же работают! Просто использую средства формализации на уровне языка проще накапливать возможности и быстро обучаться их использованию.

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

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


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