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

Вниз

Access violation...   Найти похожие ветки 

 
Patrick   (2006-08-31 11:29) [0]

Объясните, пожалуйста, такой момент. Фрагмент программы

procedure ...
var a:TSrings;
begin
...
a.Create;
...
a.Append("111"); - после этой строки "Access violation..."
...
end;

Заранее благодарен.


 
Ega23 ©   (2006-08-31 11:31) [1]

1. TStrings - абстрактный тип, нельзя создать его экземпляр. Создавай, например, TStringList.
2. Процесс создания объектов выглядит следующим образом:
var
list:TstringList

list:=TStringList.Create;
....


 
Ega23 ©   (2006-08-31 11:32) [2]


> абстрактный тип


абстрактный класс, конечно же.


 
Reindeer Moss Eater ©   (2006-08-31 11:35) [3]

var a:TSrings;
begin
...
a.Create;


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


 
Reindeer Moss Eater ©   (2006-08-31 11:36) [4]

var a : TClassName;
begin
a:= TClassName.Create;
end;


 
Barloggg   (2006-09-01 12:29) [5]

а если по русски то вместо
a.create;
надо делать так
a:=Tstrings.create;

и в конце не забыть
a.free;
а то может быть протечка.


 
Ega23 ©   (2006-09-01 12:31) [6]


> надо делать так
> a:=Tstrings.create;


Вот так делать не надо в любом случае. TStrings - абстрактный класс. Я не знаю, можно ли создать его экземпляр (надо проверить), но даже если ты его создашь, то при работе с ним с вероятностью 99.999% нарвёшься на Abstract Error


 
default ©   (2006-09-01 12:36) [7]

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


 
Плохиш ©   (2006-09-01 12:38) [8]


> default ©   (01.09.06 12:36) [7]
> меня вот что удивляет
> мы обычно что-то изучая пользуемся чем-то, справкой, книгами
> и тд

Хм, вроде давно здесь обитает, а всё удивляется :-)


 
Джо ©   (2006-09-01 12:44) [9]


> Barloggg   (01.09.06 12:29) [5]
> а то может быть протечка.

А что это? ;>


 
Barloggg   (2006-09-01 12:57) [10]

хмм... я так спокойно assign"ил поля типа Tstring от одного объекта к другому... и даже временный
var a:Tstrings;...  
объект задавал (правда не создавал) присваиванием от готового компонента. (дабы не писать сто раз конструкцию типа form1.listbox1. ...)
И я даже прочел что он виртуальный, но насколько я понимаю это значит просто нет большинства методов,и их все в обязательном порядке надо перекрывать у потомков, но сам список-то на месте.
так что почему бы не создать экземляр? но иметь ввиду что он на "ручном управлении".


 
Barloggg   (2006-09-01 13:00) [11]

протечка? утечка памяти.
если объект создать, а потом его приравнять его к nil то кто его знает убьется он сам или нет.
а если не убьется, то так и будет висеть в оперативке у винды, а потом уйдет в свап файл но до перезагрузки не исчезнет.


 
StriderMan ©   (2006-09-01 13:01) [12]


> Barloggg   (01.09.06 12:57) [10]

у реальных объектов свойства типа TStrings являются на самом деле его потомками, хотя объявлены как TStrings. А сделано это как раз для того чтобы

> я так спокойно assign"ил поля типа Tstring от одного объекта
> к другому... и даже временный
> var a:Tstrings;...  


 
StriderMan ©   (2006-09-01 13:02) [13]


> Barloggg   (01.09.06 13:00) [11]
> протечка? утечка памяти. его к nil то
> кто его знает убьется он сам или нет.

сам не убьется. просто ссылку на него прибьешь, а объект останется.
для убивания объектов существует метод TObject.Free


 
default ©   (2006-09-01 13:03) [14]

Barloggg   (01.09.06 12:57) [10]
см. литературу по ООП идеологии
присваивать переменной абстрактного класса можно любые объекты классов-наследников от этого абстрактного и работать через эту переменную с ними


 
Barloggg   (2006-09-01 13:03) [15]

ну на то он и Дельфи, чтобы иметь красивые стены и неявную подчистку хвостов (уж не помню откуда я это вычитал, но автор статьи говорил уверенно).


 
default ©   (2006-09-01 13:06) [16]

Barloggg   (01.09.06 13:00) [11]
какая перезагрузка? ресурсы созданные в рамках некоторо процесса убиваются после завершения этого процесса(файлы созданные естественно не стираются:) и др естественные вещи:) )


 
Barloggg   (2006-09-01 13:07) [17]


> ресурсы созданные в рамках некоторо процесса убиваются после
> завершения этого процесса


да, убиваются. в WinNT и выше. в Win9x остаются.


 
Ega23 ©   (2006-09-01 13:30) [18]


> если объект создать, а потом его приравнять его к 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.


 
ANB ©   (2006-09-01 13:45) [19]


> да, убиваются. в WinNT и выше. в Win9x остаются.

Может лучше Рихтера почитать ?


 
Anatoly Podgoretsky ©   (2006-09-01 19:32) [20]

Reindeer Moss Eater ©   (31.08.06 11:35) [3]
Можно, но надо уметь.


 
Ketmar ©   (2006-09-01 19:57) [21]

> [17] Barloggg   (01.09.06 13:07)
автор, пиши ещё! лучше -- книги.


 
Loginov Dmitry ©   (2006-09-01 22:22) [22]

> Ega23 ©   (01.09.06 13:30) [18]


имхо, для пущей красоты не мешало бы добавить перед abstract ключевое слово virtual, ибо Abstract methods must be virtual or dynamic



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

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

Наверх




Память: 0.52 MB
Время: 0.028 c
2-1157548368
svt
2006-09-06 17:12
2006.09.24
Как можно в 20 компонентах edit обнулить text?


2-1157215052
disPATCHer
2006-09-02 20:37
2006.09.24
Проблема с .pas файлом


2-1157106503
lorn
2006-09-01 14:28
2006.09.24
прибавить время к дате


15-1157039421
ArtemESC
2006-08-31 19:50
2006.09.24
html-книга...


1-1155123140
Stanislav
2006-08-09 15:32
2006.09.24
Нажата ли клавиша Shift