powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Заметки о Делфи.
Модераторы: s62
20 сообщений из 70, страница 3 из 3
Заметки о Делфи.
    #1515292
defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  04.09.2025, 18:14
[игнорируется]
defecator [игнорируется] 

Почитай документацию, я ссылку привел. У меня работает то, что ты показал.
Это пока в одном модуле
И вообще нихуя непонятно, для чего это тебе надо
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1557951
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
"Век живи, век учись" )
Функции winapi (может по-разному бывает, но есть вот такой вариант) в случае неуспеха возвращают результат, что ошибка, а какая именно - есть функции GetLastError или например для сокетов WSAGetLastError. Они возвращают код ошибки, а что она означает, можно посмотреть например на сайте Microsoft, там есть таблица кодов ошибок и что они означают. Поинтересовался, как вывести прямо в программе текст сообщения, а не код ошибки, если есть код. Оказывается, есть функция win32 API, FormatMessage, если задать определенные параметры, она это может. Но там буфер под строку, размер её передается, освобождать память потом надо, в общем не очень удобно.
А оказывается в библиотеках Delphi есть функция SysErrorMessage, которая делает то же самое: по коду ошибки возвращает её описание. Она, собственно, вызывает эту функцию winapi.
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.SysErrorMessage
Код: Delphi
1.
function SysErrorMessage(ErrorCode: Cardinal; AModuleHandle: THandle = 0): string;
Норм. Раньше не знал.
...
Изменено: 20.10.2025, 16:13 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #1558000
defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  20.10.2025, 16:08
[игнорируется]
"Век живи, век учись" )
Функции winapi (может по-разному бывает, но есть вот такой вариант) в случае неуспеха возвращают результат, что ошибка, а какая именно - есть функции GetLastError или например для сокетов WSAGetLastError. Они возвращают код ошибки, а что она означает, можно посмотреть например на сайте Microsoft, там есть таблица кодов ошибок и что они означают. Поинтересовался, как вывести прямо в программе текст сообщения, а не код ошибки, если есть код. Оказывается, есть функция win32 API, FormatMessage, если задать определенные параметры, она это может. Но там буфер под строку, размер её передается, освобождать память потом надо, в общем не очень удобно.
А оказывается в библиотеках Delphi есть функция SysErrorMessage, которая делает то же самое: по коду ошибки возвращает её описание. Она, собственно, вызывает эту функцию winapi.
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.SysErrorMessage
Код: Delphi
1.
function SysErrorMessage(ErrorCode: Cardinal; AModuleHandle: THandle = 0): string;
Норм. Раньше не знал.
так это как минимум с дельфи 2 тянется.
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1558024
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
defecator  20.10.2025, 16:35
[игнорируется]
s62  20.10.2025, 16:08
[игнорируется]
"Век живи, век учись" )
Функции winapi (может по-разному бывает, но есть вот такой вариант) в случае неуспеха возвращают результат, что ошибка, а какая именно - есть функции GetLastError или например для сокетов WSAGetLastError. Они возвращают код ошибки, а что она означает, можно посмотреть например на сайте Microsoft, там есть таблица кодов ошибок и что они означают. Поинтересовался, как вывести прямо в программе текст сообщения, а не код ошибки, если есть код. Оказывается, есть функция win32 API, FormatMessage, если задать определенные параметры, она это может. Но там буфер под строку, размер её передается, освобождать память потом надо, в общем не очень удобно.
А оказывается в библиотеках Delphi есть функция SysErrorMessage, которая делает то же самое: по коду ошибки возвращает её описание. Она, собственно, вызывает эту функцию winapi.
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.SysErrorMessage
Код: Delphi
1.
function SysErrorMessage(ErrorCode: Cardinal; AModuleHandle: THandle = 0): string;
Норм. Раньше не знал.
так это как минимум с дельфи 2 тянется.
Так я и не писал, что это новое.
...
Изменено: 20.10.2025, 16:53 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #1558041
defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  20.10.2025, 16:48
[игнорируется]
defecator  20.10.2025, 16:35
[игнорируется]
s62  20.10.2025, 16:08
[игнорируется]
"Век живи, век учись" )
Функции winapi (может по-разному бывает, но есть вот такой вариант) в случае неуспеха возвращают результат, что ошибка, а какая именно - есть функции GetLastError или например для сокетов WSAGetLastError. Они возвращают код ошибки, а что она означает, можно посмотреть например на сайте Microsoft, там есть таблица кодов ошибок и что они означают. Поинтересовался, как вывести прямо в программе текст сообщения, а не код ошибки, если есть код. Оказывается, есть функция win32 API, FormatMessage, если задать определенные параметры, она это может. Но там буфер под строку, размер её передается, освобождать память потом надо, в общем не очень удобно.
А оказывается в библиотеках Delphi есть функция SysErrorMessage, которая делает то же самое: по коду ошибки возвращает её описание. Она, собственно, вызывает эту функцию winapi.
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.SysErrorMessage
Код: Delphi
1.
function SysErrorMessage(ErrorCode: Cardinal; AModuleHandle: THandle = 0): string;
Норм. Раньше не знал.
так это как минимум с дельфи 2 тянется.
Так я и не писал, что это новое.
Я к тому, что матчасть надо знать
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1558131
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
defecator  04.09.2025, 18:16
[игнорируется]
s62  04.09.2025, 18:14
[игнорируется]
defecator [игнорируется] 

