Текущий архив: 2006.02.05;
Скачать: CL | DM;
Вниз
Использование дочерних классов Найти похожие ветки
← →
Bratskiy © (2006-01-16 04:50) [0]Привет мастера, скорей всего вопрос очень глупый, но всё же. Я создал класс TNewsJournal, потом в том же модуле создал класс дочерний к нему TNewsLent, как сделать так, чтобы я мог использовать конструкцию вида NewsJournal1.NewsLent1
← →
Fay © (2006-01-16 05:31) [1]2 Bratskiy © (16.01.06 4:50)
необходимо и достаточно, чтобы NewsLent1 был(а) членом класса TNewsJournal.
← →
Bratskiy © (2006-01-16 05:54) [2]Я описываю в секции Private переменную FNewsLent: TNewsLent, за тем в секции Public property NewsLeny: TNewsLent read FNewsLent write FNewsLent но компилятор выдаёт ошибку
← →
Джо © (2006-01-16 06:10) [3]> но компилятор выдаёт ошибку
Ее текст не является государственной тайной? Его можно озвучить? ;)
← →
Bratskiy © (2006-01-16 06:29) [4]Declaration of "TNewsLent" differs from the previos declaration
Undeclared identifier "TNewsLent"
Identifier redeclared "TNewsLent"
- список ошибок которые выскаивают, как я понял, я не правильно описал классы вот как у меня:
type
TNewsJournal = class(TWordDocument)
private
FNLent:TNewsLent;
protected
public
property MyNewsLent:TNewsLent read FNLent write FNNLent;
published
{ Published declarations }
end;
TNewsLent = class(TNewsJournal)
private
protected
public
end;
← →
ЮЮ © (2006-01-16 07:58) [5]А ты ничего не напутал в своей иерархии?
А то у тебя будет возможно и такое:
NewsJournal1.NewsLent.NewsLent.NewsLent....
и так сколь угодно, т.к TNewsLent наследуется от TNewsJournal, который содерхит в себе экземпляр TNewsLent
Declaration of "TNewsLent" differs from the previos declaration
Undeclared identifier "TNewsLent"
Identifier redeclared "TNewsLent"
Похоже, где-то есть ещёб неприведенное тобой, описание TNewsLent
← →
gdaujk © (2006-01-16 08:43) [6]Допиши
TNewsLent = class;
перед объявлением TNewsJournal. Это скорее всего решит твою проблему:
Declaration of "TNewsLent" differs from the previos declaration
Undeclared identifier "TNewsLent"
Identifier redeclared "TNewsLent"
PS: Только с иерархией точно надо разобраться...
← →
Bratskiy © (2006-01-16 08:46) [7]У меня так
unit NewsJournal;
interface
uses
SysUtils, Classes, OleServer, WordXP, DMod, Controls;
type
TNewsJournal = class(TWordDocument)
private
{ Private declarations }
FId: integer;
FEMail, FName, FDir: string;
FChaptFont, FNewsFont, FCommentFont: TFnt;
FNotClear: boolean;
FNLent:TNewsLent; //здесь ошибка Undeclared identifier "TNewsLent"
function GetDateFromFileName(fn: string; jor_id:integer):TDateTime;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
property Id: integer read FId write FId;
property Name: string read FName write FName;
property EMail: string read FEMail write FEMail;
property Dir: string read FDir write FDir;
property ChaptFont:TFnt read FChaptFont write FChaptFont;
property NewsFont:TFnt read FNewsFont write FNewsFont;
property CommentFont:TFnt read FCommentFont write FCommentFont;
property NotClear:boolean read FNotClear write FNotClear default false;
procedure Get(iden: integer);
procedure FillNewsLentBase;
published
{ Published declarations }
end;
TNewsLent = class(TNewsJournal) //а здесь ошибка Identifier redeclared "TNewsLent"
private
FId_:integer;
FJId: integer;
FFileSource: string;
FDate: TDateTime;
protected
public
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
property Id: integer read FId_ write FId_;
property JId: integer read FJId write FJId;
property FileSource: string read FFileSource write FFileSource;
property Date: TDateTime read FDate write FDate;
procedure Init(Iden: integer);
end;
procedure Register;
implementation
Процедуры и функции класса TNewsLent, которые работают нормально
procedure TNewsLent.Init(Iden: integer);//и здесь такая же ошибка Identifier redeclared "TNewsLent"
begin
if DModule.NDS.DataSet.Locate("Id",Iden,[]) then
begin
FFileSource:=DModule.NDS.DataSet.Fields.Fields[1].AsString;
FDate:=DModule.NDS.DataSet.Fields.Fields[2].AsDateTime;
FJId:=DModule.NDS.DataSet.Fields.Fields[3].AsInteger;
end;
end;
procedure Register;
begin
RegisterComponents("Standard", [TNewsJournal]);
end;
end.
Ещё вылазят ошибки Undeclared identifier "FFileSource" "FDate" "FGid"
← →
gdaujk © (2006-01-16 09:02) [8]>Bratskiy © (16.01.06 08:46) [7]
См. gdaujk © (16.01.06 08:43) [6]...
PS: Повторение - мать учения... и заикания...
← →
Bratskiy © (2006-01-16 09:10) [9]Дописал
TNewsLent = class
Запустилось
Только теперь возникла другая проблема: программа останавливается из-за ошибки. Запустил по шагам получилось что на строчкеFFileSource:=DModule.NDS.DataSet.Fields.Fields[1].AsString
Всплывает FFileSource = inaccesible value, хотя когда наводишь на AsString
всплывает DModule.NDS.DataSet.Fields.Fields[1].AsString = "121205.doc"
Аналогичный метод у класса TNewsJournal работает нормально
← →
evvcom © (2006-01-16 09:24) [10]
> программа останавливается из-за ошибки.
Текст ошибки - опять государственная тайна?
> Аналогичный метод у класса TNewsJournal работает нормально
Какой аналогичный? Init? Я такого не увидел.
← →
gdaujk © (2006-01-16 09:39) [11]>Bratskiy © (16.01.06 09:10) [9]
Перед вызовом Init, как и др. прцедур, должен быть вызван конструктор класса TNewsLent. Возможно ошибка в этом...
PS: согласен с evvcom © (16.01.06 09:24) [10]
← →
Bratskiy © (2006-01-16 10:01) [12]Метод аналогичный методу Init класса TNewsJournal у меня называется Get
procedure TNewsJournal.Get(iden: integer);
begin
if DModule.JDS.DataSet.Locate("Id",iden,[]) then
begin
FId:=DModule.JDS.DataSet.Fields.Fields[0].AsInteger;
FName:=DModule.JDS.DataSet.Fields.Fields[1].AsString;
FEMail:=DModule.JDS.DataSet.Fields.Fields[2].AsString;
FDir:=DModule.JDS.DataSet.Fields.Fields[4].AsString;
FNotClear:=true;
end;
end;
Он работает у меня нормально
По поводу текста ошибки:
Если использую конструктор nl.Create(self), где nl:TNewsLent,
текст такой:
raise exeption class EStackOverflow with message "StaclOverFlow"
если без конструктора, то:
raise exeption class EAccessViolation with message "AccessViolation" at address 0040405C
← →
evvcom © (2006-01-16 10:07) [13]
> Если использую конструктор nl.Create(self), где nl:TNewsLent,
Ты так используешь конструктор???? Обалдеть!nl := TNewsLent.Create(self);
!
← →
Bratskiy © (2006-01-16 10:14) [14]Я пока только учусь, это моя первая "серьёзная" программа.
Попробовал:nl := TNewsLent.Create(self);
Вышло:
with message "AccessViolation" at address 0040405C
То есть тоже самое, что и без конструктора, даже адрес тот же.
← →
evvcom © (2006-01-16 10:24) [15]
> with message "AccessViolation" at address 0040405C
И что? Я теперь должен угадать какой строке программы соответствует адрес 0040405C? У тебя там ошибка.
← →
Плохиш © (2006-01-16 10:40) [16]
> Bratskiy © (16.01.06 10:14) [14]
Что ж, начнём телепатировать:
Свойство FNLent в объекте TNewsJournal не создано.
← →
Bratskiy © (2006-01-16 10:46) [17]Ура заработало! Всё верно надо было грамотно использовать конструктор
Ошибка была наитупейшая, мне прям стыдно. Было такnl := TNewsLent.Create(self);
а после этогоNewsJournal1.NLent.Init(2);
Невнимательность - это жутко
Спасибо всем огромное за терпение!!!
← →
umbra © (2006-01-16 10:46) [18]2 Bratskiy © (16.01.06 10:14) [14]
для всех будет проще, если Вы дадите код конструкторовTNewsJournal
иTNewsLent
← →
evvcom © (2006-01-16 10:52) [19]
> а после этого
> NewsJournal1.NLent.Init(2);
1. Что такое NLent? Нет такого (я не увидел). FNLent вижу.
2. Если этот код выполняется в методе класса TNewsJournal, то убирай на фиг этот NewsJournal1!
← →
Bratskiy © (2006-01-16 11:06) [20]NLent - это свойство класса TNewsJournal типа TNewsLent (или член класса, не знаю как правильно назвать), описано у меня так
property NLent: TNewsLent read FNLent write FNLent;
КонструкцияNewsJournal1.NLent.Init(2);
у меня была и из-за неё были ошибки
Я её убрал и вместо неё написал:
nl:=TNewsLent.Create(self);
nl.Init(2);
И после этого всё заработало
← →
evvcom © (2006-01-16 11:58) [21]
> property NLent: TNewsLent read FNLent write FNLent;
Я догадался. Но объявление это появилось только в [20], а я о "нет такого" говорил в [19]. Будьте последовательны.
> Конструкция
> NewsJournal1.NLent.Init(2);
> у меня была и из-за неё были ошибки
> Я её убрал и вместо неё написал:
>
> nl:=TNewsLent.Create(self);
> nl.Init(2);
Что такое nl? В смысле где она описана? Нафига тогда FNLent? Опять нам гадать? Учись последовательно излагать свои мысли. Если ввел какую-то переменную, укажи не только ее тип, но и место ее декларации. То ли это поле класса, то ли это глобальная переменная, то ли это локальная переменная? От этого тоже очень многое зависит.
← →
gdaujk © (2006-01-16 15:19) [22]Говорил же, дело в конструкторах...
Страницы: 1 вся ветка
Текущий архив: 2006.02.05;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.142 c