Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Вниз

Где найити о 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.009 c
15-1145445477
s_pavell
2006-04-19 15:17
2006.05.14
WAP шифрование


3-1143101953
Пользователь
2006-03-23 11:19
2006.05.14
Развернуть DBGrid


15-1145341091
Сергей И
2006-04-18 10:18
2006.05.14
Использование программы с базой Paradox


1-1144177982
Yozch1
2006-04-04 23:13
2006.05.14
Динамическая загрузка DLL при работе с CD


6-1137772300
Kolya
2006-01-20 18:51
2006.05.14
Дата и время из интернета.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский