![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рекурсивное описание типов. [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 = дальше как у тебя