powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Заметки о Делфи.
13 сообщений из 13, страница 1 из 1
Заметки о Делфи.
    #708667
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
У меня сейчас на работе основной ЯП - Delphi. Хотя относительно давно на нем программирую, все равно какие-то новые штуки узнавал в последнее время. Буду тут писать.

Первое. Есть в Delphi, как и в других языках, функция Format. Но есть и частные функции для форматирования вывода разных данных. Например для вывода чисел с плавающей запятой - FormatFloat.
Я думал, что эта функция, когда задаешь кол-во знаков после запятой, просто обрезает остальные десятичные знаки. Сегодня узнал, что она всё-таки округляет до заданного кол-ва знаков. И это хорошо,что округляет. )
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #709855
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
На днях узнал о синтаксической конструкции в Паскале Делфи, о которой раньше не знал. Смотрел чужой код и натолкнулся на конструкцию
Код: Delphi
1.
&perem
Сначала подумал, что это адрес, в Си, когда параметр передается по ссылке, т.е. передается адрес переменной, то так пишут. Но в Delphi адрес - @. Т.е, чтобы передать адрес, надо написать
Код: Delphi
1.
@perem
Стал искать, не сразу нашел. Оказывается, это другая, довольно специфическая вещь. Имена типов, переменных не должны совпадать с зарезервированными словами языка. Но оказывается, можно ввести идентификатор, совпадающий с зарезервированным словом. Но надо при его объявлении перед ним поставить амперсанд. Тогда парсер кода будет знать, что этот токен не надо трактовать, как зарезервированное слово.
Пример:
Код: Delphi
1.
2.
3.
4.
5.
6.
procedure TForm1.Button1Click(Sender: TObject);
var &begin: integer;
begin
  &begin := 2;
  Caption := IntToStr(&begin);
end;
При использовании (а не объявлении) переменной, можно вместо амперсанда использовать квалифицированное имя переменной: имя модуля - точка - имя переменной.
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  Form1: TForm1;
  &begin: integer;

...
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  Unit1.begin := 2;
  Caption := IntToStr(Unit1.begin);
end;
Раньше не знал, что есть такая штука.

Но ещё, в коде, где я это увидел, имя переменной не совпадает ни с одним зарезервированным словом. Я предполагаю, что это появилось там в результате ряда ошибок и обстоятельств. Предполагаю. что человек скопировал код из Си. Это функция WinApi, видел пример её использования на Си, там как раз первый параметр передается по ссылке, передается вдрес, и в Си стоит амперсанд. Вероятно человек скопировал этот код и амперсанд тоже. Но в Delphi с одной сторроны адрес пишется @, а с другой - в этой импортированной функции первый параметр объявлен как var-параметр, т.е. он и так уже передается по ссылке, адрес писать не нужно. И в третьих, & в Delphi означает, что имя при парсинге не надо понимать, как зарезервированное слово. Т.е. скопированный так код изменил свой смысл, но так получилось, что результат скомпилировался и он даже правильный. Правда можно просто убрать этот амперсанд, он в данном случае не имеет смысла.
...
Изменено: 24.01.2024, 23:32 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #709869
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так себе конечно фича...
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #709871
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
IT-Клоп  25.01.2024, 00:33
[игнорируется]
Так себе конечно фича...
Да, согласен. Я просто сначала был озадачен кодом, который увидел, долго (ну относительно) искал, что же такое означает & в паскале делфи. Ну и вот, узнал про такое.
...
Изменено: 25.01.2024, 00:37 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #717125
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
В Delphi есть поддержка тем (оформления) Windows. И эта штука, что впрочем логично, не позволяет менять какие-то визуальные свойства тех или иных элементов управления. Например в элементе управления TPageControl: панель с закладками, цвет закладок в теме по-умолчанию в Windows 10 - белый. На белом не всегда хорошо видны поля ввода и т.д. Но цвет, просто задав в design-time какой-то произвольный, не поменяешь, если включена поддержка тем, нарисовано будет всё равно в стиле темы.

Сегодня добавлял в полосу статуса окна (Status bar, полоска внизу), вывод еще одной информации, кроме которой там была. Там несколько панелей, на части выводится текст, на других рисуется типа индикаторов красный/зеленый. Панели есть двух типов - либо задаешь текст и он выводится на панели, либо она отрисовывается программно (свойство Style - psText или psOwnerDraw). И вот надо было добавить ещё одну панельку, в которой выводится текст красным цветом в некоторых ситуациях. Отлаживаю и обращаю внимание, что текстовые панели - жирным шрифтом. Почему? Начинаю искать - в свойствах этого нет, в коде этого тоже нет, из других потоков, которые через Synchronize вызывают разные процедуры в этом окне, тоже нет такого. Причем сначала после открытия окна - без жирного, без bold'а, а потом появляется он. И только через какое-то время догадался, что это - тема. Отключил в опциях проекта поддержку тем и жирный перестал появляться. Ну, потом включил назад. Ладно, раз такая тема, в смысле тема оформления :), то значит так, пусть уж будет, чтобы не выбиваться из стиля Windows.
...
Изменено: 05.02.2024, 18:35 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #718871
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
Знакомую фамилию увидел. Использовал в коде функцию CompareMem (сравнивает две области памяти), решил глянуть, как она реализована. Ну, как и ряд других функций, взята из проекта Fastcode, вероятно - адаптирована. А среди тех, кто принимал участие в написании, упомянут Александр Шарахов (только он там и упомянут). Александр не раз писал в разделе Delphi на sql.ru.
Цитата 
[игнорируется]
(* ***** BEGIN LICENSE BLOCK *****
*
* The function CompareMem is licensed under the CodeGear license terms.
*
* The initial developer of the original code is Fastcode
*
* Portions created by the initial developer are Copyright (C) 2002-2004
* the initial developer. All Rights Reserved.
*
* Contributor(s): Aleksandr Sharahov
*
* ***** END LICENSE BLOCK ***** *)
...
Изменено: 09.02.2024, 10:19 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #721425
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
В индексе TIOBE в феврале на 12 месте:
https://www.tiobe.com/tiobe-index/
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #721426
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
Висуал бейсик на 9м.
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #724141
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуловимый Джо  15.02.2024, 08:57
[игнорируется]
Висуал бейсик на 9м.
VB опережает PHP. Ну как такое может быть?
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #724530
Фотография Ифрит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IT-Клоп  20.02.2024, 12:02
[игнорируется]
Неуловимый Джо  15.02.2024, 08:57
[игнорируется]
Висуал бейсик на 9м.
VB опережает PHP. Ну как такое может быть?
в тиобе, vb, так-то - нет, вроде
под этим названием там другой язык
...
Изменено: 20.02.2024, 20:45 - Ифрит
Рейтинг: 0 / 0
Заметки о Делфи.
    #724535
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
IT-Клоп  20.02.2024, 12:02
[игнорируется]
Неуловимый Джо  15.02.2024, 08:57
[игнорируется]
Висуал бейсик на 9м.
VB опережает PHP. Ну как такое может быть?
У TIOBE какие-то свои методики подсчёта. Там кстати у VB какой-то огромный всплеск, начиная с 2020 года:
https://www.tiobe.com/tiobe-index/visual-basic/

Есть рейтинги на stack overflow:
https://survey.stackoverflow.co/2023/#section-most-popular-technologies-programming-scripting-and-markup-languages
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #729433
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
Может все это знают и так, но вдруг кто-то не знает или забыл. Компилятор под Windows использует менеджер памяти, взятый из опенсорсного проекта FastMM. И у него есть такая фишка, он может при закрытии программы показать неосвобожденную память. ОС конечно всю виртуальную память процесса после его закрытия всё равно заберет, но тут можно видеть, какие объекты были созданы и не удалились.
Делается это так: в файле проекта в начале после begin добавляется строчка:
Код: Delphi
1.
2.
3.
4.
begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
Или можно вот так, тогда при запуске под отладчиком будет выводить, а при обычном запуске - нет, т.е. не надо менять код для билдов в продакшен.
Код: Delphi
1.
2.
3.
4.
begin
  ReportMemoryLeaksOnShutdown := DebugHook <> 0;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
