Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.048 c
6-1130345013
cerber
2005-10-26 20:43
2006.02.05
Как програмно менять MTU


1-1136420119
Piter
2006-01-05 03:15
2006.02.05
Как избавиться от исключения "is specific to a platform"


3-1133813794
makvell
2005-12-05 23:16
2006.02.05
сформировать список...


2-1137705603
Змей
2006-01-20 00:20
2006.02.05
русские или английские буквы в строке?


15-1136960266
ArchValentin
2006-01-11 09:17
2006.02.05
Блин, народ, не могу с Blootuth портом разобраться!