Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Помогите разобраться в понятиях   Найти похожие ветки 

 
qwe   (2003-10-31 16:43) [0]

type
TMainForm = class(TForm);
private
public
end;
var
MainForm: TMainForm;

1. TForm это класс
2. TMainForm это экземпляр класса
3. MainForm это обьект класса ТMainForm


 
Юрий Федоров   (2003-10-31 16:45) [1]

2. TMainForm это класс


 
qwe   (2003-10-31 16:47) [2]

наследник TForm ? а что же тогда экземпляр класса


 
Юрий Федоров   (2003-10-31 16:49) [3]

экземпляр класса - MainForm


 
Reindeer Moss Eater   (2003-10-31 16:52) [4]

Неа.
Это переменная типа TMainForm.
Экземпляра тут нет, он в куче.


 
qwe   (2003-10-31 16:54) [5]

Как обьявить экземпляр класса


 
Reindeer Moss Eater   (2003-10-31 16:55) [6]

Его не надо объявлять. Его надо создавать.
Конструктором.

TMainForm.Create;


 
Reindeer Moss Eater   (2003-10-31 16:56) [7]

TMainForm.Create(Оунер)


 
Юрий Федоров   (2003-10-31 16:56) [8]

MainForm - указатель на экземпляр класса.
Ее можно называть и экземпляром класса - думаю, это нормально.
Мы же не пишем MainForm^.Show


 
Reindeer Moss Eater   (2003-10-31 17:01) [9]

MainForm - указатель на экземпляр класса.

Не обязательно.
Он может никуда не указывать. И на экземпляр может указывать не только он(а).

Отождествление переменной MainForm c экземпляром - неиисякаемый источник многих заблуждений и ошибок


 
handra   (2003-10-31 17:09) [10]

точно, если я напишу
MainFormTo: TMainForm
P: Pointer

и сделаю

MainFormTo := MainForm - не появится еще одного экземпляра

P := Pointer(MainForm) - вообще интересный вариант ;)


 
Юрий Федоров   (2003-10-31 17:13) [11]

Ну не знаю. Вообще стандарты по терминологии существуют?


 
Юрий Федоров   (2003-10-31 17:14) [12]

P := Pointer(MainForm) - вообще интересный вариант ;)Это тоже самое, что и
MainFormTo := MainForm


 
handra   (2003-10-31 17:16) [13]

нет, если следовать Вашей терминологии, это - ЧЕРНАЯ ДЫРА
поэтому не следует привязывать сущность к ссылке на нее, обычно делается наоборот :)


 
default   (2003-10-31 17:54) [14]

Reindeer Moss Eater © (31.10.03 16:52) [4]
можно и так сказать, но вообще, я думаю, без разницы как называть, главное чтоб человек понимал, что под этим подразумевается


 
Юрий Зотов   (2003-10-31 18:21) [15]

> qwe (31.10.03 16:43)

type
TMainForm = class(TForm);
private
public
end;

var
MainForm: TMainForm;

1. TForm это класс
2. TMainForm это тоже класс (потомок класса TForm).
3. MainForm это просто переменная. Можно рассматривать ее, как типизированный указатель. Пока еще он ни на что не указывает, но после строки
MainForm := TMainForm.Create(...);
он будет указывать на объект класса TMainForm, только что созданный в динамической памяти. По правилам классического Паскаля к полям, свойствам и методам самого объекта следовало бы обращаться так:
MainForm^.поле
MainForm^.свойство
MainForm^.метод(параметры)

но все дело в том, что язык Delphi - это не совсем классический Паскаль и в нем такие "объектные" указатели разыменовываются автоматически. Лишь только поэтому мы и не пишем значок ^.

После MainForm.Free объект удаляется, но содержимое переменной MainForm автоматически не изменяется (потому что ни о каких внешних ссылках на себя удаляемый объект не знает и изменить их не может). Она по-прежнему содержит все тот же адрес, но никакого объекта по нему уже нет. Поэтому вот такие проверки без "ручной" очистки MaiForm приводит к AccessViolation:
if Assigned(MainForm) then MaiForm.Что-то;
if MainForm <> nil then MaiForm.Что-то;


А вот если вместо MainForm.Free использовать FreeAndNil(MainForm), то те же самые проверки пройдут нормально.


 
Stratos   (2003-11-01 03:17) [16]


> 3. MainForm это просто переменная. Можно рассматривать ее,
> как типизированный указатель. Пока еще он ни на что не указывает,
> но после строки
> MainForm := TMainForm.Create(...);
> он будет указывать на объект класса TMainForm

Точнее после строки
Application.CreateForm(TMainForm, MainForm);
которая в сущности вызывает конструктор. :)


 
Юрий Зотов   (2003-11-01 11:24) [17]

> Stratos © (01.11.03 03:17) [16]

Она не "в сущности" его вызывает, а просто его вызывает, без всяких "сущностей". Посмотрите реализацию метода TApplication.CreateForm - все увидите сами.

Поэтому Вы не правы. Именно после строки
MainForm := TMainForm.Create(...);
переменная MainForm будет указывать на свежесозданный объект класса TMainForm.

А уж где там где эта строка написана, в нашей программе, или внутри кода VCL - это абсолютно никакого значения не имеет.



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

Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.036 c
7-42166
Layner
2003-09-01 15:59
2003.11.13
Помогите сделать всегда активную форму


1-41258
RoLeX
2003-10-31 17:29
2003.11.13
Как в DateTimePicker сравнить даты???


3-40891
Fuelfire
2003-10-20 12:12
2003.11.13
Обновление грида после закрытия формы


8-41771
Sash1304
2003-07-15 12:47
2003.11.13
Графика. Работа с большим ресурсом.


1-41182
MaG
2003-11-01 19:17
2003.11.13
Поверх всех окон





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