Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

Рекурсивное описание типов.   Найти похожие ветки 

 
SergP.   (2005-07-07 13:25) [0]

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


type TmyProc =procedure(S:TWaitWin);

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


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

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


 
TUser ©   (2005-07-07 13:27) [1]

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


 
pasha_golub ©   (2005-07-07 13:33) [2]

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

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


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


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


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


 
TUser ©   (2005-07-07 13:40) [4]

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

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


 
TUser ©   (2005-07-07 13:41) [5]

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

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


 
pasha_golub ©   (2005-07-07 13:44) [6]

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


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


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


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

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

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


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

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}
...


 
pasha_golub ©   (2005-07-07 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;


 
pasha_golub ©   (2005-07-07 13:52) [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;


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


> 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


 
begin...end ©   (2005-07-07 13:54) [12]

> 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.


 
pasha_golub ©   (2005-07-07 13:56) [13]

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;


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

Прочитал 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


 
begin...end ©   (2005-07-07 14:03) [15]

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

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


 
Digitman ©   (2005-07-07 14:05) [16]

type

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

!!!!


 
pasha_golub ©   (2005-07-07 14:11) [17]

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


 
icWasya ©   (2005-07-07 14:56) [18]

короче...
незавершённые объявления типов -
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;


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.088 c
6-1113413845
Дельфин
2005-04-13 21:37
2005.07.25
Интернетовский IP-адрес


1-1120502053
Гаврилов В.А.
2005-07-04 22:34
2005.07.25
Возможно ли передать данные из listview в exsel


9-1113213994
Goorus
2005-04-11 14:06
2005.07.25
Моделирование поворота


1-1120677761
vova3085
2005-07-06 23:22
2005.07.25
поиск в ListBox


14-1120493138
YurikGL
2005-07-04 20:05
2005.07.25
The Hello World Collection