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

Вниз

Создание конструктора класса   Найти похожие ветки 

 
Andrick ©   (2004-12-05 17:07) [0]

Знаю, что вопрос странный, но мне действительно за все практику не приходилось создавать собственные классы почти с нуля :(((
В общем, трабл следующий. Есть некий класс, порожденный от TObject. В этом классе, как и положено, создается конструктор и все дела. Выглядит это так -
type TMyClass = class (TObject)
    StringList1: TStrings;
    StringList2: TStrings;
    // ну, и всякие прочие описания, включая пресловутый
    // конструктор
    end;

И эти самые стринглисты надо в конструкторе создать.
Constructor TMyClass.Create;
begin
 inherited Create;
 StringList1 := TStrings.Create; // И в этом месте вылетаем
 StringList2 := TStrings.Create  // по access violation
end;

Вместо TStrings использовались всякие другие классы вплоть до TIniFile с точно тем же результатом, то есть ошибка "глобальная".
Чего делается неправильно? Может, надо переменным память отводить? Или еще какие тонкости?


 
begin...end ©   (2004-12-05 17:22) [1]

> Andrick ©   (05.12.04 17:07)

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


 
TButton ©   (2004-12-05 17:44) [2]

странно. я как правило
> inherited Create;
не вызываю. я поступаю не правильно? *работает безбагово*


 
default ©   (2004-12-05 17:48) [3]

TButton ©   (05.12.04 17:44) [2]
правильно
только inherited делать дальновиднее, вдруг в будущих версиях туда в TObject.Create что допишут


 
begin...end ©   (2004-12-05 17:51) [4]

> [2] TButton ©   (05.12.04 17:44)

> *работает безбагово*

...пока Борланд ничего не добавил в конструктор TObject.


 
novice__man   (2004-12-05 17:51) [5]


StringList1 := TStrings.Create; // И в этом месте вылетаем
StringList2 := TStrings.Create  // по access violation


В хелпе дельфи есть пример для TStrigns.

Вызови так и все у вас получится, ненадо использовать абстрактный класс ;)
StringList1 := TStringList.Create


 
default ©   (2004-12-05 17:52) [6]

по сабжу тоже ошибок не вижу
покажите как вызываете


 
begin...end ©   (2004-12-05 17:56) [7]

> [5] novice__man   (05.12.04 17:51)

Если просто создать TStrings, то ошибки не будет.


 
novice__man   (2004-12-05 18:09) [8]

begin...end ©   (05.12.04 17:56) [7]
Читаем короткую выдержку из описания:

Многофункциональный класс, предназначенный для хранения текстовых строк и связанных с ними объектов (любых потомков TObject). TStrings — абстрактный класс; он только описывает методы работы с наборами строк и сопутствующих им объектов, но как именно они хранятся, на его уровне не определено. Его потомки очень многочисленны; они играют основную роль в компонентах-списках (TListBox, TComboBox), редакторе (TMemo) и других. Так что вам чаще всего придется иметь дело с TStrings как со свойством одного из компонентов. В дальнейшем экземпляры этого класса и порожденных от него классов мы-будем называть наборами строк. Для создания собственных наборов строк вне компонентов предназначен потомок TStrings — TStringList.

А в принципе вы правы, но попробуйте сразу добавить в переменную (.Add("HELLO")).


 
begin...end ©   (2004-12-05 18:13) [9]

> [8] novice__man   (05.12.04 18:09)

Это всё понятно, просто автор вопроса сообщает, что у него ошибка уже при создании, так что дело в чём-то другом.


 
novice__man   (2004-12-05 18:17) [10]

У меня при первом знакомстве так же было, покапался в хелпе и стех пор все нормально.


 
novice__man   (2004-12-05 18:22) [11]

Пусть присылает текст с объявлением конструктора и реаизацией.
Copy & Past!


 
TButton ©   (2004-12-05 18:24) [12]


> автор вопроса сообщает, что у него ошибка уже при создании

более того, автор сообщает что

> Вместо TStrings использовались всякие другие классы вплоть
> до TIniFile с точно тем же результатом, то есть ошибка "глобальная".


 
novice__man   (2004-12-05 18:33) [13]

unit MyTest;

interface

uses
 Windows, Messages, SysUtils, Classes;

type
 TMyTestObject = class(TObject)
 private
   { Private declarations }
   fList: TStrings;
 protected
   { Protected declarations }
 public
   { Public declarations }
   constructor Create;
 published
   { Published declarations }
 end;

implementation

{ TMyTestObject }

constructor TMyTestObject.Create;
begin
 inherited;
 fList := TStrings.Create;
end;

Проверил работает. Видимо как там говорится: "ошибка в 17-ой строке"


 
ЮЮ ©   (2004-12-06 05:17) [14]

>И в этом месте вылетаем

Ошибки в конструкторе чаще всего возникают при таком вызове конструктора:

var
 mc: TMyClass;
begin
 mc.Create;


 
novice__man   (2004-12-06 05:24) [15]

Зря мы тут разволновались, автора вопроса давно уже тут нет. И нафиг ему не нужен наш ответ. ;)


 
Andrick ©   (2004-12-06 07:10) [16]

Есть, есть, не надейтесь. Просто у меня на тот момент времени было уже десять вечера
В общем, опробую предложенный вариант и вечером сообщу. Сейчас на работе и исходников нет


 
novice_man ©   (2004-12-06 07:15) [17]

Обязательно сообщите, интересно почему у вас есть ошибка, а я так и недобился! ;(
Врага нужно знать в лицо!! Переврал но точно.


 
Andrick ©   (2004-12-06 07:40) [18]

Не удержался и проверил сейчас. Результат тот же.
Конструктор действительно вызывается через

> Ошибки в конструкторе чаще всего возникают при таком вызове
> конструктора:
>
> var
>  mc: TMyClass;
> begin
>  mc.Create;

Так вызывается базовый конструктор TMyClass
Но забыл сказать, что ошибка возникает только в ран-тайм, а не при компиляции. Пробовал выносить переменные во все секции - без толку. От одного варианта ошибки избавился выносом объявления переменной класса за пределы класса, нужная переменная теперь лежит не в членах класса, а отдельно в implementation - в этом случае конструктор отрабатывает без малейших сбоев
Полностью выложить конструктор не могу - извините, top secret


 
ЮЮ ©   (2004-12-06 09:41) [19]

>Конструктор действительно вызывается через Ж@@У :)

Это была показана ошибочная конструкция, котороя и приводит в дальнейшем к АV. Надо писать  mc :=  TMyClass.Create;



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

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

Наверх




Память: 0.51 MB
Время: 0.036 c
3-1101115078
YurikGL
2004-11-22 12:17
2004.12.19
Выборка из процедуры.


1-1101746408
hamster
2004-11-29 19:40
2004.12.19
Turbo pascal - выключение


1-1102057217
denis24
2004-12-03 10:00
2004.12.19
TdateEdit.date


1-1101834140
Gloster
2004-11-30 20:02
2004.12.19
рисование на TCanvas из DLL


6-1096999715
santey
2004-10-05 22:08
2004.12.19
как поменять ip local host