Форум: "Начинающим";
Текущий архив: 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