Вот, про настройку менеджера памяти:
https://docwiki.embarcadero.com/RADStudio/Athens/en/Configuring_the_Memory_Manager
...
Рейтинг: 2 / 0
Заметки о Делфи.
    #739599
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
Долгое время для измерения времени по-быстрому (хаха, прошу прощения за получившуюся игру слов) использовал функцию win32 API GetTickCount. Эта функция возвращает время в мсек от начала работы компьютера. Результат имеет тип Cardinal (беззнаковое 4 байтовое целое), так что он зацикливается после 49,7 примерно дней работы Windows. (Есть функция GetTickCount64, которая возвращает Int64).
MS пишет:
Цитата 
[игнорируется]
Разрешение функции GetTickCount ограничено разрешением системного таймера, которое обычно находится в диапазоне от 10 до 16 миллисекундах.
Во многих ситуациях этой точности вполне достаточно. Использовал примерно так:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
var Ticks: Cardinal;

...
  Ticks := GetTickCount;
//тут какой-то код, время исполнения которого измеряем
...
...
//Дальше или выводим куда-то в программе или например пишем в лог
 AddStrToLog(IntToStr(GetTickCount - Ticks));
В последней строчке сначала выполнится GetTickCount, потом вычислится разность, потом выполнится IntToStr и потом AddStrToLog, т.е. во время войдет только то, что мы измеряем, но не время выполнения IntToStr и записи в лог.
Понятно, что тут не учитывается фактор многопоточности, что какое-то время поток, в котором выполняется код, мог спать в то время, когда (если) система выделила кусок (slice) времени другому или другим потокам.

Но в последнее время часто, когда надо померить время, стал использовать точный таймер, для которого есть обертка в Delphi. Обертка в виде записи с методами. У этого таймера период обычно - 0.1 мксек, т.е. частота 10 000 000 гц.
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
uses
  System.Diagnostics;

var
  SW: TStopWatch;
...
  SW := TStopWatch.StartNew;
//тут код, время которого измеряем
...
...
  SW.Stop;
//выводим время в мксек
  AddStrToLog(IntToStr(SW.ElapsedTicks * 1000000 div SW.Frequency));
Я обычно писал попроще (но не совсем корректно), т.к. , когда тестирую и измеряю время на рабочей машине, Frequency можно запросить и посмотреть отдельно, а убедившись, что это 10 000 000, обычно писал так:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
uses
  System.Diagnostics;

var
  SW: TStopWatch;
...
  SW := TStopWatch.StartNew;
//тут код, время которого измеряем
...
...
  SW.Stop;
//выводим время в мксек
  AddStrToLog(IntToStr(SW.ElapsedTicks div 10));
TStopWatch - это обертка для функции win32 API QueryPerformanceCounter и сопутствующих функций.
...
Изменено: 19.03.2024, 12:11 - s62
Рейтинг: 1 / 0
Нравится: Ифрит
13 сообщений из 13, страница 1 из 1
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Заметки о Делфи.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (2): Анонимы (1), Bing Bot 3 мин.
Читали форум (3): Анонимы (2), Bing Bot 3 мин.
Пользователи онлайн (185): Анонимы (174), s62, Bing Bot, Tails 1 мин., Yandex Bot 1 мин., Гарыныч 1 мин., Буся 1 мин., Просто Трёп 2 мин., С чистого листа 3 мин., erbol 4 мин., Google Bot 8 мин., Брюквенные годы 9 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]