Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Где найити о inherited   Найти похожие ветки 

 
Keks ©   (2006-04-22 23:29) [0]

Добрый вечер. Поскажите пожалуйста где можно почитать о использовании ключевого слова inherited


 
Джо ©   (2006-04-22 23:31) [1]

Как где? Нажимаешь F1 и читаешь.


 
Keks ©   (2006-04-22 23:34) [2]

Это было первое что я сделал но там очень мало


 
Джо ©   (2006-04-22 23:35) [3]

> [2] Keks ©   (22.04.06 23:34)
> Это было первое что я сделал но там очень мало

А что конкретно не ясно с inherited? Если есть какие-то вопросы, лучше их озвучить, глядишь неясность и разьяснят :)


 
Keks ©   (2006-04-22 23:40) [4]

Для чего он вообще используется вот тут например:
Constructor TNotifyThread.Create(APrinter: THandle; AFlags: DWORD);
Begin
FPrinter := APrinter;
FFlags := AFlags;
inherited Create(True);
End;

Destructor TNotifyThread.Destroy;
Begin
 inherited;
End;


 
Джо ©   (2006-04-22 23:46) [5]

Вызывает виртуальный метод (в данном случае, конструктор и деструктор) предка.


 
Джо ©   (2006-04-22 23:48) [6]

TBaseClass = class
 procedure A; virtual;
end;

TChildClass = class (TBaseClass)
 procedure A; override;
end;

procedure TBaseClass.A;
begin
 ShowMessage ("BaseClass.A");
end;

procedure TChildClass.A;
begin
 inherited; // вызовет метод предка
 ShowMessage ("ChildClass.A");
end;



 
Keks ©   (2006-04-22 23:53) [7]

для чего Inherited Create(true)


 
Keks ©   (2006-04-22 23:58) [8]

у меня возникает проблема вот в чем: я вызываю Constructor в цикле для наблюдения за несколькими разными принтерами, а  при событии FormClose в цикле вызываю Destructor но тут же вылетает ошибка Invalid Floating operation


 
Keks ©   (2006-04-22 23:59) [9]

Може ли это возникнуть из-за того что каждый раз конструктор вызывается с разными параметрами


 
Kolan ©   (2006-04-23 00:09) [10]

Keks ©   (22.04.06 23:59) [9]
Трудно понять что происходит нужен код...


 
Keks ©   (2006-04-23 00:18) [11]

могу дать архивчик проекта он маленький


 
Kolan ©   (2006-04-23 00:19) [12]

Keks ©   (23.04.06 00:18) [11]
Архивчик никому не нужОн. Дай участки связаные с проблеммой.


 
Kolan ©   (2006-04-23 00:22) [13]

я вызываю Constructor в цикле для
Уже раз 10 прочитал, но так и не понял. А вы понимаете что делает деструктор ?


 
Джо ©   (2006-04-23 00:29) [14]

> [7] Keks ©   (22.04.06 23:53)
> для чего Inherited Create(true)

Смотри исходный текст предка TNotifyThread. У него должен быть конструктор, принимающий параметр типа Boolean. Вот его-то ты и вызываешь.


 
Keks ©   (2006-04-23 00:29) [15]

Как я понимаю он уничтожает ранее созданные объекты
Вот так я создаю нить для наблюдения в цикле
 FNotifyThread[i] := TNotifyThread.Create(FPrinter1, PRINTER_CHANGE_JOB);

А здесь автоматически в цикле для каждой созданной нити вызывается деструктор
  FreeAndNil(FNotifyThread[i]);

Описание кода деструктора и конструктора я написал выше


 
Джо ©   (2006-04-23 00:31) [16]

> А здесь автоматически в цикле для каждой созданной нити
> вызывается деструктор
>  FreeAndNil(FNotifyThread[i]);

Слушай, приведи описание того, чем является FNotifyThread. И цикл.


 
Leonid Troyanovsky ©   (2006-04-23 00:35) [17]


> Keks ©   (22.04.06 23:40) [4]

> inherited Create(True);


Видимо оный класс наследуется от TThread, тогда этот
вызов создает поток (в приостановленном состоянии).

--
Regards, LVT.


 
Keks ©   (2006-04-23 00:36) [18]

Type
TNotifyThread = class(TThread)
  Private
    FName:string;
    FFinder: THandle;
    FFlags: DWORD;
    FOnNotify: TNotifyEvent;
  protected
    Procedure DoNotify;
    Procedure Execute; override;
  Public
    FPrinter: THandle;
    Constructor Create(APrinter: THandle; AFlags: DWORD);
    Destructor  Destroy; override;
    Property    OnNotify: TNotifyEvent read FOnNotify write FOnNotify;
    Property    Name:string            read FNAme     write Fname;

End;


Procedure TForm1.FormDestroy(SEnder: TObject);
var i: integer;
Begin
for i:=0 to Prn.Count-1 do begin
  FPrinter1:=FNotifyThread[i].FPrinter;
  FreeAndNil(FNotifyThread[i]);
  WinSpool.ClosePrinter(FPrinter1);
end;
End;


 
Джо ©   (2006-04-23 00:37) [19]

> [17] Leonid Troyanovsky ©   (23.04.06 00:35)

Скорее всего так и есть. Также, скорее всего, это вообще не имеет отношение к проблеме. Ибо  FNotifyThread[i] := TNotifyThread.Create(FPrinter1, PRINTER_CHANGE_JOB); наводит на всякие интересные предположения :)


 
Джо ©   (2006-04-23 00:38) [20]

> [18] Keks ©   (23.04.06 00:36)

