Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка в cоздание своего класса, Создание своего класса 
:(
    Опции темы
blaze
Дата 10.2.2006, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.2.2006

Репутация: нет
Всего: нет



подскажите, в чем ошибка? Создаю свой класс, например в модуле Unit2

Код

TMyClass = class
private
 FData:integer;
public
 Data:integer read FData write FData;
end;


Потом ссылаюсь на этот класс из другого модуля, наприме Unit1, где у меня на нажатие кнопки вызывается

v.data:=123; где v - глобальная переменная в этом модуле тип ее - TMyClass;

После этого события выскакивает Access Violation; Cannot write at adress .....;

Нет Вы не поняли, ошибка возникает при попытке присвоения v.Data:=123
CANNOT WRITE AT ADRESS

Это сообщение отредактировал(а) Girder - 16.2.2006, 10:45
PM MAIL   Вверх
CaNIBaLchik
Дата 10.2.2006, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 8.2.2006
Где: Томск

Репутация: нет
Всего: нет



забыл наверное

v:=TMyClass.Create;
PM MAIL ICQ   Вверх
Bog d`An
Дата 10.2.2006, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



после работы тоже неплохо бы освободить память...
Код

...
v.free;
v:=nil;


--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Bose
Дата 10.2.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



Цитата(Bog d`An @ 10.2.2006, 08:44 Найти цитируемый пост)

...
v.free;
v:=nil;


Код

freeandnil(v);

PM MAIL WWW Skype   Вверх
Bog d`An
Дата 10.2.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



шо в лоб, шо по лбу
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
CaNIBaLchik
Дата 13.2.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 8.2.2006
Где: Томск

Репутация: нет
Всего: нет



ага а также destroy
можно dispose тоже сработает smile
PM MAIL ICQ   Вверх
Bog d`An
Дата 13.2.2006, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



в литературе рекомендуют использовать free
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
CaNIBaLchik
Дата 13.2.2006, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 8.2.2006
Где: Томск

Репутация: нет
Всего: нет



только потому что перед destroy там идет проверка на nil
PM MAIL ICQ   Вверх
s-r
Дата 31.5.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



у меня аналогичная ситуация

Код

...
TCirc = class
  private
    cx:integer;
    cy:integer;
    crad:integer;
  public
    procedure SetXY(x: integer; y:integer);
  end;
...
implementation

procedure TCirc.SetXY(x: integer; y:integer);
begin
   cx:=x;  cy:=y;
end;
...




В обработчике по клику:


Код

procedure TForm1.FormClick(Sender: TObject);
var cr:TCirc;
begin
  cr.SetXY(34,34);
end;


код отрабатывает, но после закрытия формы вываливается исключение..

проблема решилась так

Код

procedure TForm1.FormClick(Sender: TObject);
var cr:TCirc;
begin
  cr:=TCirc.Create;
  cr.SetXY(34,34);
end;


Может поскажите какая разница между cr.Create и  cr:=TCirc.Create?
и зачем это нужно делать, и почему если это не сделать возникает ошибка... 

прошу прощения если задаю глупые вопросы

Это сообщение отредактировал(а) s-r - 31.5.2007, 08:23
PM MAIL   Вверх
Yanis
Дата 31.5.2007, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(s-r @  31.5.2007,  09:21 Найти цитируемый пост)
Может поскажите какая разница между cr.Create и  cr:=TCirc.Create?
и зачем нужно делать, и почему если это не сделать возникает ошибка... 

А такая, что кодом cr.Create ты пытаешься обратиться к свойству объекта который не существует. А кодом cr:=TCirc.Create ты выделяешь память под экземпляр класса TCirc и назначаешь указатель на эту память переменной cr (cr суть указатель).
А зачем так делать, так это ты у борланда спроси. Они так придумали.
Хотя мне такой принцип кажется логичным и прозрачным smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 31.5.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



можно написать так:
Код

with TCirc.Create do
  SetXY(34, 34 )


хм... как интересно получается... вроде как нельзя обращаться к объекту, который еще не создан.
но ведь такой код является верным:
Код

var
  lObj: TObject;
begin
...
  lObj := nil;
...
  lObj.Free;
...

т.е. во Free произойдет проверка Self <> nil  и выход.
но ведь объект еще не создан/уже разрушен....
или TObject весь такой особенный, что позволяет это делать. или если нет обращения к внутренним полям класса, то вызов методов несозданного объекта все-таки возможен? )))

Это сообщение отредактировал(а) MetalFan - 31.5.2007, 08:39


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Yanis
Дата 31.5.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(MetalFan @  31.5.2007,  09:38 Найти цитируемый пост)
 lObj := nil;
...
  lObj.Free;

Должна быть ошибка smile

Цитата(MetalFan @  31.5.2007,  09:38 Найти цитируемый пост)
т.е. во Free произойдет проверка Self <> nil  и выход.
но ведь объект еще не создан/уже разрушен....
или TObject весь такой особенный, что позволяет это делать. или если нет обращения к внутренним полям класса, то вызов методов несозданного объекта все-таки возможен? )))

Да, он такой особенный ;)
Не помню как точно называется.
Классовые методы или что то подобное.
Они объявляются так:
Код
class function ClassName: ShortString;

т.е. её можно вызывать без выделения памяти под экземпляр:
Код
  ShowMessage(TObject.ClassName);
  // или
  ShowMessage(c.ClassName);


Вот так работает Create.

Добавлено @ 08:47
Для тех, кто в танке:
Цитата(Help)
Class Methods 
Most methods are called instance methods, because they operate on an individual instance of an object. A class method is a method (other than a constructor) that operates on classes instead of objects. There are two types of class methods: ordinary class methods and class static methods.
 
Ordinary Class Methods 
The definition of a class method must begin with the reserved word class. For example,
Код
 type 
  TFigure = class 
  public 
     class function Supports(Operation: string): Boolean; virtual; 
     class procedure GetInfo(var Info: TFigureInfo); virtual; 
     ... 
  end;
The defining declaration of a class method must also begin with class. For example,
 class procedure TFigure.GetInfo(var Info: TFigureInfo); 
begin 
    ... 
end;

In the defining declaration of a class method, the identifier Self represents the class where the method is called (which could be a descendant of the class in which it is defined). If the method is called in the class C, then Self is of the type class of C. Thus you cannot use the Self to access instance fields, instance properties, and normal (object) methods, but you can use it to call constructors and other class methods, or to access class properties and class fields.
 
A class method can be called through a class reference or an object reference. When it is called through an object reference, the class of the object becomes the value of Self.
 
Class Static Methods 
Like class methods, class static methods can be accessed without an object reference. Unlike ordinary class methods, class static methods have no Self parameter at all. They also cannot access any instance members. (They still have access to class fields, class properties, and class methods.) Also unlike class methods, class static methods cannot be declared virtual. 
Methods are made class static by appending the word static to their declaration, for example 
Код
type
   TMyClass = class
     strict private
       class var
       FX: Integer;
         
     strict protected
    
       // Note: accessors for class properties must be declared class static.
       class function GetX: Integer; static;
       class procedure SetX(val: Integer); static;

     public
       class property X: Integer read GetX write SetX;
       class procedure StatProc(s: String); static;
   end;



Like a class method, you can call a class static method through the class type (i.e. without having an object reference), for example
Код
 TMyClass.X := 17;
TMyClass.StatProc('Hello');


Это сообщение отредактировал(а) Yanis - 31.5.2007, 08:49


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 31.5.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Free - это не class procedure.... только что посмотрел)
но вызов Free без дополнительной проверки на nil возможен и не приводит к AV....

Это сообщение отредактировал(а) MetalFan - 31.5.2007, 08:53


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Yanis
Дата 31.5.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(MetalFan @  31.5.2007,  09:53 Найти цитируемый пост)
но вызов Free без дополнительной проверки на nil возможен и не приводит к AV....

Ага.
По всей видимости ошибка начинает возникать после того как в методе начинается работа с переменными класса. Если таковых нет, то всё работает smile
Код
type
  myc = class
    function add(x, y: Integer): Integer;
    function _Div(x, y: Integer): Integer;
  end;

function myc.add(x, y: Integer): Integer;
begin
  Result := x + y;
end;

function myc._Div(x, y: Integer): Integer;
begin
  Result := x div y;
end;

{ … }

var
  c: myc;
begin
  ShowMessage(IntToStr(c.add(1, 2)));
end;


Это сообщение отредактировал(а) Yanis - 31.5.2007, 09:34


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 31.5.2007, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



мда.. а зачем тогда Class functions?... может отдельную тему сказать, вдруг мастера знают секрет этого фокуса? )))


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1824 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.