Страница 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:36:26
SSerge
PapaNT писал(а):TForm1.MyProc(Form1.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
Дож
Речь была про передачу потока внутри одного класса.
Re: Потоки и как их передавать как параметры...
Добавлено: 11.04.2014 11:01:40
xdsl
Дож писал(а):Речь была про передачу потока внутри одного класса.
Если речь идет о Form1.Myproc(), то да. Однако автор поста применяет TForm1.Myproc(), а это уже попытка вызова метода у класса, а не у объекта. В таком случае из Myproc обратиться к полям внутри класса нельзя, их просто физически не существует.
Re: Потоки и как их передавать как параметры...
Добавлено: 11.04.2014 11:15:48
wavebvg
Интересно, где по ссылке передан контекст объекта для последующего использования? Передается объект. Можно потом вызвать методы объекта в контексте именно этого объекта. Либо нужен другой пример, либо уборка в теме.
ЗЫ Хотя всё это демагогия, потому что во множестве языков нет соответсвующих механизмов и они как-то же работают! Просто использую средства формализации на уровне языка проще накапливать возможности и быстро обучаться их использованию.
Re: Потоки и как их передавать как параметры...
Добавлено: 11.04.2014 11:53:40
SSerge
xdsl писал(а):В таком случае из Myproc обратиться к полям внутри класса нельзя, их просто физически не существует.
Можно. Если поля объявлены как static;
и если процедуры объявлены как static;
Подобный подход исчезающе редко применяется в Object Pascal по очевидным причинам - язык дает возможность создавать процедуры вне объектной модели.