Да нет, ты не понял. Интересно было бы взглянуть на объявление переменной FNotifyThread, т.е, ее тип.


 
Keks ©   (2006-04-23 00:42) [21]

FNotifyThread: array of TNotifyThread;


 
Kolan ©   (2006-04-23 00:43) [22]

И где возникает Floating point ....ошибка?


 
Keks ©   (2006-04-23 00:46) [23]

Причем если вызвать только один раз конструктор, т.е. наблюдать за одним принтером, а потом вызвать для него деструктор то все нормально проходит.
А вот если подряд уже вызывать несколько конструкторов, то потом при вызове деструктора для каждого из них появляется ошибочка


 
Kolan ©   (2006-04-23 00:49) [24]

А что в десткрукторе?

ЗЫ
Ты отлаживать пробовал я надеюсь...


 
Keks ©   (2006-04-23 00:52) [25]

При первом же вызове деструктора  для первого потока пишет Invalid pointer operation и дальше Access Violeation и т.д.


 
Keks ©   (2006-04-23 00:55) [26]

Вот ксатит относительно отладки у меня маленькая проблемка я никак не могу найти в среде D7 установку что бы он залазил внутрь системных процедур.


 
Kolan ©   (2006-04-23 00:55) [27]

А в деструкторе у тебя ничего? Код его дай.
Пока вроде ошибок нет...


 
Leonid Troyanovsky ©   (2006-04-23 00:57) [28]


> Keks ©   (23.04.06 00:46) [23]

> А вот если подряд уже вызывать несколько конструкторов


Подряд несколько таких вызовов:

FNotifyThread[i] := TNotifyThread.Create(FPrinter1, PRINTER_CHANGE_JOB)?

А FPrinter1 где назначается?

--
Regards, LVT.


 
Keks ©   (2006-04-23 00:57) [29]

А в деструторе вот что:
Destructor TNotifyThread.Destroy;
Begin
 inherited;
End;

Этому как раз и была посвящена тема я думал проблема в этом


 
Kolan ©   (2006-04-23 00:58) [30]

Нет
inherited; - вызовет Деструктор TThread. Проблема не сдесь.
Ты что - то походу делаешь. Память где-то портишь. Возми memProof и посмотри


 
Leonid Troyanovsky ©   (2006-04-23 00:59) [31]


> Keks ©   (23.04.06 00:57) [29]

> Этому как раз и была посвящена тема я думал проблема в этом


Этот деструктор можно было даже не описывать, бо он ничего
сверх родительского не делает.

--
Regards, LVT.


 
Keks ©   (2006-04-23 01:02) [32]

>Leonid Troyanovsky ©   (23.04.06 00:57) [28]
 >Подряд несколько таких вызовов:
 >FNotifyThread[i] := TNotifyThread.Create(FPrinter1, PRINTER_CHANGE_JOB)?
 >А FPrinter1 где назначается?

Да подряд идут именно эти вызовы, а отличаются они как раз переменной FPrinter1 которая предварительно так же в цикле принимает значение из процедуры : WinSpool.OpenPrinter(PChar(Prn[i]), FPrinter1, nil)


 
Keks ©   (2006-04-23 01:06) [33]

Подскажите где в среде D7 есть опция что бы при отладке он залазил не только внутрь моих процедур но и внутрь системных процедур.


 
Kolan ©   (2006-04-23 01:08) [34]

Project - Options - Compiler USE Debug DCUs


 
Johnmen ©   (2006-04-23 01:11) [35]

>Keks ©  

Как выделяется память под динамический массив FNotifyThread ?


 
Keks ©   (2006-04-23 01:17) [36]

Я нашел ошибку но вот почему именно это приводило к проблеме что-то я так и не понял.
Оказывается дело в том что переменную FNotifyThread я описывал как динамический массив( FNotifyThread: array of TNotifyThread;), хотя потом и выделял под нее память функцией SetLength(FNotifyThread,Prn.Count-1);

А когда сделал статический массив ( FNotifyThread: array[0..10] of TNotifyThread;) то все нормально заработало


 
Keks ©   (2006-04-23 01:27) [37]

Може есть другая функция для выделения памяти для динамического массива


 
Johnmen ©   (2006-04-23 01:27) [38]


> Keks ©   (23.04.06 01:17) [36]
>
> Я нашел ошибку но вот почему именно это приводило к проблеме
> что-то я так и не понял.
> Оказывается дело в том что переменную FNotifyThread я описывал
> как динамический массив( FNotifyThread: array of TNotifyThread;
> ), хотя потом и выделял под нее память функцией SetLength(FNotifyThread,
> Prn.Count-1);


Думается, что размер д.б. Prn.Count.


 
Leonid Troyanovsky ©   (2006-04-23 01:27) [39]


> Keks ©   (23.04.06 01:17) [36]

> SetLength(FNotifyThread, Prn.Count-1);


А зачем -1?

--
Regards, LVT.


 
Keks ©   (2006-04-23 01:46) [40]

Дааааааа,  вот что значит писать програмки поздней ночью :)
Блин аш самому обидно что не доглядел. Спасибо за помощь.



Страницы: 1 2 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.038 c
15-1145273982
default
2006-04-17 15:39
2006.05.14
USB-->COM


3-1143026390
Ega23
2006-03-22 14:19
2006.05.14
ADOConnection - проверка коннекта


15-1145513360
Некто
2006-04-20 10:09
2006.05.14
Про соответствие стандарту HTML.


1-1144056863
misha_gr
2006-04-03 13:34
2006.05.14
Вопрос про ресурсы и про курсор (мышиный)


2-1146027625
Hitkliff
2006-04-26 09:00
2006.05.14
Пересохранение файла???