![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование дочерних классов
Bratskiy © (2006-01-16 04:50:00)Привет мастера, скорей всего вопрос очень глупый, но всё же. Я создал класс TNewsJournal, потом в том же модуле создал класс дочерний к нему TNewsLent, как сделать так, чтобы я мог использовать конструкцию вида NewsJournal1.NewsLent1
gdaujk (2006-01-16 15:19:00) [1]Говорил же, дело в конструкторах...
evvcom (2006-01-16 11:58:00) [2]
> property NLent: TNewsLent read FNLent write FNLent;
Я догадался. Но объявление это появилось только в [20], а я о "нет такого" говорил в [19]. Будьте последовательны.
> Конструкция
> NewsJournal1.NLent.Init(2);
> у меня была и из-за неё были ошибки
> Я её убрал и вместо неё написал:
>
> nl:=TNewsLent.Create(self);
> nl.Init(2);
Что такое nl? В смысле где она описана? Нафига тогда FNLent? Опять нам гадать? Учись последовательно излагать свои мысли. Если ввел какую-то переменную, укажи не только ее тип, но и место ее декларации. То ли это поле класса, то ли это глобальная переменная, то ли это локальная переменная? От этого тоже очень многое зависит.
Bratskiy (2006-01-16 11:06:00) [3]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 10:52:00) [4]
> а после этого
> NewsJournal1.NLent.Init(2);
1. Что такое NLent? Нет такого (я не увидел). FNLent вижу.
2. Если этот код выполняется в методе класса TNewsJournal, то убирай на фиг этот NewsJournal1!
umbra (2006-01-16 10:46:00) [5]2 Bratskiy © (16.01.06 10:14) [14]
для всех будет проще, если Вы дадите код конструкторовTNewsJournalиTNewsLent
Bratskiy (2006-01-16 10:46:00) [6]Ура заработало! Всё верно надо было грамотно использовать конструктор
Ошибка была наитупейшая, мне прям стыдно. Было так
nl := TNewsLent.Create(self);
а после этого
NewsJournal1.NLent.Init(2);
Невнимательность - это жутко
Спасибо всем огромное за терпение!!!
Плохиш (2006-01-16 10:40:00) [7]
> Bratskiy © (16.01.06 10:14) [14]
Что ж, начнём телепатировать:
Свойство FNLent в объекте TNewsJournal не создано.
evvcom (2006-01-16 10:24:00) [8]
> with message 'AccessViolation' at address 0040405C
И что? Я теперь должен угадать какой строке программы соответствует адрес 0040405C? У тебя там ошибка.
Bratskiy (2006-01-16 10:14:00) [9]Я пока только учусь, это моя первая "серьёзная" программа.
Попробовал:
nl := TNewsLent.Create(self);
Вышло:
with message 'AccessViolation' at address 0040405C
То есть тоже самое, что и без конструктора, даже адрес тот же.
evvcom (2006-01-16 10:07:00) [10]
> Если использую конструктор nl.Create(self), где nl:TNewsLent,
Ты так используешь конструктор???? Обалдеть!
nl := TNewsLent.Create(self);!
Bratskiy (2006-01-16 10:01:00) [11]Метод аналогичный методу 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
gdaujk (2006-01-16 09:39:00) [12]>Bratskiy © (16.01.06 09:10) [9]
Перед вызовом Init, как и др. прцедур, должен быть вызван конструктор класса TNewsLent. Возможно ошибка в этом...
PS: согласен с evvcom © (16.01.06 09:24) [10]
evvcom (2006-01-16 09:24:00) [13]
> программа останавливается из-за ошибки.
Текст ошибки - опять государственная тайна?
> Аналогичный метод у класса TNewsJournal работает нормально
Какой аналогичный? Init? Я такого не увидел.
Bratskiy (2006-01-16 09:10:00) [14]Дописал
TNewsLent = class
Запустилось
Только теперь возникла другая проблема: программа останавливается из-за ошибки. Запустил по шагам получилось что на строчке
FFileSource:=DModule.NDS.DataSet.Fields.Fields[1].AsString
Всплывает FFileSource = inaccesible value, хотя когда наводишь на AsString
всплывает DModule.NDS.DataSet.Fields.Fields[1].AsString = '121205.doc'
Аналогичный метод у класса TNewsJournal работает нормально
gdaujk (2006-01-16 09:02:00) [15]>Bratskiy © (16.01.06 08:46) [7]
См. gdaujk © (16.01.06 08:43) [6]...
PS: Повторение - мать учения... и заикания...
Bratskiy (2006-01-16 08:46:00) [16]У меня так
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 08:43:00) [17]Допиши
TNewsLent = class;
перед объявлением TNewsJournal. Это скорее всего решит твою проблему:
Declaration of 'TNewsLent' differs from the previos declaration
Undeclared identifier 'TNewsLent'
Identifier redeclared 'TNewsLent'
PS: Только с иерархией точно надо разобраться...
ЮЮ (2006-01-16 07:58:00) [18]А ты ничего не напутал в своей иерархии?
А то у тебя будет возможно и такое:
NewsJournal1.NewsLent.NewsLent.NewsLent....
и так сколь угодно, т.к TNewsLent наследуется от TNewsJournal, который содерхит в себе экземпляр TNewsLent
Declaration of 'TNewsLent' differs from the previos declaration
Undeclared identifier 'TNewsLent'
Identifier redeclared 'TNewsLent'
Похоже, где-то есть ещёб неприведенное тобой, описание TNewsLent
Bratskiy (2006-01-16 06:29:00) [19]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 06:10:00) [20]> но компилятор выдаёт ошибку
Ее текст не является государственной тайной? Его можно озвучить? ;)