Что ж он не заметил, что методы будут ошибочно работать с более чем двухбайтовыми символами UTF8? )porutchik писал(а): 31 Январь 2025, 22:19 Класс стал более стабильным и безопасным. Основные проблемы с утечками памяти и некорректной работой с API устранены. Для полной надежности рекомендуется добавить юнит-тесты для всех методов.
пзц побаловался :)
Модератор: Дед Пахом
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
пзц побаловался :)
пзц побаловался :)
он знать всего не обязан. На то он и обучаемый. Укажи ему и во всех остальных случаях будет учитывать. Тот же вопрос про класс с экселем он как видишь решает по-другому. А не как я ему на 2 день задалRaFaeL писал(а): 03 Февраль 2025, 12:47 Что ж он не заметил, что методы будут ошибочно работать с более чем двухбайтовыми символами UTF8? )
пзц побаловался :)
Вот предложения по улучшению и доработке SMTP-модуля:попросил высказать идеи про smtplib
1. **Добавление поддержки SSL/TLS**
Код: Выделить всё
MODULE('SSL_LIB')
SSL_CTX_new() FUNCTION(), LONG
SSL_CTX_free(ctx) PROCEDURE(LONG)
SSL_new(ctx) FUNCTION(LONG), LONG
SSL_set_fd(s, fd) PROCEDURE(LONG, LONG)
SSL_connect(s) FUNCTION(LONG), LONG
SSL_write(s, buf, len) FUNCTION(LONG, *CHAR, LONG), LONG
SSL_read(s, buf, len) FUNCTION(LONG, *CHAR, LONG), LONG
END
Email_UseSSL BYTE
PROCEDURE EMail_StartTLS
CODE
IF Email_UseSSL
res = mSend_SMTP(Email_Socket, 'STARTTLS<13,10>', 11, 0)
// Обработка ответа сервера и инициализация SSL
ctx = SSL_CTX_new()
ssl = SSL_new(ctx)
SSL_set_fd(ssl, Email_Socket)
IF SSL_connect(ssl) <= 0
! Ошибка установки SSL соединения
RETURN ERROR
END
END
Код: Выделить всё
Email_ErrorCodes QUEUE, TYPE
Code LONG
Description STRING(100)
END
PROCEDURE InitErrorCodes
CODE
ADD(Email_ErrorCodes)
Email_ErrorCodes.Code = 1001
Email_ErrorCodes.Description = 'SSL connection failed'
! ... другие коды ошибок
Код: Выделить всё
Email_StringToUTF8 PROCEDURE(STRING input), STRING
CODE
LOOP i# = 1 TO LEN(CLIP(input))
! Конвертация символов в UTF-8
! ...
END
RETURN input
Код: Выделить всё
EMAIL_QUEUE_POS_HOST EQUATE(0)
EMAIL_QUEUE_POS_HEADERS EQUATE(5)
! ... остальные позиции
Код: Выделить всё
PROCEDURE EMail_AuthOAuth2(STRING token)
CODE
authCmd = 'AUTH XOAUTH2 ' & Base64Encode('user=' & username & '^1 auth=Bearer ' & token)
mSend_SMTP(Email_Socket, authCmd, LEN(authCmd), 0)
! Обработка ответа
Код: Выделить всё
PROCEDURE WriteLog(STRING message)
CODE
OPEN('smtp.log', APPEND)
WRITE('<13,10>' & SYSTEMDATE() & ' ' & SYSTIME() & ' ' & message)
CLOSE
Код: Выделить всё
PROCEDURE EMail_AddLargeFile(STRING filename)
CODE
OPEN(filename, READ+BINARY)
WHILE NOT EOF()
READ BLOCK 4096 TO buffer
EMail_AddChunk(buffer)
END
CLOSE
Код: Выделить всё
PROCEDURE EMail_AddCustomHeader(STRING header, STRING value)
CODE
EMail_AddEMail(header & ': ' & value, EMAIL_QUEUE_POS_HEADERS, 0, 0, '')
1. Замените KOI8-R на UTF-8 во всех MIME-заголовках
2. Реализуйте механизм таймаутов для операций с сокетами
3. Добавьте проверку максимального размера письма согласно RFC
4. Реализуйте поддержку DSN (Delivery Status Notifications)
5. Добавьте асинхронный режим отправки
6. Оптимизируйте работу с памятью для больших писем
7. Реализуйте систему шаблонов для писем
8. Добавьте поддержку альтернативных текстовых/HTML версий писем
9. Реализуйте проверку валидности email-адресов по RFC 5322
10. Добавьте поддержку SMTPUTF8 для международных адресов
Пример использования улучшенного API:
Код: Выделить всё
email SMTP_Client
CODE
email.UseSSL = TRUE
email.Host = 'smtp.gmail.com'
email.Port = 465
email.AuthMethod = SMTP_AUTH_OAUTH2
email.AccessToken = 'ya29.AHES6Z...'
email.SetFrom('Иван Петров', 'ivan@example.com')
email.AddTo('Мария Соколова', 'maria@example.com')
email.SetSubject('Тестовое письмо', ENCODING_UTF8)
email.AddBody('<html>...</html>', CONTENT_TYPE_HTML)
email.AddAttachment('report.pdf')
status = email.Send()
IF status != SMTP_OK
MESSAGE('Ошибка отправки: ' & email.GetLastError())
END
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5232
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 12 раз
- Поблагодарили: 63 раза
пзц побаловался :)
А смысл этот поток сознания сюда выкладывать? Может лучше сгенеренную версию класса, предварительно проверив работоспособность?
C6/C12, ШВС, tps/btrieve.
пзц побаловался :)
на данный момент есть чем заняться. А кому-то может пригодится. А проверять что, уже себе откладываю. Но могу конечно и не выкидыватьfinsoftrz писал(а): 04 Февраль 2025, 6:35 А смысл этот поток сознания сюда выкладывать? Может лучше сгенеренную версию класса, предварительно проверив работоспособность?
- Игорь Столяров
- Ветеран движения
- Сообщения: 8024
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 94 раза
пзц побаловался :)
Если у Вас будет возможность - сделайте пожалуйста краткую инструкцию
как начать работу с Clarion на DeepSeek для таких тупых как я (т.е. желательно с картинками).
Заранее спасибо !

