Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Access violation... [D7, Win2k]


Страницы:   1 2

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;


Хоть бы и не абстрактный. Все равно так нельзя.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо