Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.012 c
8-1111865107
seregka
2005-03-26 22:25
2005.07.25
TMemoryStream и bitmap


1-1120926660
Michael5
2005-07-09 20:31
2005.07.25
Подскажите, как код разнести по разным файлам (Unit ам)?


14-1117805628
12DFBDDh
2005-06-03 17:33
2005.07.25
Соревнование!!!!


4-1117218902
JagaJiga
2005-05-27 22:35
2005.07.25
Обвести кнопку на тулбаре чужого окна при наведении мышью


14-1120391464
ArMellon
2005-07-03 15:51
2005.07.25
php





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский