![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access violation... [D7, Win2k]
Patrick © (2006-08-31 11:29:00)Объясните, пожалуйста, такой момент. Фрагмент программы
procedure ...
var a:TSrings;
begin
...
a.Create;
...
a.Append('111'); - после этой строки 'Access violation...'
...
end;
Заранее благодарен.
Loginov Dmitry (2006-09-01 22:22:00) [1]> Ega23 © (01.09.06 13:30) [18]
имхо, для пущей красоты не мешало бы добавить перед abstract ключевое слово virtual, ибоAbstract methods must be virtual or dynamic
Ketmar (2006-09-01 19:57:00) [2]> [17] Barloggg (01.09.06 13:07)
автор, пиши ещё! лучше -- книги.
Anatoly Podgoretsky (2006-09-01 19:32:00) [3]Reindeer Moss Eater © (31.08.06 11:35) [3]
Можно, но надо уметь.
ANB (2006-09-01 13:45:00) [4]
> да, убиваются. в WinNT и выше. в Win9x остаются.
Может лучше Рихтера почитать ?
Ega23 (2006-09-01 13:30:00) [5]
> если объект создать, а потом его приравнять его к nil то
> кто его знает убьется он сам или нет.
Не убъётся.
> хмм... я так спокойно assign'ил поля типа Tstring от одного
> объекта к другому... и даже временный
> var a:Tstrings;...
> объект задавал (правда не создавал) присваиванием от готового
> компонента. (дабы не писать сто раз конструкцию типа form1.
> listbox1. ...)
Именно для этого абстрактные классы и существуют.
type
TGraphicObject=class
protected
procedure Draw(Canvas:TCanvas); abstract;
end;
TLine=class(TGraphicObject)
public
procedure Draw(Canvas:TCanvas); override;
end;
TCircle=class(TGraphicObject)
public
procedure Draw(Canvas:TCanvas); override;
end;
procedure TLine.Draw(Canvas:TCanvas)
begin
With Canvas do
begin
MoveTo(....)
LineTo(....)
end;
end;
procedure TCircle.Draw(Canvas:TCanvas)
begin
With Canvas do
begin
MoveTo(....)
Ellipse(....)
end;
end;
Теперь в основной программе я создаю список GraphItems:TObjectList, а также
по экзепляру (или несколько экземпляров) TLine и TCircle:
GraphItems.Add(TLine.Create) или GraphItems.Add(TCircle.Create)
А теперь внимание: рисуем всё
for i:=0 to GraphItems.Count-1 do
TGraphicObject(GraphItems.Items[i]).Draw(form1.Image1.Canvas)
И для перерисовки уже неважно, линия это, круг или ещё какой-нибудь квадрат. Они все потомки TGraphicObject, а значит у всех есть СВОЯ(!) реализация метода Draw.
Barloggg (2006-09-01 13:07:00) [6]
> ресурсы созданные в рамках некоторо процесса убиваются после
> завершения этого процесса
да, убиваются. в WinNT и выше. в Win9x остаются.
default (2006-09-01 13:06:00) [7]Barloggg (01.09.06 13:00) [11]
какая перезагрузка? ресурсы созданные в рамках некоторо процесса убиваются после завершения этого процесса(файлы созданные естественно не стираются:) и др естественные вещи:) )
Barloggg (2006-09-01 13:03:00) [8]ну на то он и Дельфи, чтобы иметь красивые стены и неявную подчистку хвостов (уж не помню откуда я это вычитал, но автор статьи говорил уверенно).
default (2006-09-01 13:03:00) [9]Barloggg (01.09.06 12:57) [10]
см. литературу по ООП идеологии
присваивать переменной абстрактного класса можно любые объекты классов-наследников от этого абстрактного и работать через эту переменную с ними
StriderMan (2006-09-01 13:02:00) [10]
> Barloggg (01.09.06 13:00) [11]
> протечка? утечка памяти. его к nil то
> кто его знает убьется он сам или нет.
сам не убьется. просто ссылку на него прибьешь, а объект останется.
для убивания объектов существует метод TObject.Free
StriderMan (2006-09-01 13:01:00) [11]
> Barloggg (01.09.06 12:57) [10]
у реальных объектов свойства типа TStrings являются на самом деле его потомками, хотя объявлены как TStrings. А сделано это как раз для того чтобы
> я так спокойно assign'ил поля типа Tstring от одного объекта
> к другому... и даже временный
> var a:Tstrings;...
Barloggg (2006-09-01 13:00:00) [12]протечка? утечка памяти.
если объект создать, а потом его приравнять его к nil то кто его знает убьется он сам или нет.
а если не убьется, то так и будет висеть в оперативке у винды, а потом уйдет в свап файл но до перезагрузки не исчезнет.
Barloggg (2006-09-01 12:57:00) [13]хмм... я так спокойно assign'ил поля типа Tstring от одного объекта к другому... и даже временный
var a:Tstrings;...
объект задавал (правда не создавал) присваиванием от готового компонента. ( дабы не писать сто раз конструкцию типа form1.listbox1. ...)
И я даже прочел что он виртуальный, но насколько я понимаю это значит просто нет большинства методов,и их все в обязательном порядке надо перекрывать у потомков, но сам список-то на месте.
так что почему бы не создать экземляр? но иметь ввиду что он на "ручном управлении".
Джо (2006-09-01 12:44:00) [14]
> Barloggg (01.09.06 12:29) [5]
> а то может быть протечка.
А что это? ;>
Плохиш (2006-09-01 12:38:00) [15]
> default © (01.09.06 12:36) [7]
> меня вот что удивляет
> мы обычно что-то изучая пользуемся чем-то, справкой, книгами
> и тд
Хм, вроде давно здесь обитает, а всё удивляется :-)
default (2006-09-01 12:36:00) [16]меня вот что удивляет
мы обычно что-то изучая пользуемся чем-то, справкой, книгами и тд
неужели там про это не написано?
ведь взял же откуда-то класс TStrings!
Ega23 (2006-09-01 12:31:00) [17]
> надо делать так
> a:=Tstrings.create;
Вот так делать не надо в любом случае. TStrings - абстрактный класс. Я не знаю, можно ли создать его экземпляр (надо проверить), но даже если ты его создашь, то при работе с ним с вероятностью 99.999% нарвёшься на Abstract Error
Barloggg (2006-09-01 12:29:00) [18]а если по русски то вместо
a.create;
надо делать так
a:=Tstrings.create;
и в конце не забыть
a.free;
а то может быть протечка.
Reindeer Moss Eater (2006-08-31 11:36:00) [19]var a : TClassName;
begin
a:= TClassName.Create;
end;
Reindeer Moss Eater (2006-08-31 11:35:00) [20]var a:TSrings;
begin
...
a.Create;
Хоть бы и не абстрактный. Все равно так нельзя.