Форум программистов, компьютерный форум, киберфорум
Наши страницы
krapotkin
Войти
Регистрация
Восстановить пароль
Блог. Двадцать пять лет Делфи-практики

В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.

Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.

Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
____________________________________________________________________________________
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
Рейтинг: 4.00. Голосов: 1.

Что не так с Form1.Caption

Запись от krapotkin размещена 18.09.2018 в 22:19

Очень распространенная ошибка новичков это обращение в методах класса к переменным этого же класса
Почему это распространено - да потому что Delphi с доисторических времен при создании формы создает не только класс, ее описывающий, но и переменную этого класса, и даже автоматически создает объект и хранит его в этой переменной
Delphi
1
2
3
4
5
6
TForm1=class(TForm)
...
end;
 
var
  Form1: TForm1;
и новичкам кажется что это такое специальное волшебство и так и должно быть.
Я думаю, как раз наоборот, если бы этого не было, огромного количества ошибок архитектурных и всяких других можно было бы избежать...
Немного про формы я писал тут http://www.cyberforum.ru/blogs/469693/blog4873.html

Очень подходит аналогия, что TForm1 - это комплект чертежей некоего автомобиля
а Form1 - это готовый созданный автомобиль с личным номером.

Если мы в чертежах используем этот личный номер, то все работает только пока этот объект выпускается в единственном экземпляре. Формы у начинающих примерно так и работают. Одна форма - одна переменная. На самом деле это вовсе не так.
Мы должны помнить, что поля и методы класса доступны в других методах этого же класса
Delphi
1
2
3
4
5
6
procedure TForm1.MyProcedure();
begin
  Caption := '123';
  Width := 800;
  Hieght := 600;
end;
при этом одинаковых форм такого типа мы можем создать сколько угодно.
желательно еще и не используя глобальные переменные (опять посылаю прочитать статью о формах)
Delphi
1
2
3
form1 := TForm1.Create(NIL);
f:=TForm1.Create(NIL);
aaaaa := TForm1.Create(NIL);
но если мы напишем
Delphi
1
2
3
4
5
6
procedure TForm1.MyProcedure();
begin
  form1.Caption := '123';
  form1.Width := 800;
  form1.Hieght := 600;
end;
а потом
Delphi
1
2
f:=TForm1.Create(NIL);
f.MyProcedure();
то выскочит ошибка Access Violation, потому что в методе мы вместо полей объекта F который только что создали, обращаемся к Form1, который даже и не создан
А если он создан, то на форуме появляются темы. Я ставлю Width := 800 а форма не меняется
При этом форма создана заново, а все изменения уходят в Form1, которая например, не видна сейчас...
Размещено в Без категории
Просмотров 626 Комментарии 3
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для Jlovenpk1
    Годно.
    Продолжайте!)
    Пусть я и перешел на Шарпы, Delphi я люблю больше всех.
    Запись от Jlovenpk1 размещена 21.09.2018 в 13:54 Jlovenpk1 вне форума
  2. Старый комментарий
    Аватар для Jin X
    Цитата:
    Очень распространенная ошибка новичков это обращение в методах класса к переменным этого же класса
    Всё же поправлю: "обращение в методах класса к переменным (полям) отдельного экземпляра (объекта)".
    Потому как, когда я прочитал исходное предложение, то не сразу понял, что в этом плохого.

    Что же касается глобальных переменных типа var Form1: TForm1, то проблема не в этой переменной, а в головах новичков. Любой инструмент можно использовать во благо, а можно (как топором) вместо ветки палец оттяпать. Смысл использования объектной переменной внутри класса, к которой этот объект относится, нормальному человеку непонятен (зачем писать Form1.Caption, когда можно написать просто Caption?) С этим всё понятно. И если бы не было этих глобальных объектных переменных, то и проблем таких тоже не было бы – с этим тоже всё понятно. Но если ножом можно порезаться, это не значит, что все ножи нужно выкинуть. Обычно всё же приложения имеют конкретный набор форм, и необходимости создавать новые (тем более, такие же) нет, поэтому эта проблема новичкам неведома (да и она реально не возникает, как правило даже при использовании Form1.Caption). Другое дело, что это неправильно концептуально. Но! Если бы переменных Form1, Form2 и т.д. не было, взаимодействие между формами было бы сложнее. Как вы вызовете из какого-нибудь TForm1.Button1Click форму Form2, если не через Form2.Show? Как передадите какие-либо данные в другую форму? Да, есть способы (даже у вас описанные: http://www.cyberforum.ru/blogs/469693/blog4873.html). Но что если я хочу сохранить все данные формы между закрытием и повторным открытием (к примеру, список прочитанный из файла или сети, либо выбранные пункты, набранные тексты и пр)? Если делать это через Create/Free, то сохранение/восстановление всех этих данных – лишнее усложнение. Для большого проекта, может, это и оправдано, но для небольшого – вряд ли.

    Короче говоря, если множество способов сделать одно и то же. Не всегда есть смысл городить универсальный вариант на все случаи жизни (которые пока неактуальны, но так, на всякий случай, на будущее), усложняя тем самым проект. И каждый из способов нужно использовать с умом, т.к. напортачить можно даже при использовании самой простой функции
    Запись от Jin X размещена 27.10.2018 в 10:32 Jin X вне форума
    Обновил(-а) Jin X 27.10.2018 в 11:31
  3. Старый комментарий
    Аватар для GoodWeather
    Я всегда говорил и говорю: класс TForm* должен штатно работать даже если вообще удалить переменную Form* из кода. Да и вообще все глобальные переменные (с отдельными допущениями).
    Если лезут ошибки/проблемы/глюки - вы что-то сделали не так.

    Также я против злоупотребления Self. Если с Self и без Self происходит одно и то же - зачем вы его написали?
    Запись от GoodWeather размещена 01.12.2019 в 16:13 GoodWeather на форуме
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.