Почитай документацию, я ссылку привел. У меня работает то, что ты показал.
Это пока в одном модуле
...
Кстати ограничение насчет одного модуля легко устраняется, если рассуждать в общем, в данном случае мне это не было нужно. Когда обсуждали, ещё подумал, но не стал тогда писать.
В классе предка объявляем функцию SetMyProp в секции protected, которая присваивает private полю заданное значение. Но не назначаем свойству сеттер, так что свойство у предка read-only. А в потомке задаем сеттером эту функцию.
...
Изменено: 20.10.2025, 18:04 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #1558236
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
defecator  20.10.2025, 17:03
[игнорируется]
s62  20.10.2025, 16:48
[игнорируется]
defecator  20.10.2025, 16:35
[игнорируется]
s62  20.10.2025, 16:08
[игнорируется]
"Век живи, век учись" )
Функции winapi (может по-разному бывает, но есть вот такой вариант) в случае неуспеха возвращают результат, что ошибка, а какая именно - есть функции GetLastError или например для сокетов WSAGetLastError. Они возвращают код ошибки, а что она означает, можно посмотреть например на сайте Microsoft, там есть таблица кодов ошибок и что они означают. Поинтересовался, как вывести прямо в программе текст сообщения, а не код ошибки, если есть код. Оказывается, есть функция win32 API, FormatMessage, если задать определенные параметры, она это может. Но там буфер под строку, размер её передается, освобождать память потом надо, в общем не очень удобно.
А оказывается в библиотеках Delphi есть функция SysErrorMessage, которая делает то же самое: по коду ошибки возвращает её описание. Она, собственно, вызывает эту функцию winapi.
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.SysErrorMessage
Код: Delphi
1.
function SysErrorMessage(ErrorCode: Cardinal; AModuleHandle: THandle = 0): string;
Норм. Раньше не знал.
так это как минимум с дельфи 2 тянется.
Так я и не писал, что это новое.
Я к тому, что матчасть надо знать
Это да. Не зная, можно изобретать велосипеды там, где нет нужды это делать. Ну вот, я расширил свой кругозор сегодня. )
Кстати, вот на sql.ru были грамотные люди в разделе Делфи, там можно было поучиться каким-то вещам, что-то узнать. Хотя стиль бывал и довольно резкий.
...
Изменено: 20.10.2025, 21:02 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #1558237
defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  20.10.2025, 21:00
[игнорируется]
defecator  20.10.2025, 17:03
[игнорируется]
s62  20.10.2025, 16:48
[игнорируется]
defecator  20.10.2025, 16:35
[игнорируется]
s62  20.10.2025, 16:08
[игнорируется]
...
так это как минимум с дельфи 2 тянется.
Так я и не писал, что это новое.
Я к тому, что матчасть надо знать
Это да. Не зная, можно изобретать велосипеды там, где нет нужды это делать. Ну вот, я расширил свой кругозор сегодня. )
Кстати, вот на sql.ru были грамотные люди в разделе Делфи, там можно было поучиться каким-то вещам, что-то узнать. Хотя стиль бывал и довольно резкий.
тут только я остался из тех аксакалов ! всю жизнь только Паскаль-Дельфи !
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1559574
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator  20.10.2025, 21:04
[игнорируется]
тут только я остался из тех аксакалов !
Я бы не был так уверен.
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1560368
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  20.10.2025, 16:08
[игнорируется]
для сокетов WSAGetLastError. Они возвращают код ошибки
Для сокетов WSAGetLastError не всегда работает, если интересно.
Например, если select возвращает не ошибку, но FD_ISSET( Socket, exceptfds ) - пришло событие ошибки в параметр exceptfds, то WSAGetLastError хрень вернет.
Надо получать код ошибки через getsockopt с параметром SO_ERROR и использовать его, либо устанавливать его в WSASetLastError, тогда WSAGetLastError отработает.
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1560385
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
YuRock  22.10.2025, 15:39
[игнорируется]
s62  20.10.2025, 16:08
[игнорируется]
для сокетов WSAGetLastError. Они возвращают код ошибки
Для сокетов WSAGetLastError не всегда работает, если интересно.
Например, если select возвращает не ошибку, но FD_ISSET( Socket, exceptfds ) - пришло событие ошибки в параметр exceptfds, то WSAGetLastError хрень вернет.
Надо получать код ошибки через getsockopt с параметром SO_ERROR и использовать его, либо устанавливать его в WSASetLastError, тогда WSAGetLastError отработает.
Я использую не select, а WSAEventSelect. Да, например какие-то ошибки можно получить так (условный код).
Вызывается
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
case WSAWaitForMultipleEvents(1, @FEvents[0], False, aTimeout - TimeElapsed, False) of
  WSA_Wait_Event_0:
  begin
    WSAEnumNetworkEvents(FClientSocket, FEvents[0], NetworkEvents);
    if NetworkEvents.iErrorCode[FD_Read_Bit] = 0 then
    begin
      ...
    end
    else begin
       ...
       err := NetworkEvents.iErrorCode[FD_READ_BIT];  //код ошибки <--------------------
      ...
    end;
Но какие-то другие можно получить через WSAGetLastError.
...
Изменено: 22.10.2025, 16:08 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #1560400
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  22.10.2025, 15:58
[игнорируется]
Но какие-то другие можно получить через WSAGetLastError
Только если ф-ция (select/recv/send и другие) вернула SOCKET_ERROR (-1)
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1560412
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
YuRock  22.10.2025, 16:09
[игнорируется]
s62  22.10.2025, 15:58
[игнорируется]
Но какие-то другие можно получить через WSAGetLastError
Только если ф-ция (select/recv/send и другие) вернула SOCKET_ERROR (-1)
Ну да, но там же обычно или успешное выполнение или возвращает SOCKET_ERROR, например для connect, send, recv...
...
Изменено: 22.10.2025, 16:18 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #1560414
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  22.10.2025, 16:18
[игнорируется]
YuRock  22.10.2025, 16:09
[игнорируется]
s62  22.10.2025, 15:58
[игнорируется]
Но какие-то другие можно получить через WSAGetLastError
Только если ф-ция (select/recv/send и другие) вернула SOCKET_ERROR (-1)
Ну да, но там же обычно или успешное выполнение или возвращает SOCKET_ERROR, например для connect, send, recv...
Обычно - да. Но вот с select не всегда так.
...
Рейтинг: 1 / 0
Нравится: s62
Заметки о Делфи.
    #1560476
defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
не сталкивался ни разу с такой хуетой, но я и select не пользовался, обычно хватало всегда recv/send
а у них сообщение об ошибке всегда было информативное

в некоторых сорцах (synapse, например, или RealThinClient) видел обработку FD_ISSET, но у меня не вылазило ни разу.
Возможно, это более актуально во всяких линуксах
Фик его знает
...
Изменено: 22.10.2025, 17:21 - defecator
Рейтинг: 0 / 0
Заметки о Делфи.
    #1560673
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator  22.10.2025, 17:17
[игнорируется]
Возможно, это более актуально во всяких линуксах
Фик его знает
Я все свои сетевые библиотеки, протоколы на сокетах Беркли написал, чтоб можно было если что скомпилить не только под винду. Пока, правда, не пришлось ни разу :)
Из виндовых функций используются только WSAGet/SetLastError.
defecator  22.10.2025, 17:17
[игнорируется]
обычно хватало всегда recv/send
select нужен для ожидания с таймаутом
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1560674
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock  22.10.2025, 21:45
[игнорируется]
select нужен для ожидания с таймаутом
И для проверки (с ожиданием) возможности делать send тоже, кстати. Иначе может зависнуть если не навсегда, то надолго.
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1577901
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Это наверное все дельфисты, которые ещё остались, знают, но так, напомню, сегодня на всякий случай пересматривал.
В цикле while:
Код: Delphi
1.
while counter <= finalValue do
выражение finalValue (если это выражение, а не число), будет оцениваться/вычисляться на каждом шаге цикла.

В цикле for
Код: Delphi
1.
for counter := initialValue to finalValue do statement
initialValue и finalValue оцениваются один раз перед началом цикла.

Из документации:
Цитата 
[игнорируется]
(про цикл for) For purposes of controlling the execution of the loop, the expressions initialValue and finalValue are evaluated only once, before the loop begins.
...
The difference between this construction (там пример с while - s62) and the for...to statement is that the while loop reevaluates finalValue before each iteration. This can result in noticeably slower performance if finalValue is a complex expression, and it also means that changes to the value of finalValue within statement can affect the execution of the loop.
https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Declarations_and_Statements_(Delphi)#For_Statements
...
Изменено: Вчера, 11:37 - s62
Рейтинг: 0 / 0
Заметки о Делфи.
    #1577981
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62 [ігнорувати] 

Да, конечно. В паскале реализован для x86 нативный loop для циклов for. В отличие от си.
Счетчик сразу в регистр забивается и дальше меняется самим процом.
...
Рейтинг: 0 / 0
Заметки о Делфи.
    #1577995
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень удобно бывает делать циклы типа
Код: Delphi
1.
for i := 1 to CalcSomeCount do
Не заботясь о том, что CalcSomeCount - функция, пусть даже которая в базу лезет. Вызовется один раз.
...
Рейтинг: 1 / 0
Нравится: s62
20 сообщений из 70, страница 3 из 3
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Заметки о Делфи.
Модераторы: s62
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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