Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизСоздание конструктора класса Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c