Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2022, 13:25   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию String vs ShortString

Есть целая куча строковых констант. Все небольшой длины.
Нужны они, в основном, для того чтобы присваивать имена кнопкам, которые создаются по ходу исполнения программы через TButton.Create

Какого типа лучше их делать? String, или ShortString
С одной стороны, ShortString занимает куда меньше места. Потому как в exe-файле между двумя String находятся 12 разделительных символа, а между ShortString - 4-5

С другой стороны, просмотрев через crtl+alt+C место создания имени кнопки, заметил, что у ShortString ощутимо длиннее код передачи строки. Как я понял, при передаче происходит конвертация ShortString в String

Отсюда возникает вопрос - какой из видов строк лучше использовать в программе?
Kronos913 вне форума Ответить с цитированием
Старый 07.09.2022, 13:32   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

И может быть как-то можно отредактировать TButton, TLabel и прочие, чтобы в них ShortString заходил напрямую, без конвертации?
Kronos913 вне форума Ответить с цитированием
Старый 07.09.2022, 13:38   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Отсюда возникает вопрос - какой из видов строк лучше использовать в программе?
Без разницы. Вы не избежите всех теневых копирований строк. В конечном итоге эта строка все равно будет скопирована и сохранена в системном буфере при создании самой кнопки (как конечного окна класса BUTTON из user32.dll). Искать выгоды и оптимизации в этом месте возможно, но бесполезно. В конце концов вы всегда можете создать в ресурсах STRINGTABLE и расположить строки там. Это кстати может быть даже более удобно с точки зрения перевода/локализации программы на другие языки.
macomics вне форума Ответить с цитированием
Старый 07.09.2022, 14:05   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Нужны они, в основном, для того чтобы присваивать имена кнопкам, которые создаются по ходу исполнения программы через TButton.Create
А какое вам дело, сколько памяти занимает структура и как быстро она обрабатывается, если вы говорите об элементах управления? Сам по себе интерфейс не требует какой-то супер производительности, на подобную ерунду можно просто забить и писать код так, как удобнее и как более читабельно.
Arigato вне форума Ответить с цитированием
Старый 07.09.2022, 14:27   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Без разницы. Вы не избежите всех теневых копирований строк. В конечном итоге эта строка все равно будет скопирована и сохранена в системном буфере при создании самой кнопки (как конечного окна класса BUTTON из user32.dll). Искать выгоды и оптимизации в этом месте возможно, но бесполезно. В конце концов вы всегда можете создать в ресурсах STRINGTABLE и расположить строки там. Это кстати может быть даже более удобно с точки зрения перевода/локализации программы на другие языки.
Я вынес в строковые константы имена кнопок, потому как некоторые из них дублируются. Но далеко не все.
И внезапно вышло так, что исходник от этого немного вырос...
Kronos913 вне форума Ответить с цитированием
Старый 07.09.2022, 14:39   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Ну конечно же. Когда вы задаете имена кнопок в компонентах, тогда имена кнопок включаются как dfm файл в ресурсы программы и нет лишнего кода создания компонентов. Для воспроизведения формы используется универсальный конструктор, который создает окно по его текстовому описанию. Из-за этого конструктора у вас даже простое приложение с окном весит больше полумегабайта.

Последний раз редактировалось macomics; 07.09.2022 в 14:44.
macomics вне форума Ответить с цитированием
Старый 07.09.2022, 17:58   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Ну конечно же. Когда вы задаете имена кнопок в компонентах, тогда имена кнопок включаются как dfm файл в ресурсы программы и нет лишнего кода создания компонентов. Для воспроизведения формы используется универсальный конструктор, который создает окно по его текстовому описанию. Из-за этого конструктора у вас даже простое приложение с окном весит больше полумегабайта.
Думаю, вы не совсем поняли, что я имел в виду

Вариант 1:
Код:
But1.Caption:='12345';
Вариант 2:
Код:
Const
  a:string='12345';
Код:
But1.Caption:=a;
Так вот, при варианте 2 увеличивается размер исходника.
Вообще, вариант 2 делался для того, чтобы если какое-то имя повторяется - то чтобы оно было 1 раз прописано
Kronos913 вне форума Ответить с цитированием
Старый 07.09.2022, 19:14   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
при варианте 2 увеличивается размер исходника
А это разве имеет какое-то значение? Купите диск побольше, если место заканчивается
Arigato вне форума Ответить с цитированием
Старый 07.09.2022, 20:24   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Больше просто чтобы все было оптимальнее

Цитата:
Сообщение от macomics Посмотреть сообщение
Ну конечно же. Когда вы задаете имена кнопок в компонентах, тогда имена кнопок включаются как dfm файл в ресурсы программы и нет лишнего кода создания компонентов.
А по поводу этого - в программе огромное количество панелей, которые включаются/отключатся. Если пытаться всё втулить на форму - будет такой перегруз элементами, что невозможно будет во всём нормально разобраться. И большая вероятность запутаться, что под/над чем должно находиться

Потому становится проще создавать многие панели и их элементы из программы.
И к слову говоря, если переводить элементы из раздела изначальных в раздел создаваемых - то размер исходника уменьшается
Kronos913 вне форума Ответить с цитированием
Старый 07.09.2022, 21:05   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
при варианте 2 увеличивается размер исходника.
У меня убеждение, переходящее в уверенность, что ТС не понимает значение слова "исходник" и отождествляет его с ехе-шником.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
shortstring не считывает 255 символов mahatmaQL Общие вопросы Delphi 6 12.04.2014 22:45
ошибка [C++ Error] string.h(5): E2344 Earlier declaration of 'String' Pein95 C++ Builder 2 02.04.2013 21:18
ShortString → PChar Alex Cones Общие вопросы Delphi 4 22.08.2010 14:08
Как получить адрес String строки или преобразовать String madboy4ik Общие вопросы по Java, Java SE, Kotlin 6 15.01.2010 11:57