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

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

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

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

Сообщение PapaNT » 07.04.2014 15:19:50

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

Имеется код:
Код: Выделить всё
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

  // код...


Не подскажите ли как правильно передавать поток в процедуру/функцию?
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

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

Сообщение SSerge » 07.04.2014 15:34:02

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


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


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

Добавлено спустя 2 минуты 24 секунды:
более того, внутри экземпляра класса SrcStream виден в каждом методе... Его вообще никуда передавать не надо
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение xdsl » 10.04.2014 11:55:03

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

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

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

Сообщение wavebvg » 10.04.2014 17:34:27

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

Т.е. для передачи потока не нужно его передавать как параметр, достаточно просто вызвать нужный член класса так, как это предусмотрено.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

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

Сообщение xdsl » 11.04.2014 10:36:49

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

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

Сообщение Дож » 11.04.2014 10:48:59

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

Речь была про передачу потока внутри одного класса.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение xdsl » 11.04.2014 11:01:40

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

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

Сообщение wavebvg » 11.04.2014 11:15:48

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


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

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

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

Сообщение SSerge » 11.04.2014 11:53:40

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


Можно. Если поля объявлены как static;
и если процедуры объявлены как static;
Подобный подход исчезающе редко применяется в Object Pascal по очевидным причинам - язык дает возможность создавать процедуры вне объектной модели.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru