Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рекурсивное описание типов. [D6, WinME, Win2k]


SergP. ©   (2005-07-07 13:25:00) 

Нужно сделать нечто подобное:


type TmyProc =procedure(S:TWaitWin);

type
 TWaitWin = class(TForm)
 ...
 public
 ...
   constructor CreateADD(Proc:TMyProc);
 ...
 end;


Естественно получаю ошибку.
Как правильно сделать в таком случае?

Конечно можно было бы написать:
type TmyProc =procedure(S:Pointer);
Но хочется все-таки чтобы было TWaitWin


SergP.   (2005-07-07 15:22:00) [1]

Понял. Спасибо всем...


icWasya   (2005-07-07 14:56:00) [2]

короче...
незавершённыеобъявления типов -
PSomeType= TSomeType;
и
TMyClass= Class;
обязательно должны быть завершены в пределах одного списка объявлений типов. То есть так можно

type
 PSomeType=TSomeType;
 TMyClass=Class;
 TNteClass=Class
   FSome : PSomeType;
   FMy   : TMyClass;
 end;
 TSomeType = Integer;
 TMyClass  = Class(TForm)
 end;

а вот так - нельзя

type
 PSomeType=TSomeType;
type
 TMyClass=Class;
type
 TNteClass=Class
   FSome : PSomeType;
   FMy   : TMyClass;
 end;
type
 TSomeType = Integer;
type
 TMyClass  = Class(TForm)
 end;


найдите десять отличий


pasha_golub   (2005-07-07 14:11:00) [3]

Digitman ©   (07.07.05 14:05) [16]
Так наглядней. :0)


Digitman   (2005-07-07 14:05:00) [4]

type

TWaitWin = class;
TmyProc =procedure(S:TWaitWin);
TWaitWin = class(tform)
  ...
end;

!!!!


begin...end   (2005-07-07 14:03:00) [5]

> SergP.   (07.07.05 14:02) [14]

Неправильно поняли.
Опережающее и полное описание класса должны находиться в одной и той же секции type.


SergP.   (2005-07-07 14:02:00) [6]

Прочитал 12 и сделал так как понял, т.е.:


type TWaitWin = class;
type TmyProc =procedure(S:TWaitWin);
type
 TWaitWin = class(TForm)
 ...

function DoProgress(proc:TMyProc):boolean;



Все равно получаю [Error] Unit2.pas(20): Type 'TWaitWin' is not yet completely defined


pasha_golub   (2005-07-07 13:56:00) [7]

begin...end ©   (07.07.05 13:54) [12]
Однако. Не обращал внимания никогда. Тогда наверное так:

type TWaitWin = class; //объявляем с учетом того, то позже распишем

TmyProc =procedure(S:TWaitWin);

//function DoProgress(proc:TMyProc):boolean; в соответствии с 12 постом

TWaitWin = class(TForm)
 ProgressBar: TProgressBar;
 CancelBtn: TButton;
 procedure CancelBtnClick(Sender: TObject);
private
 Process:TMyProc;
 Thread:TMyThread;
 function term:boolean;
 function GetProgres:integer;
 procedure PutProgres(s:integer);
 function GetMax:integer;
 procedure PutMax(s:integer);
public
 property terminated:boolean read term;
 property Max:integer read GetMax write PutMax;
 property progress:integer read GetProgres write PutProgres;
 constructor CreateADD(Proc:TMyProc);
 destructor destroy; override;
private
 rescode:boolean;  
end;


begin...end   (2005-07-07 13:54:00) [8]

> pasha_golub ©   (07.07.05 13:51) [9]

A forward declaration must be resolved by a defining declaration of the same class within the same type declaration section. In other words, between a forward declaration and its defining declaration, nothing can occur except other type declarations.


SergP.   (2005-07-07 13:54:00) [9]


> pasha_golub ©   (07.07.05 13:51) [9]
> SergP.   (07.07.05 13:45) [7]
> Да, я просто так сказанул. Без мыслей задних.
>
>
> type TWaitWin = class; //объявляем с учетом того, то позже
> распишем
>
> type TmyProc =procedure(S:TWaitWin);
>
> type
> TWaitWin = class(TForm)
> ...
> public
> ...
>   constructor CreateADD(Proc:TMyProc);
> ...
> end;


Так ругается на строчку: type TWaitWin = class;
таким матом:
[Error] Unit2.pas(21): Type 'TWaitWin' is not yet completely defined


pasha_golub   (2005-07-07 13:52:00) [10]

Если уж так, то тогда полностью:


type TWaitWin = class; //объявляем с учетом того, то позже распишем

type TmyProc =procedure(S:TWaitWin);

function DoProgress(proc:TMyProc):boolean;

type
TWaitWin = class(TForm)
  ProgressBar: TProgressBar;
  CancelBtn: TButton;
  procedure CancelBtnClick(Sender: TObject);
private
  Process:TMyProc;
  Thread:TMyThread;
  function term:boolean;
  function GetProgres:integer;
  procedure PutProgres(s:integer);
  function GetMax:integer;
  procedure PutMax(s:integer);
public
  property terminated:boolean read term;
  property Max:integer read GetMax write PutMax;
  property progress:integer read GetProgres write PutProgres;
  constructor CreateADD(Proc:TMyProc);
  destructor destroy; override;
private
  rescode:boolean;  
end;


pasha_golub   (2005-07-07 13:51:00) [11]

SergP.   (07.07.05 13:45) [7]
Да, я просто так сказанул. Без мыслей задних.


type TWaitWin = class; //объявляем с учетом того, то позже распишем

type TmyProc =procedure(S:TWaitWin);

type
TWaitWin = class(TForm)
...
public
...
  constructor CreateADD(Proc:TMyProc);
...
end;


SergP.   (2005-07-07 13:51:00) [12]

I>
> TUser ©   (07.07.05 13:41) [5]
> > SergP.   (07.07.05 13:40) [3]
>
> Полностью приведи сюдя свой код (unterface-секцию)


Непонятно зачем. Ведь я показал в сабжевом посте где у меня проблема. Но если уж нужно то вот:


interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
 TMyThread = class(TThread)
 public
   data:pointer;
   property terminated;
   procedure Execute; override;
   procedure CloseForm(Sender:Tobject);
 end;

type TmyProc =procedure(S:TWaitWin);

function DoProgress(proc:TMyProc):boolean;

type
 TWaitWin = class(TForm)
   ProgressBar: TProgressBar;
   CancelBtn: TButton;
   procedure CancelBtnClick(Sender: TObject);
 private
   Process:TMyProc;
   Thread:TMyThread;
   function term:boolean;
   function GetProgres:integer;
   procedure PutProgres(s:integer);
   function GetMax:integer;
   procedure PutMax(s:integer);
 public
   property terminated:boolean read term;
   property Max:integer read GetMax write PutMax;
   property progress:integer read GetProgres write PutProgres;
   constructor CreateADD(Proc:TMyProc);
   destructor destroy; override;
 private
   rescode:boolean;  
 end;

var
 WaitWin: TWaitWin;

implementation
{$R *.dfm}
...


SergP.   (2005-07-07 13:45:00) [13]


> pasha_golub ©   (07.07.05 13:33) [2]
> Рекурсивное описание типов. [D6, WinME, Win2k]
>
> Не рекурсивное, а forward type declaration.


Ну не правильно назвал...

Но как сделать чтобы работало?

Просто щас под рукой ничего из литературы нет. Только форум....


pasha_golub   (2005-07-07 13:44:00) [14]

TUser ©   (07.07.05 13:40) [4]
Точно, как-то не догадался. :0)


TUser   (2005-07-07 13:41:00) [15]

> SergP.   (07.07.05 13:40) [3]

Полностью приведи сюдя свой код (unterface-секцию)


TUser   (2005-07-07 13:40:00) [16]

> pasha_golub ©   (07.07.05 13:33) [2]

Угу. Типа 'не оформлено' :)


SergP.   (2005-07-07 13:40:00) [17]


> TUser ©   (07.07.05 13:27) [1]
> type
>  TWaitWin = class;
>  TMyProc = дальше как у тебя


[Error] Unit2.pas(21): Type 'TWaitWin' is not yet completely defined


pasha_golub   (2005-07-07 13:33:00) [18]

Рекурсивное описание типов. [D6, WinME, Win2k]

Не рекурсивное, а forward type declaration.


TUser   (2005-07-07 13:27:00) [19]

type
 TWaitWin = class;
 TMyProc = дальше как у тебя


Наверх

Титульная страница Поиск, карта сайта Написать письмо