Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1102150083
Bobby Digital
2004-12-04 11:48
2004.12.19
F1


1-1102402685
stud
2004-12-07 09:58
2004.12.19
текстовый файл


1-1102091894
The Vizit0r!
2004-12-03 19:38
2004.12.19
цикл как процесс


6-1097084387
Stas_on
2004-10-06 21:39
2004.12.19
Как узнать IP компа в сетке из 12+1 компов?


3-1100608109
Tor
2004-11-16 15:28
2004.12.19
из dbf в txt через TADODataSet





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