Make Clarion Great Again ! 
пзц побаловался :)
сейчас чуток поприжали. Раньше просто присоединял файлы inc txt clw tpl и задавал задачуИгорь Столяров писал(а): 04 Февраль 2025, 16:44 как начать работу с Clarion на DeepSeek для таких тупых как я (т.е. желательно с картинками).
сейчас ставлю задачу и вставляю код промо в окно чата:
-
- Полимат
- Сообщения: 1810
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 24 раза
- Поблагодарили: 10 раз
пзц побаловался :)
Пробовал, надо все тщательно проверять, накидывает синтаксис которого в кларионе нет. Первое впечатление, могу ошибаться, попользовался минут 10, отложил на выходные.
Для примераИнтересно так влепил FIELDS, может чего то не знаю?!
Для примера
Код: Выделить всё
! Динамическое определение количества полей
NumFields = FIELDS(pFm2_.File)
LOOP F = 1 TO NumFields
IF WHO(targetRec, F) = '' THEN BREAK END
Fields.AddPair(WHAT(targetRec, F), WHAT(sourceRec, F))
END
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
пзц побаловался :)
{prop:fields} помню, тут нужно смотреть. Он похоже так же делает. Когда сомневаешься, в том же диалоге преспроси. Он бывает съезжает и заменяет
- Игорь Столяров
- Ветеран движения
- Сообщения: 8024
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 94 раза
пзц побаловался :)
Make Clarion Great Again ! 
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5232
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 12 раз
- Поблагодарили: 63 раза
пзц побаловался :)
В abc такое есть. Такое впечатление, что ему кларину доку скормили, а там в примере в abc подобная конструкция. Он ее и влепил.
C6/C12, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 8024
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 94 раза
-
- Полимат
- Сообщения: 1810
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 24 раза
- Поблагодарили: 10 раз
пзц побаловался :)
Вот еще...
Код: Выделить всё
! Для каждого ключа в файле
LOOP KeyNum = 1 TO KEYCOUNT(pFM_.File)
KeyName = KEYNAME(pFM_.File, KeyNum)
pFM_.File{PROP:FileManager} SET(GOTO, KeyName, 0)
IF ERRORCODE() = 0
GET(pFM_.File)
! ... обработка ...
END
END
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
пзц побаловался :)
нет, пациент не упорствует. Может до этого с неадекватами пообщался, научили плохому. Указанное исправляет.Игорь Столяров писал(а): 04 Февраль 2025, 20:41 Это наверно уже надо смотреть здесь:
https://ru.wikipedia.org/wiki/%D0%93%D0 ... %BA%D1%82)
Хорошо, пользователь указал, что функция MKEY() не существует в Clarion. Нужно исправить условие, которое проверяет двойной клик мыши. В исходном коде использовалось MKEY() = MLEFT вместе с EVENT:DoubleClick, но это неверно.
Сначала вспомню, как в Clarion обрабатываются события мыши. Событие двойного клика уже само по себе указывает на то, что была нажата левая кнопка мыши. Поэтому нет необходимости дополнительно проверять MKEY(), особенно если такой функции нет. Возможно, пользователь перепутал с другими языками программирования, где требуется проверка состояния кнопки.
Значит, условие должно быть упрощено. Вместо проверки MKEY() и EVENT:DoubleClick, достаточно проверить только EVENT:DoubleClick. Но также нужно убедиться, что событие двойного клика корректно обрабатывается в контексте контрола.
Кроме того, в Clarion для обработки событий мыши используются константы типа EVENT:DoubleClick, и они уже связаны с конкретными кнопками. Поэтому проверка на левую кнопку избыточна, если мы обрабатываем именно двойной клик.
Также стоит обратить внимание на то, что в условии используется OR между проверкой на EnterKey и двойной клик. Это правильно, так как любой из этих событий должен активировать редактирование.
Итак, исправленный код должен убрать упоминание MKEY() и MLEFT, оставив только проверку на EVENT:DoubleClick. Тогда условие будет выглядеть так:
IF KEYCODE() = ENTERKEY OR EVENT() = EVENT:DoubleClick
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5232
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 12 раз
- Поблагодарили: 63 раза
пзц побаловался :)
А откуда взялось EVENT:DoubleClick?
Я так понимаю, если разные люди будут его всякой фигне учить (или просто ошибки в текстах, которые ему скармливают), то и будет постоянно ерунду писать. То есть тут, видимо, массовость и нужна, чтобы воспринимать наиболее часто встречающуюся информацию как правильное решение.

Я так понимаю, если разные люди будут его всякой фигне учить (или просто ошибки в текстах, которые ему скармливают), то и будет постоянно ерунду писать. То есть тут, видимо, массовость и нужна, чтобы воспринимать наиболее часто встречающуюся информацию как правильное решение.
C6/C12, ШВС, tps/btrieve.