Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.03.2009, 22:44
][enk ][enk вне форума
Прохожий
 
Регистрация: 17.03.2009
Сообщения: 9
Репутация: 10
По умолчанию Обращение к полю класса

Код:
unit Uclss;

interface

uses Dialogs;

type
  TClass = class
  Fstr: String;

  end;

implementation

end.

Код:
unit prjct;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    pB: TButton;
    procedure pBClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TForm1;

implementation

{$R *.dfm}
uses
  Uclss;
var
  Cls: TClass;

procedure TForm1.pBClick(Sender: TObject);
begin
  Cls.Fstr := 'WTF';
end;

end.
Как правильно обращаться к полям?Не ругайте только сильно
Пpoeкт prject.exe вызвaл иcключeниe клacca EAccessViolation c cooбщeниeм 'Access violation at address ... при нажатии на кнопку pB
Ответить с цитированием
  #2  
Старый 17.03.2009, 22:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Нельзя обратиться к полю класса. Можно обратиться к ЭКЗЕМПЛЯРУ клсаа. Проще говоря, надо создать объект нужного класса:

Код:
var
  Cls: TClass;

procedure TForm1.pBClick(Sender: TObject);
begin
  Cls := TClass.Create; // Создаем объект - экземпляр класса
  Cls.Fstr := 'WTF';
  Cls.Free; // Не забываем уничтожить объект после того, как он больше не нужен.
end;
Ответить с цитированием
  #3  
Старый 17.03.2009, 23:09
][enk ][enk вне форума
Прохожий
 
Регистрация: 17.03.2009
Сообщения: 9
Репутация: 10
По умолчанию

Спасибо!
Цитата:
Для уничтожения экземпляра объекта рекомендуется использовать метод
Free, который первоначально проверяет указатель (не равен ли он Nil)
и только затем вызывает Destroy..
Почему при повторном вызове Free получается ошибка если вызову Destroy предшествыет проверка на не NIL?
Ответить с цитированием
  #4  
Старый 17.03.2009, 23:09
][enk ][enk вне форума
Прохожий
 
Регистрация: 17.03.2009
Сообщения: 9
Репутация: 10
По умолчанию

Пример нагугленный:
Цитата:
type

TMyClass = class
FIntField: Integer;
FStrField: String; end;

var

aObject: TMyClass;

begin

aObject.FIntField := 0;
aObject.FStrField := 'Строка символов';
end;
Без aObject:=TMyClass.Create; Не правильный получается?

Последний раз редактировалось ][enk, 17.03.2009 в 23:17.
Ответить с цитированием
  #5  
Старый 18.03.2009, 01:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Пример правильный, просто там подразумевается, что объект создается где-то в другом месте. По поводу второго вызова Free; Ну, после первого вызова объект уже удален, так что ты опять обращаешся к несуществующему объекту. Кстати, при уничтожении объекта указатель на него не становится равным Nil. Вот так вот.
Ответить с цитированием
  #6  
Старый 18.03.2009, 09:09
][enk ][enk вне форума
Прохожий
 
Регистрация: 17.03.2009
Сообщения: 9
Репутация: 10
По умолчанию

интересно! То есть можно принудительно его(укозатель на объект) прировнять к NIL, чтобы повторный вызов Free не вызывал ааврийного завершения?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025