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

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

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

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

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

Запись от krapotkin размещена 18.09.2018 в 22:19
Показов 4907 Комментарии 3
Метки delphi

Очень распространенная ошибка новичков это обращение в методах класса к переменным этого же класса
Почему это распространено - да потому что Delphi с доисторических времен при создании формы создает не только класс, ее описывающий, но и переменную этого класса, и даже автоматически создает объект и хранит его в этой переменной
Delphi
1
2
3
4
5
6
TForm1=class(TForm)
...
end;
 
var
  Form1: TForm1;
и новичкам кажется что это такое специальное волшебство и так и должно быть.
Я думаю, как раз наоборот, если бы этого не было, огромного количества ошибок архитектурных и всяких других можно было бы избежать...
Немного про формы я писал тут https://www.cyberforum.ru/blog... g4873.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, которая например, не видна сейчас...
Метки delphi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 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? Как передадите какие-либо данные в другую форму? Да, есть способы (даже у вас описанные: https://www.cyberforum.ru/blog... g4873.html). Но что если я хочу сохранить все данные формы между закрытием и повторным открытием (к примеру, список прочитанный из файла или сети, либо выбранные пункты, набранные тексты и пр)? Если делать это через Create/Free, то сохранение/восстановление всех этих данных – лишнее усложнение. Для большого проекта, может, это и оправдано, но для небольшого – вряд ли.

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

    Также я против злоупотребления Self. Если с Self и без Self происходит одно и то же - зачем вы его написали?
    Запись от GoodWeather размещена 01.12.2019 в 16:13 GoodWeather вне форума
 
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru