Главная страница
    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.5 MB
Время: 0.04 c
3-1153467923
RomanH
2006-07-21 11:45
2006.09.24
Столбец-массив в IB


2-1157092512
worldmen
2006-09-01 10:35
2006.09.24
Ошибва в модуле.


15-1157363915
umbra
2006-09-04 13:58
2006.09.24
Линукс. Как из tar-фрхива извлечь конкретный файл/каталог?


6-1146653311
Vitaliy
2006-05-03 14:48
2006.09.24
Проверить FTP соединение


2-1157293093
AlexanderMS
2006-09-03 18:18
2006.09.24
Определние файла наименьшего размера.





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