Форум: "Основная";
Текущий архив: 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