Главная страница
    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.51 MB
Время: 0.142 c
15-1136987409
syte_ser78
2006-01-11 16:50
2006.02.05
посоветуйте как быть


2-1137461267
Kostik
2006-01-17 04:27
2006.02.05
Функция перевода строки из русской в английскую и наоборот.


1-1136375612
TBeginner
2006-01-04 14:53
2006.02.05
Как отменить закрытие программы?


2-1137268104
Bopros
2006-01-14 22:48
2006.02.05
Обработка исключительных ситуаций без SysUtils


2-1137615749
medvedenator
2006-01-18 23:22
2006.02.05
Системный реестр, НУЖНА СРОЧНО ПОМОЩЬ!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский