Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8 9 10 .. 12      [все]
 Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Программа компилируется без ошибок.

Но почему при попытке сделать Find Declaration вываливает ошибку:

К сообщению приложен файл. Размер - 66Kb
14 окт 19, 17:29    [21993970]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Любой Find Declaration.
14 окт 19, 17:29    [21993971]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Лазарь 2.1.0 с транка.
14 окт 19, 17:31    [21993974]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Прописать в юните {$mode delphiunicode} помогло, но не понятна причина.
14 окт 19, 17:33    [21993975]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Прописать в юните {$mode delphiunicode} помогло, но не понятна причина.

Свойства с названием "Buffer" нет случайно?
14 окт 19, 17:53    [21993988]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Нету.
14 окт 19, 17:56    [21993991]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Можно ли сделать что бы Undo в редакторе лазаря работало как в дельфях?

Т.е. что бы при нажатии Ctrl+Z не выполняло откат сразу же а сначала переходило на позицию где будет сделан откат, если ее не видно на экране?

Такое поведение было очень удобно для навигации.
14 окт 19, 18:04    [21993998]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Такое поведение было очень удобно для навигации.

Для навигации назад там Ctrl+H;
14 окт 19, 18:10    [21994001]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Блин, почти максимально удаленные друг от друга кнопки на клавиатуре.
Я себе пальцы сломаю. :)
14 окт 19, 18:22    [21994007]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Перенастрой хоткей, там можно.
14 окт 19, 18:39    [21994017]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

А в SysUtils в FPC принципиально неюникодный?
14 окт 19, 18:43    [21994019]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
А в SysUtils в FPC принципиально неюникодный?

Что ты имеешь ввиду?
14 окт 19, 18:48    [21994023]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

unit SysUtils;
interface

{$MODE objfpc}
{$MODESWITCH OUT}
{ force ansistrings }
{$H+}
14 окт 19, 18:49    [21994024]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Как я понял {$H+} приводит к String = AnsiString;
14 окт 19, 18:51    [21994028]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
А {$MODE objfpc} оверрайдит {$mode delphiunicode} который я выставил в проекте.
14 окт 19, 18:52    [21994030]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

H+, как и в дельфях, это переключение с дефолтных shortstring на т.н. longstrings, т.е. со статических строк на динамические. В дельфях это сейчас по дефолту и дефолтные строки UnicodeString, в фпц всё несколько сложнее. UnicodeString там пока не дефолтные, и вообще, в разных юнитах дефолтные строки могут быть разными. То есть, в одном юните string может означать AnsiString, а в другом UnicodeString. Насколько я помню, в RTL все эти приколы разруливаются благодаря использованию RawByteString.
14 окт 19, 18:57    [21994036]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
А как там вообще реализовано использование строк в RTL?

Какая кодовая страница будет использована при переходе с юникода к анси?
14 окт 19, 19:37    [21994071]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

https://wiki.freepascal.org/FPC_Unicode_support#Code_page_settings
14 окт 19, 21:51    [21994161]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
rgreat,

ощущение, что фпц усиленно пилят в сторону макс. совместимости с юникодными дельфями. Отсюда и эти прыжки в сторону (уход от нативной в никсах UTF8 в UTF16 с кучей "конвертирующих" функций), и обещания разделения редакций Лазаря отдельно на utf8 и utf16, и тупое копирование дельфей (тот же TEncoding), и проч. "трихомундия"©.

Сейчас же все просто: в винде строки (если не уверен в кодировке) гоняешь туда-сюда при помощи WinCpToUTF8/UTF8ToWinCP, в никсах - все нативное. Красота :)
15 окт 19, 08:21    [21994254]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Док,

UTF8 так-то не особо удобная кодировка. Например, есть у тебя произвольная строка в UTF8 - как быстро узнать её длину в *символах*? А никак, тупо распарсить полностью.
Плюс операции вроде if s[10] = 'a' {lat} then s[10] := 'a' {cyr}; - это ад для UTF8.

Так что UTF16 самое оно. Где его не хватает - UTF32.
15 окт 19, 10:16    [21994325]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
ИМХО где UTF8 может быть оправдана - это каналы передачи данных, БД и прочие места, где критично занимаемое место, а сами строки почти никогда не изменяются.
15 окт 19, 10:18    [21994328]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
alekcvp
Док,

UTF8 так-то не особо удобная кодировка. Например, есть у тебя произвольная строка в UTF8 - как быстро узнать её длину в *символах*? А никак, тупо распарсить полностью.

Это не так :) С утф8 как раз все просто и понятно. И обычно достаточно для большинства языков, если ты не пишешь программы на тайском или суахили
15 окт 19, 12:17    [21994473]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31199

15.10.2019 10:16, alekcvp пишет:
>
> Так что UTF16 самое оно.

нихера ни разу.
в UTF16 тоже есть суррогатные пары.

Posted via ActualForum NNTP Server 1.5

15 окт 19, 12:58    [21994520]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Мимопроходящий
нихера ни разу.
в UTF16 тоже есть суррогатные пары.

Суррогатные пары есть даже в AnsiString, насколько я помню. Но речь-то не про них.
15 окт 19, 13:03    [21994531]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Док
Это не так :) С утф8 как раз все просто и понятно. И обычно достаточно для большинства языков, если ты не пишешь программы на тайском или суахили

Что не так? Вот есть у тебя дельфийская строка - у неё длина в символах равна длине в байтах/размер символа. А как определить длину строки UTF8 с латиницей и кириллицей вперемешку?
15 окт 19, 13:05    [21994534]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
alekcvp
Суррогатные пары есть даже в AnsiString, насколько я помню

Мультибайт это не суррогатные пары.

alekcvp
Что не так? Вот есть у тебя дельфийская строка - у неё длина в символах равна длине в байтах/размер символа

Вот это и не так. Суррогатная пара требует два кодпоинта, и преобразована она будет в один. Все кодпоинты за пределами BMP будут кодироваться суррогатными парами.

Но это всё равно проще, чем чекать все последовательности UTF-8. UTF-8 не для обработки строк - строго для хранения и передачи.
15 окт 19, 13:20    [21994561]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Да уж работать с utf8 это почти также геморно как работать с base64.
15 окт 19, 13:40    [21994616]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Вот сколько кодю, ни разу не понадобилось узнавать, что же за символ по конкретному индексу в строке...
15 окт 19, 14:33    [21994671]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Василий 2
Вот сколько кодю, ни разу не понадобилось узнавать, что же за символ по конкретному индексу в строке...

Что, ни разу не использовали конструкцию s[x] := ... ?
15 окт 19, 14:55    [21994694]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
alekcvp
А как определить длину строки UTF8 с латиницей и кириллицей вперемешку?

я не совсем тебя понял, тебе что надо-то в конце концов? Длину "дельфийской" строки в Лазаре? Юзай UTF8Length из LazUTF8.

Если тебе надо посимвольно, то ищешь посредством UTF8Pos(первый аргумент может быть и строкой, и Char'ом). Если побайтно, то загоняй свою строку в RawByteString и ползай по ней, куда угодно. Там все аналогично дельфям :)
15 окт 19, 15:06    [21994703]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Василий 2
Вот сколько кодю, ни разу не понадобилось узнавать, что же за символ по конкретному индексу в строке...

ну, не скажи. Неужели ни разу строку не парсил? :)
15 окт 19, 15:07    [21994704]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Док
Длину "дельфийской" строки в Лазаре? Юзай UTF8Length из LazUTF8.

Ну вот и сравни скорость этой функции с дельфийской Length().
15 окт 19, 15:22    [21994718]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31199

15.10.2019 15:22, alekcvp пишет:
> Ну вот и сравни скорость этой функции с дельфийской Length().

ога.
а тёплое сравни с мягким.

Posted via ActualForum NNTP Server 1.5

15 окт 19, 15:49    [21994749]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
alekcvp
Ну вот и сравни скорость этой функции с дельфийской Length().

так тебе шашечки или ехать? ©

Для нафига тебе посимвольный доступ? Хочешь быстро, заполняй строкой массив байт и вперде. Будет работать гарантированно на любой кодовой странице. Правда, возни больше :)
15 окт 19, 16:58    [21994838]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Василий 2,

повезло. у нас - то сплошь и рядом. utf8 в лазаре знатно добавил работы
15 окт 19, 17:21    [21994853]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Док
так тебе шашечки или ехать? ©
Если продолжить аналогии то Utf18 - такси с шашечками, а Utf8 - велосипед "чтобы ехать".

У лучше на такси. ;)
15 окт 19, 17:33    [21994860]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
utf8 в лазаре знатно добавил работы

Что вам мешает использовать UnicodeString?
15 окт 19, 17:54    [21994872]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
alekcvp
Что, ни разу не использовали конструкцию s[x] := ... ?

Обычно этот х не берется с потолка, а как-то вычисляется. соответственно без разницы, какой будет этот х, и какой вообще формат строк - utf8, ansi или utf16 - итоговый код одинаков для всего.
Док
ну, не скажи. Неужели ни разу строку не парсил? :)

Парсил конечно, но как-то так получалось, что все служебные символы были ANSI и проверялись в цикле, а все остальные заглатывались скопом.
Типа такого (полу-псевдокод)
for i := 1 to Length(s) do
  if s[i] = '{' then
  begin
    endpos := PosEx(s, '}', i);
    contents := Copy(s, i, endpos - i);
    i := endpos;
  end;
15 окт 19, 18:33    [21994887]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Kazantsev Alexey
makhaon
utf8 в лазаре знатно добавил работы

Что вам мешает использовать UnicodeString?

По-хорошему, тогда уж UCS4String. Иначе один фиг суррогатные пары могут добавить веселья
15 окт 19, 18:35    [21994888]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
makhaon
utf8 в лазаре знатно добавил работы

Дим, если не секрет, где конкретно и на какой платформе?
15 окт 19, 18:40    [21994892]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Василий 2
По-хорошему, тогда уж UCS4String. Иначе один фиг суррогатные пары могут добавить веселья

UCS4 для всего это слишком жирно, но в определённых сценариях вполне себе вариант. А с суррогатами в UTF-16 всё довольно просто, буквально пара условий.
15 окт 19, 18:46    [21994896]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Василий 2
Типа такого (полу-псевдокод)

Без UTF8...-аналогов сомневаюсь. На никсах прокатит, а на винде - фиг, если только строка не явно 1-байтовая. Попробуй сам, "погуляй" отладчиком в виндовом Лазаре по String'у - он будет 2х-байтовым :)
15 окт 19, 18:48    [21994897]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
На самом деле, по-хорошему, для переносимого кода работа с char должна быть строго ограничена ansi диапазоном. Все остальные случаи должны использовать функции типа GetCharAt или GetNextChar, возвращающие UCS4, либо строки.
Например - делаем мы функцию Split с разделителем-символом на Delphi со строками в utf16. Всё было хорошо, пока кто-то не захотел расщепить строку по символу 1F708 ALCHEMICAL SYMBOL FOR AQUA VITAE. И всё, облом.
15 окт 19, 18:49    [21994899]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Док
Василий 2
Типа такого (полу-псевдокод)

Без UTF8...-аналогов сомневаюсь. На никсах прокатит, а на винде - фиг, если только строка не явно 1-байтовая. Попробуй сам, "погуляй" отладчиком в виндовом Лазаре по String'у - он будет 2х-байтовым :)

В смысле, в чем сомневаешься? Код универсальный под любую кодировку строк.
Про отладчик в Лазаре не напоминай... это боль и страдания
15 окт 19, 18:53    [21994902]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Василий 2
Код универсальный под любую кодировку строк.

в этом. Попробуй сделать под виндой
var
  TmpStr: String = 'ЖЗИфыв';
begin
  if pos('ф', TmpStr) = 4
    then
      Self.Caption:= 'ага'
    else
      Self.Caption:= 'ой';
end;

Потом поделишься впечатлениями :)
15 окт 19, 19:10    [21994916]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Василий 2
Например - делаем мы функцию Split с разделителем-символом на Delphi со строками в utf16. Всё было хорошо, пока кто-то не захотел расщепить строку по символу 1F708 ALCHEMICAL SYMBOL FOR AQUA VITAE. И всё, облом.

Это вопрос элементарного дизайна:
...
      Function Split(Const ASeparator : Common.Types.UnicodeString) : TSubStrings; Overload;
      Function Split(Const ASeparator : WideChar) : TSubStrings; Overload;
15 окт 19, 20:14    [21994958]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Док,

на линукске. у нас довольно много обработки строк посимвольно. кровушки попило, но уже вылизали.
15 окт 19, 21:54    [21994993]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Василий 2
Обычно этот х не берется с потолка, а как-то вычисляется. соответственно без разницы, какой будет этот х, и какой вообще формат строк - utf8, ansi или utf16 - итоговый код одинаков для всего.

Код в программе - да, а вот под капотом: UTF16 - пишем новый символ на место старого, UTF8 - при замене латинского символа на кириллицу, например, там будет куча операций, потому что под кириллицу надо больше места, чем под латиницу.
15 окт 19, 22:32    [21995003]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
program Test1;

{$mode delphiunicode}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes,
  SysUtils,
  graphtype,
  intfgraphics,
  lazcanvas,
  fpimage,
  fpcanvas,
  types
  { you can add units after this };

var
  i        : integer;
  RawImage : TRawImage;
  Img      : TLazIntfImage;
  CV       : TLazCanvas;
  Col      : TFPColor;
begin
  try
    WriteLn('Start');
    RawImage.Init;
    RawImage.Description.Init_BPP32_A8R8G8B8_BIO_TTB(1280, 1024);
    RawImage.CreateData(True);

    Img:=TLazIntfImage.Create(0,0);
    try
      Img.SetRawImage(RawImage);
      CV:=TLazCanvas.Create(img);
      try
        CV.Brush.FPColor:=colWhite;
        CV.FillColor(colTransparent);
        Col.Red:=65535;
        Col.Green:=0;
        Col.Blue:=0;
        for i:=50 to 200 do begin
          Col.Alpha:=(i+50)*255;
          CV.Pen.FPColor:=Col;
          CV.Line(i*2,50,i*2,450);
        end;
        Img.SaveToFile('1.bmp',TLazWriterBMP.Create);
        WriteLn('1.bmp written');
        Img.SaveToFile('1.png',TLazWriterPNG.Create);
        WriteLn('1.png written');
      finally
        CV.Free;
      end;
    finally
      Img.Free;
    end;
  except
    on E: Exception do begin
      WriteLn('Error: '+E.Message);
    end;
  end;
  ReadLn;
end.

Изображения на диске не прозрачные а черные. Что я делаю не так?
15 окт 19, 22:46    [21995009]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
И еще вопрос.

Можно ли как нибудь настроить удаленную отладку на headless линуксе из винды?

Желательно без ручного запихивания каждый раз запускаемого файла и кучи телодвижений.
Хотелось бы как в дельфях с PAServer-ом.

Ну или "хотя бы как".

Что куда ставить и жать?
15 окт 19, 22:49    [21995011]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Первый вопрос снимаю, сам разобрался.

        Png:=TLazWriterPNG.Create;
        Png.UseAlpha:=True;
        Img.SaveToFile('1.png',Png);
15 окт 19, 22:52    [21995012]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Док
в этом. Попробуй сделать под виндой

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

alekcvp
Код в программе - да, а вот под капотом: UTF16 - пишем новый символ на место старого, UTF8 - при замене латинского символа на кириллицу, например, там будет куча операций, потому что под кириллицу надо больше места, чем под латиницу.

Так в utf16 ты тоже в общем случае не можешь быть уверен, что заменяемый либо заменяющий символ не является суррогатной парой. Т.е., по большому счету, закладываться на это надо всегда, чтобы потом через пару лет не словить неприятный Ой.
Да даже нельзя быть уверенным, что WideString[N] - это именно N-й символ (правильнее, codepoint). Просто итерация по utf16 чуть быстрее и проще, но по-прежнему необходимо перебирать всю строку, чтобы найти N-й символ.
16 окт 19, 09:54    [21995170]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Василий 2
Да даже нельзя быть уверенным, что WideString[N] - это именно N-й символ (правильнее, codepoint).

Это всё из-за богомерзких эмодзи...
16 окт 19, 10:14    [21995199]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Василий 2,
Кстати, почитал тут интернетики и выяснил, что почти все стандартные функции C# не умеют работать с суррогатными парами, как и дельфийские.
16 окт 19, 10:28    [21995222]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26656
alekcvp
почти все стандартные функции C# не умеют работать с суррогатными парами

Что такое "суррогатные пары"?
16 окт 19, 10:31    [21995227]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
wadman
alekcvp
почти все стандартные функции C# не умеют работать с суррогатными парами

Что такое "суррогатные пары"?

https://ru.stackoverflow.com/questions/575494/Что-такое-unicode-и-как-с-ним-связана-utf-8
16 окт 19, 10:45    [21995244]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
alekcvp
Василий 2,
Кстати, почитал тут интернетики и выяснил, что почти все стандартные функции C# не умеют работать с суррогатными парами, как и дельфийские.
вот по этому я за utf-8, с ним явно приходится применять все разборы, а не надеяться на то что прокатит
16 окт 19, 12:18    [21995350]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
wadman
Что такое "суррогатные пары"?

Тролль!


kealon(Ruslan)
вот по этому я за utf-8

Про большому счету, наверное, нет разницы с utf16, если писать проект с нуля. Все равно придется поменять специальные функции для работы со строками или явно приводить к однобайтовым. Но вот старый код переделывать - это ахтунг.
16 окт 19, 13:08    [21995396]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
kealon(Ruslan)
с ним явно приходится применять все разборы...

Ну да, когда секса в жизни не хватает, этот вариант самое оно.
16 окт 19, 13:28    [21995411]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26656
Док
Тролль! Картинка с другого сайта.

Не угадал. :) я мельком прочитал не "пары", а "параметры" и удивился.
16 окт 19, 13:47    [21995437]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
Kazantsev Alexey
kealon(Ruslan)
с ним явно приходится применять все разборы...

Ну да, когда секса в жизни не хватает, этот вариант самое оно.
да бросьте вы, пара итераторов никого не убили
16 окт 19, 14:15    [21995479]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
kealon(Ruslan)
Kazantsev Alexey
пропущено...

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

В C++ тоже поначалу так думали. Теперь итераторы захватили мир.
16 окт 19, 14:21    [21995487]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
ёёёёё
В C++ тоже поначалу так думали. Теперь итераторы захватили мир.
есть "сложность", есть способ её спрятать
не вижу никаких проблем, ну за исключением того что надо знать как всё внутри крутится, но мы ж прогарммисты или кто?
16 окт 19, 14:25    [21995498]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
kealon(Ruslan)
ёёёёё
В C++ тоже поначалу так думали. Теперь итераторы захватили мир.
есть "сложность", есть способ её спрятать
не вижу никаких проблем, ну за исключением того что надо знать как всё внутри крутится, но мы ж прогарммисты или кто?

Это да, мы лучше всех, не убавить, ни прибавить.
16 окт 19, 14:26    [21995500]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
kealon(Ruslan)
да бросьте вы, пара итераторов никого не убили

Итераторы это медленно. И ради чего, собственно?
16 окт 19, 14:38    [21995529]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
alekcvp
Василий 2,
Кстати, почитал тут интернетики и выяснил, что почти все стандартные функции C# не умеют работать с суррогатными парами, как и дельфийские.

Вполне допускаю, кажущаяся простота utf16 на это провоцирует. utf8 действительно вынуждает закладываться на все случаи и использовать правильные средства
16 окт 19, 14:55    [21995571]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Что никто не знает?

"Можно ли как нибудь настроить удаленную отладку на headless линуксе из винды?

Желательно без ручного запихивания каждый раз запускаемого файла и кучи телодвижений.
Хотелось бы как в дельфях с PAServer-ом.

Ну или "хотя бы как".

Что куда ставить и жать?"
16 окт 19, 15:32    [21995639]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Я не пользовался, но первая строчка из гугла ведёт сюда: https://wiki.freepascal.org/Remote_Debugging
16 окт 19, 15:43    [21995655]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
alekcvp
Кстати, почитал тут интернетики и выяснил, что почти все стандартные функции C# не умеют работать с суррогатными парами, как и дельфийские.

Ничего не скажу на счёт C#, но в дельфийской RTL проверка на суррогатные пары есть.
16 окт 19, 15:56    [21995675]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1891
Док
kealon(Ruslan)
вот по этому я за utf-8

Про большому счету, наверное, нет разницы с utf16, если писать проект с нуля.

если эти строки пойдут куда-то дальше, наверное, есть
16 окт 19, 16:05    [21995686]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey
rgreat,

Я не пользовался, но первая строчка из гугла ведёт сюда: https://wiki.freepascal.org/Remote_Debugging

Я там был но ответа не нашел.
16 окт 19, 16:19    [21995702]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Kazantsev Alexey
alekcvp
Кстати, почитал тут интернетики и выяснил, что почти все стандартные функции C# не умеют работать с суррогатными парами, как и дельфийские.

Ничего не скажу на счёт C#, но в дельфийской RTL проверка на суррогатные пары есть.

И что, Length() корректную длину возвращает? Pos() тоже их учитывает? Copy()? Delete()?..
16 окт 19, 19:25    [21995825]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
alekcvp
И что, Length() корректную длину возвращает? Pos() тоже их учитывает? Copy()? Delete()?..

Эти функции оперируют не символами и даже не кодпоинтами, а элементами из которых состоит строка.
16 окт 19, 20:13    [21995838]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Что такое "элемент" строки в этом контексте?
16 окт 19, 20:21    [21995846]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Что такое "элемент" строки в этом контексте?

For single-byte and multibyte strings, Length returns the number of bytes used by the string. Example for UTF-8:

Writeln(Length(Utf8String('1¢'))); // displays 3

For Unicode (WideString) strings, Length returns the number of bytes divided by two.
16 окт 19, 20:23    [21995847]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Трешак.
16 окт 19, 20:29    [21995850]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Трешак.

Дока.

Но если угодно, можно сказать что юникодовые состоят из двухбайтовых элементов, которые можно считать символами UCS-2.
16 окт 19, 20:36    [21995851]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Вот, кстати, ссылочка, где прямо говорится об элементах строк: http://docwiki.embarcadero.com/RADStudio/Rio/en/Unicode_in_RAD_Studio#New_String_Type:_UnicodeString
Characters in UTF-16 may be 2 or 4 bytes, so the number of elements in a string is not necessarily equal to the number of characters. If the string has only BMP characters, the number of characters and elements are equal.
16 окт 19, 20:46    [21995854]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey
Но если угодно, можно сказать что юникодовые состоят из двухбайтовых элементов, которые можно считать символами UCS-2.
Меня печалит то что работа функции Length не постоянна.
Ладно бы она всегда выдавала кол-во символов, или всегда количество байт. Можно было бы писать нормальный код.
Но в текущей реализации это "скажи привет" условной компиляции и миллиону ifdef.
16 окт 19, 21:02    [21995859]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61464
rgreat> Но в текущей реализации это "скажи привет" условной компиляции и миллиону ifdef.

Можно же свою написать, зачем директивы втыкать.

P.S. Не знал, что кто-то использует UCS.

Posted via ActualForum NNTP Server 1.5

16 окт 19, 21:17    [21995867]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

rgreat
Ладно бы она всегда выдавала кол-во символов

Каких символов? Нормализованных? В какой форме нормализации?

rgreat
или всегда количество байт

Размер в байтах без ифдефов и условной компиляции:
Length(s) * SizeOf(Char)
16 окт 19, 21:25    [21995870]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
rgreat
Kazantsev Alexey,
Что такое "элемент" строки в этом контексте?

Kazantsev Alexey,

Ну то есть сферическими конями в вакууме. Если для UTF-8 она возвращает хотя бы длину строки в байтах, то для UnicodeString она вообще бесполезна получается.
16 окт 19, 22:04    [21995882]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
alekcvp
Ну то есть сферическими конями в вакууме.

Нет.

alekcvp
то для UnicodeString она вообще бесполезна получается

Почему бесполезна и чем лучше размер в байтах?
16 окт 19, 22:13    [21995885]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Kazantsev Alexey
Почему бесполезна и чем лучше размер в байтах?

А какой толк от функции, которая возвращает длину строки не в байтах и не в символах?..
Это как возвращать размер прямоугольника на экране не в пикселах и не в сантиметрах, а в енотах. Причём каждый енот разной длины (суррогатные пары), если тебе нужен точный размер (кол-во символов) - всё равно придётся заново линейкой померять (распарсить). А если в байтах - то зачем было на 2 умножать?
16 окт 19, 22:52    [21995913]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Kazantsev Alexey,

Кстати, про Pos() написано:
Pos searches for Substr within S and returns an integer value that is the index of the first character of Substr within S. Pos is case-sensitive. If Substr is not found, Pos returns zero.
Она суррогатные пары учитывает?
16 окт 19, 22:54    [21995914]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
alekcvp
А какой толк от функции, которая возвращает длину строки не в байтах и не в символах?..
Это как возвращать размер прямоугольника на экране не в пикселах и не в сантиметрах, а в енотах. Причём каждый енот разной длины (суррогатные пары), если тебе нужен точный размер (кол-во символов) - всё равно придётся заново линейкой померять (распарсить).

Я и тебя спрошу о символах. Каких символов? Нормализованных? В какой форме нормализации? Без ответа на этот вопрос тебе даже UTF-32 не поможет.

alekcvp
Она суррогатные пары учитывает?

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

И как я уже говорил, можно считать, что:
юникодовые состоят из двухбайтовых элементов, которые можно считать символами UCS-2

Если быть ещё более точным, то это кодпоинты BMP.
16 окт 19, 23:35    [21995927]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey
rgreat,

Каких символов? Нормализованных? В какой форме нормализации?

Char, SizeOf(Char)
16 окт 19, 23:44    [21995932]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Char, SizeOf(Char)

А сейчас не количество чаров возвращается?
16 окт 19, 23:50    [21995936]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Я-то откуда знаю. Я неделю на лазаре пишу.
17 окт 19, 00:13    [21995945]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Но судя по твоему "Writeln(Length(Utf8String('1¢'))); // displays 3" - нет.
17 окт 19, 00:14    [21995947]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Но судя по твоему "Writeln(Length(Utf8String('1¢'))); // displays 3" - нет.

Так Utf8String - это байтовая строка. С чего бы Length должна возвращать количество Char для байтовой строки???
17 окт 19, 00:22    [21995950]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Потому что UTF8 не байтовая строка. Это строка с вариативным размером char.

По законам здравого смысла Length строки должен выдавать количество символов в ней.
А s[n] возвращать символ под номером n.
17 окт 19, 01:08    [21995964]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Для выявления же размера в байтах по хорошему надо использовать нечто вроде System.SysUtils.ByteLength(s).
Особенно в случае UFT8 и т.п.
17 окт 19, 01:11    [21995966]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Потому что UTF8 не байтовая строка. Это строка с вариативным размером char.

Ты не фантазируй, а на декларацию типа смотри. Она байтовая.
17 окт 19, 01:22    [21995969]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Они все в памяти "байтовые".
Только суть от этого не меняется. Раз уж строка состоит из разных видов char то по этим char к ней и надо по логике вещей доступ делать.

Это будет универсально а не как нынче с зоопарком подходов.

А с байтами надо бы работать через байты а не через индекс символа в строек.
17 окт 19, 01:27    [21995972]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Они все в памяти "байтовые"

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

rgreat
Раз уж строка состоит из разных видов char

В том то и дело, что состоит она из однобайтовых элементов.
17 окт 19, 01:36    [21995973]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Да я в курсе что в дельфе UTF8String это вообще AnsiSting.

Только радоватся этому я смысла не вижу.
17 окт 19, 01:54    [21995974]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Да я в курсе что в дельфе UTF8String это вообще AnsiSting.

Оно и в FPC так.

rgreat
Только радоватся этому я смысла не вижу.

А я не вижу смысла сокрушаться по этому поводу. Могу повторить ещё раз - UTF-8 не для манипуляций со строками, это компактная кодировка для хранения и передачи юникода.
17 окт 19, 02:03    [21995975]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Так-то оно так, но чем тогда UTF8String лучше обычного TBytes?
Нафига он такой ущербный нужен?
17 окт 19, 03:20    [21995977]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
rgreat
Kazantsev Alexey,

Так-то оно так, но чем тогда UTF8String лучше обычного TBytes?
Нафига он такой ущербный нужен?
лишние сущности это плохо, а невыделенная сущность это ещё хуже
17 окт 19, 09:11    [21996053]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
rgreat
Так-то оно так, но чем тогда UTF8String лучше обычного TBytes?
Нафига он такой ущербный нужен?


Используй UTF8Lenght() vs Lenght(), UTF8Pos() vs Pos()... Что-то мешает этому?

Они корректно работают что с UTF8String(AnsiString(CP_UTF8)/RawByteString(AnsiString(CP_NONE)), что co String (которая в винде ведет себя, как 2-байтовая AnsiString, а в линуксе [если я правильно помню] - как 1-байтовая).

Еще бы я посоветовал глянуть сюда и сюда. Возможно, это внесет какую-то ясность.
17 окт 19, 09:34    [21996072]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
было (Delphi), стало (FPC)

 TempCnt := Min(Length(s1), l);
 for i := 1 to TempCnt do
 begin
  c := s1[i];
  if (c <> '"')
   {and (c <> '''')}//исправил - не было мягких знаков
   and not CharInSet(c, [#0..#9, #11, #12, #14..#20]) then //исправил - не было переносов
   Result := Result + c
  else
   Result := Result + ' ';
 end;


 TempCnt := Min(Utf8Length(s1), l);
 for i := 0 to TempCnt - 1 do
 begin
  CPLen := UTF8CodepointSize(p);
  c := p[0];
  if (c <> '"')
   and not CharInSet(c, [#0..#9, #11, #12, #14..#20]) then 
   begin
    SetLength(Result, Length(Result) + CPLen);
    Move(P^, Result[Length(Result) - CPLen + 1], CPLen);
   end;
  Inc(p, CPLen);
 end;


Приходится два кода держать, да и вообще неуднобно.
17 окт 19, 10:54    [21996209]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Length возвращает количество элементов, что соответствует поведению массивов, хоть со стороны на первый взгляд и может показаться непривычным.
К тому же, повторюсь, есть очень мало случаев, когда требуется получать именно конкретный кодпоинт. В подавляющем большинстве применений if s[i]='Ы' then ... или if Pos('Гы', s) <> 0 then... или что-то вроде - всё это будет прекрасно работать и без заморочек с плавающими длинами кодпоинтов.
17 окт 19, 10:57    [21996214]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
makhaon
было (Delphi), стало (FPC)

Потому что пора бы оторваться от алгоритмов детского сада и копировать кусками
17 окт 19, 10:59    [21996222]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
makhaon
было (Delphi), стало (FPC)

Кстати, а в чем вообще проблема? Символы из набора ", #0..#9, #11, #12, #14..#20 заменяются на пробелы, так? Но ведь и составляющие суррогатной пары, и первый байт любого кодпоинта utf8 имеют особые значения, которые не перепутаешь с символами.
17 окт 19, 11:04    [21996233]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Василий 2
makhaon
было (Delphi), стало (FPC)

Потому что пора бы оторваться от алгоритмов детского сада и копировать кусками


То есть еще существенно усложнить обработку в обоих случаях? Можно. Но результат станет еще хуже. Хоть и работать будет лучше.
17 окт 19, 11:19    [21996269]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Так-то оно так, но чем тогда UTF8String лучше обычного TBytes?
Нафига он такой ущербный нужен?

Ну, например, у codepage aware строк есть COW и поддержка элементарных строковых функций, что может быть полезно при разработке, например, http сервера или клиента (для обработки заголовков не требуется переводить их в юникод-строку только для того чтобы выполнить некоторые проверки).
17 окт 19, 12:33    [21996407]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
Приходится два кода держать, да и вообще неуднобно

Что вам мешает использовать UnicodeString в FPC?
17 окт 19, 12:35    [21996414]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
Приходится два кода держать, да и вообще неуднобно.

И насколько я понимаю, этот дельфийский код работал бы без переделок даже для Utf8String.
17 окт 19, 12:48    [21996431]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
makhaon
То есть еще существенно усложнить обработку в обоих случаях? Можно. Но результат станет еще хуже. Хоть и работать будет лучше.

Нет, при использовании фрагментов строк вместо символов код будет один.
Хотя и этот нормально работает на любых строках
17 окт 19, 14:33    [21996579]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Kazantsev Alexey,

автор
Что вам мешает использовать UnicodeString в FPC?

Так еще больше править - код один и пришлось бы все string'и менять на какие-то свои с дефайнами.

автор
Нет, при использовании фрагментов строк вместо символов код будет один.
Хотя и этот нормально работает на любых строках


Лучше с кодом. Что-то не могу представить как можно сделать один код и для дефолтных string'ов delphi и fpc без дефайнов или как у меня - просто двух кусков кода.
17 окт 19, 15:54    [21996683]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
Так еще больше править - код один и пришлось бы все string'и менять на какие-то свои с дефайнами.

Пишешь {$mode delphiunicode} или {$modeswitch unicodestrings}, если нужен диалект fpc, и ничего править не нужно - дефолтные строки становятся юникодовыми.
17 окт 19, 16:11    [21996707]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
Что-то не могу представить как можно сделать один код и для дефолтных string'ов delphi и fpc без дефайнов или как у меня - просто двух кусков кода.

Приведённый тобою дельфийский код одинако работоспособен с любыми типами дефолтных строк.
17 окт 19, 16:15    [21996716]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Kazantsev Alexey,

это да. однако все api в линухе как было utf8 строки, так и останется. ну и придется лепить прокладки. так как я сейчас сделал - получились минимальные правки. когда строки в лазаре станут по дефолту как в делфи, то получится вообще один код.
17 окт 19, 16:18    [21996722]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Kazantsev Alexey,

автор
Приведённый тобою дельфийский код одинако работоспособен с любыми типами дефолтных строк.


Увы, не работало. пришлось переписывать. Ну не от хорошей жизни же правил :) Работало бы - нафиг я бы это все трогал.
17 окт 19, 16:19    [21996723]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
однако все api в линухе как было utf8 строки, так и останется. ну и придется лепить прокладки

У тебя там много работы непосредственно с API? Да и какие прокладки, конвертирование строк делается простым приведением типа. К слову, у FPC в RTL многие функции (не все) имеют перегруженные варианты для трёх типов строк: unicode, utf8 и rawbytestring.
17 окт 19, 16:21    [21996724]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
Увы, не работало. пришлось переписывать.

Я конечно не проверял, но у тебя там заменяемые символы не выходят из диапазона ASCII. Ни один спец символ используемый для кодирования последовательностей utf8 не будет заменён (т.к. все они имеют старший бит установленный в единицу), следовательно последовательности нарушены не будут.
17 окт 19, 16:26    [21996727]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Kazantsev Alexey,

автор
У тебя там много работы непосредственно с API? Да и какие прокладки, конвертирование строк делается простым приведением типа. К слову, у FPC в RTL многие функции (не все) имеют перегруженные варианты для трёх типов строк: unicode, utf8 и rawbytestring.

Хватает всякого, кода полмиллиона строк.

автор
Я конечно не проверял, но у тебя там заменяемые символы не выходят из диапазона ASCII.

Точно не работало. Впрочем можно попробовать перепроверить. Ну и это не единственное место. Просто относительно простое.
17 окт 19, 16:31    [21996733]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Кусочки веселушки равномерно рзамазаны по коду:
  Pos1 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}Pos{$ENDIF FPC}(' ', s);
  Pos2 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}PosEx{$ENDIF FPC}(' ', s, Pos1 + 1);

Везде по чуть-чуть. Общая картина далека от радостной. Но работает :)
17 окт 19, 17:06    [21996768]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
makhaon
Кусочки веселушки равномерно рзамазаны по коду:
  Pos1 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}Pos{$ENDIF FPC}(' ', s);
  Pos2 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}PosEx{$ENDIF FPC}(' ', s, Pos1 + 1);

Везде по чуть-чуть. Общая картина далека от радостной. Но работает :)

Ох ё... мало того что бессмысленно это, ибо и так работает, так еще и сделано максимально коряво. Вместо того, чтобы плодить дефайны, сделали бы NativeStrPos, которая бы мапилась на соответствующую функцию из RTL и всё.
17 окт 19, 17:12    [21996775]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Василий 2
так еще и сделано максимально коряво.

зато, как красиво! В одну строку
17 окт 19, 17:16    [21996783]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Василий 2
Ох ё...

Эт точно...
17 окт 19, 17:21    [21996788]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Согласен. Нормальные строки решат весь ох е...
17 окт 19, 18:26    [21996853]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Что ж, если человек желает продолжать плодить говнокод, то медицина тут бессильна
17 окт 19, 19:43    [21996896]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Василий 2
то медицина тут бессильна

не обижай зря человека. ИМХО, иногда воркэраунд целесообразнее, чем замена свечей на работающем двигателе.
17 окт 19, 21:45    [21996958]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Док
не обижай зря человека. ИМХО, иногда воркэраунд целесообразнее, чем замена свечей на работающем двигателе.

От преумножения говнокода целесообразнее не становится, а ведь кому-то в нем еще и ковыряться
18 окт 19, 10:20    [21997145]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Василий 2,

повторюсь: строки нормальные станут - говнокод выкину. а так то как быстрое решение работает. были бы нормальные строки, проблемы бы вообще не было. уже, видно, что и в лазаре (fpc) наконец осознали и правят. и, да, ковырять больше кроме меня этот кусок некому, можешь не беспокоиться.
18 окт 19, 10:40    [21997170]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
строки нормальные станут - говнокод выкину. а так то как быстрое решение работает. были бы нормальные строки, проблемы бы вообще не было.

Строки и так нормальные... Единый код:

Delphi 10.3:
Картинка с другого сайта.

Lazarus 2.1 (trunk) {$mode delphiunicode}:
Картинка с другого сайта.

Lazarus 2.1 (trunk) {$mode delphi}:
Картинка с другого сайта.
18 окт 19, 12:14    [21997297]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
наконец пошел код, а не голословные набросы на вентилятор. у меня так:

procedure TForm6.Button1Click(Sender: TObject);
 function CopyLim(const s: string; StrBeg, StrEnd: integer): string;
 begin
  Result := Copy(s, StrBeg, StrEnd - StrBeg + 1);
 end;

 function NameFormat(const s: string): string;
 var
  Pos1, Pos2: integer;
 begin
  Pos1 := Pos(' ', s);
  Pos2 := PosEx(' ', s, Pos1 + 1);
  Result := CopyLim(s, 1, Pos1 + 1) + '.' + CopyLim(s, Pos2 + 1, Pos2 + 1) + '.';
 end;

var
 s: string;
begin
 s := 'тест тест тест';
 s := NameFormat(s);
 ShowMessage(s);
end;


Ставлю бряк перед ShowMessage
Win/Delphi показывает

К сообщению приложен файл. Размер - 489bytes
18 окт 19, 14:24    [21997458]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
Лазарь/Убунта:

К сообщению приложен файл. Размер - 1Kb
18 окт 19, 14:25    [21997460]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
финально на винде все ок:

[Window Title]
Project7

[Content]
тест т.т.

[OK]

на убунте сообщения не видно

К сообщению приложен файл. Размер - 6Kb
18 окт 19, 14:28    [21997461]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
в delphiunicode - все ок на убунте, как и ожидалось ждем этот режим дефолтно
18 окт 19, 14:32    [21997465]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
из наблюдений по поводу delphiunicode. большая часть всех строчных функций дефолтно несовместима с delphiunicode режимом. ладно бы просто api, хотя и оно все несовместимо.
что бы далеко не ходить - ShowMessage:
unit1.pas(53,15) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"
18 окт 19, 14:39    [21997470]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon,

Говнокод из палаты мер и весов работать и не должен. Если ты закладываешься на то, что символ юникода уместится в одну кодовую позицию строки - ты огребаешь. C utf-8 или utf-16 - не имеет значения (с utf-16 тебе просто везёт больше, т.к. он закрывает весь BMP. Будут там суррогаты, и эти строки для тебя окажутся "неправильными").

makhaon
unit1.pas(53,15) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"

Где тут проблема? На линуксе дефолтная кодовая страница utf-8, т.ч. приведение UnicodeString к AnsiString ни к чему ужасному не приведёт.
18 окт 19, 15:00    [21997498]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Kazantsev Alexey
т.к. он закрывает весь BMP

т.к. его одиночные кодовые позиции закрывают весь BMP.
18 окт 19, 15:02    [21997499]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
makhaon,
+1

Я тоже пока не понимаю оптимизма про юникод. Все utf8, все вручную с явным приведением типов
18 окт 19, 15:06    [21997506]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
для своих границ применения этих строк и кода достаточно
18 окт 19, 15:21    [21997519]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
автор
Где тут проблема? На линуксе дефолтная кодовая страница utf-8, т.ч. приведение UnicodeString к AnsiString ни к чему ужасному не приведёт.

то есть - работа с кодовыми позициями utf16 это говнокод, а куча варнингов по коду - это все отлично? ясно-понятно.
18 окт 19, 15:25    [21997522]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
makhaon
а куча варнингов по коду - это все отлично? ясно-понятно.

Компилятор хочет от тебя явного приведения типа - чтобы убедиться, что ты знаешь, что делаешь.
18 окт 19, 16:12    [21997564]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
makhaon
автор
Где тут проблема? На линуксе дефолтная кодовая страница utf-8, т.ч. приведение UnicodeString к AnsiString ни к чему ужасному не приведёт.

то есть - работа с кодовыми позициями utf16 это говнокод, а куча варнингов по коду - это все отлично? ясно-понятно.

А я не смотрю на ворнинги. Что на них смотреть. Компиляции не мешают.
То одни, то другие. Со времён Delphi 3 много кода, что-то поменялось, стало "деприкатет".
18 окт 19, 17:42    [21997645]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
ёёёёё
А я не смотрю на ворнинги. Что на них смотреть. Компиляции не мешают.
Я бы за это как минимум лишал премии.
18 окт 19, 17:57    [21997660]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
rgreat
ёёёёё
А я не смотрю на ворнинги. Что на них смотреть. Компиляции не мешают.
Я бы за это как минимум лишал премии.

Да ну. У нас премии на результат и сроки, а не за красоту кода.
18 окт 19, 18:01    [21997669]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
ёёёёё,

Хуяк хуяк и в продакшн! (с) ;)
18 окт 19, 18:28    [21997689]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
rgreat,

именно.
18 окт 19, 18:31    [21997692]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Отличные последствия того что RTL живет в UTF8:

function AnsiUpperCase(Text: string): string;
begin
  Result:=UTF8Decode(SysUtils.AnsiLowerCase(UTF8Encode(Text)));
end;

function AnsiLowerCase(Text: string): string;
begin
  Result:=UTF8Decode(SysUtils.AnsiLowerCase(UTF8Encode(Text)));
end;
18 окт 19, 18:45    [21997704]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Упс. AnsiUpperCase в AnsiUpperCase, конечно.
18 окт 19, 18:46    [21997705]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Зачем ты это написал???
18 окт 19, 20:04    [21997756]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Потому что:
Result:=AnsiLowerCase(Result);   // Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"
18 окт 19, 20:18    [21997760]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
И да, действительно "даталосс".
18 окт 19, 20:28    [21997761]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
И да, действительно "даталосс

Весь код покажи, и что именно теряется.
18 окт 19, 20:46    [21997766]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
{$mode delphiunicode}
Картинка с другого сайта.
18 окт 19, 20:52    [21997767]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
program Test1;

{$mode delphiunicode}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes,
  SysUtils,
  graphtype,
  intfgraphics,
  lazcanvas,
  fpimage,
  fpcanvas,
  types
  { you can add units after this };

var
  RawImage : TRawImage;
  Img      : TLazIntfImage;
  CV       : TLazCanvas;
begin
  try
    RawImage.Init;
    RawImage.Description.Init_BPP32_A8R8G8B8_BIO_TTB(1280, 1024);
    RawImage.CreateData(True);

    Img:=TLazIntfImage.Create(0,0);
    try
      Img.SetRawImage(RawImage);
      CV:=TLazCanvas.Create(img);
      try
        CV.TextOut(100,100,'Text');  // Error: Not availlable

?!
18 окт 19, 21:13    [21997776]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

{$mode delphiunicode}

function TNode.NormalizedName: String;
var
  i : integer;
begin
  Result:=Name;
  if length(Result)>0 then begin
    Result:=AnsiLowerCase(Result);
    Result[1]:=AnsiUpperCase(Result[1])[1];
    for i:=1 to length(Result) do begin
      if Result[i]='i' then Result[i]:='I';
      if (i>1) and (Result[i-1]='-') then Result[i]:=AnsiUpperCase(Result[i])[1];
    end;
  end;
end;


WriteLn(Core.Nodes[1].Name);
WriteLn(Core.Nodes[1].NormalizedName);

Выводит:

МОСКВА-П-КУР
?осква-?-?ур

Подсовываю обертку AnsiUpperCase - все норм.
18 окт 19, 21:19    [21997782]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Код корявенький, конечно, но я его почти 20 лет назад такой написал. :)
18 окт 19, 21:24    [21997785]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Подсовываю обертку AnsiUpperCase - все норм.

Этот код должен выглядеть так:
type

  RTLString = AnsiString;

function NormalizedName(const Name : string): String;
var
  i : integer;
begin
  Result:=Name;
  if length(Result)>0 then begin
    Result:=string(AnsiLowerCase(RTLString(Result)));
    Result[1]:=string(AnsiUpperCase(RTLString(Result[1])))[1];
    for i:=1 to length(Result) do begin
      if Result[i]='i' then Result[i]:='I';
      if (i>1) and (Result[i-1]='-') then Result[i]:=string(AnsiUpperCase(RTLString(Result[i])))[1];
    end;
  end;
end;

Псевдоним типа исключительно для того, чтобы потом, когда RTL станет полностью UTF-16, заменить AnsiString на UnicodeString;
18 окт 19, 21:35    [21997790]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Т.е. вот так?

type
  RTLString = AnsiString;

function AnsiUpperCase(Text: string): string;
begin
  Result:=string(SysUtils.AnsiLowerCase(RTLString(Text)));
end;

function AnsiLowerCase(Text: string): string;
begin
  Result:=string(SysUtils.AnsiLowerCase(RTLString(Text)));
end;
18 окт 19, 21:42    [21997794]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
А чем UTF8Decode/UTF8Encode не катят?
18 окт 19, 21:43    [21997796]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Кстати, "когда RTL станет полностью UTF-16" RTLString да и вообще эти костыли не понадобятся.
18 окт 19, 21:44    [21997798]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Т.е. вот так?

Можно и так, да.

rgreat
А чем UTF8Decode/UTF8Encode не катят?

Ну если хочется потом это ещё раз переписать, можно и их использовать. Просто, когда в RTL будут дефолтные строки utf-16, цена тайп-каста станет нулевой, а ручное конвертирование будет продолжать делать уже ненужную работу.
18 окт 19, 21:51    [21997799]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Когда RTL будут дефолтные строки utf-16 это все вообще не понадобиться.

И уж лучше тогда сделать хуки на RTL функции. Так можно будет основной код не трогать.
--------
По TextOut не подскажешь?
Как включить у TLazIntfImage/TLazCanvas поддержку текста?
18 окт 19, 21:53    [21997800]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Можно вообще пользоваться функциями TCharacter, например TCharacter.ToUpper();

rgreat
По TextOut не подскажешь?

NotImplemented;
18 окт 19, 22:05    [21997806]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey
NotImplemented;
Привет, приехали. (с)

Нафига нужен канвас в котором нет вывода текста?!

Блин, ну ты и диверсант! Зачем ты мне его посоветовал?
Я уже неделю код под него адаптирую!
Картинка с другого сайта.
18 окт 19, 22:15    [21997809]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Блин, ну ты и диверсант! Зачем ты мне его посоветовал?

Ты не говорил, что тебе текст будет нужен. Впрочем, я всё равно не знал, что там оно не реализовано.

Тебе же, наверняка, просто подписи простенькие нужны? Сделай алфавит из картинок и всё :)
18 окт 19, 22:25    [21997811]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey
Тебе же, наверняка, просто подписи простенькие нужны? Сделай алфавит из картинок и всё :)

Как бы нет. У меня рендер картографии. ;)

Но я вот тут некие костыли нашел:
https://wiki.lazarus.freepascal.org/fcl-image#Drawing_text
18 окт 19, 22:26    [21997812]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Я нашёл пример к этому пакету:
https://github.com/graemeg/freepascal/blob/master/packages/fcl-image/examples/textout.pp
18 окт 19, 22:31    [21997814]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Что-то у меня не выходит приделать перегрузку операторов.
type
  TColor = Cardinal;

  operator := (R: TFPColor)L: TColor; // Fatal: Syntax error, "=" expected but ":=" found

implementation

operator:=(R: TFPColor)L: TColor;
begin
  L:=(R.Alpha shr 8) shl 24+
     (R.Red shr 8) shl 16 +
     (R.Green shr 8) shl 8+
     (R.Blue shr 8) ;
end;

Как?
22 окт 19, 21:52    [22000263]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Добавлял, удалалял {$mode delphiunicode} - не помогает.
22 окт 19, 21:57    [22000265]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
rgreat
Что-то у меня не выходит приделать перегрузку операторов.
Как?

А справку почитать?
Delphi allows certain functions, or "operators", to be overloaded within record declarations.
22 окт 19, 21:57    [22000266]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
alekcvp,

А, блин, туплю, это FPC :)
22 окт 19, 21:58    [22000267]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

operator := (const fpcolor : TFPColor) : TColor; inline;
begin
 result := FPColorToTColor(fpcolor);
end;

Но такой синтаксис только для диалекта {$mode objfpc}, если выбираешь диалект дельфей то и синтаксис должен быть дельфийским.
22 окт 19, 22:03    [22000270]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Спасибо, разобрался.

Как бы прикрутить implicit автоперекодировку из TFPColor в cardinal, если TFPColor - рекорд в другом модуле, а в текущем модуле - $Mode Delphi ?
22 окт 19, 22:10    [22000274]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Полагаю, можно вынести оператор в другой модуль с диалектом fpc и подключать в требуемом.
22 окт 19, 22:18    [22000280]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Прикольные игры с диалектами паскаля в одном проекте. :)
22 окт 19, 22:28    [22000285]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Почему нет, у fpc, кстати, ещё и тайп-хелперы множественные допускаются.
22 окт 19, 22:36    [22000291]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey,

Ну я тут внезапно выяснил что в дельфях тоже можно несколько хелперов иметь.
Родив наследника.
22 окт 19, 23:49    [22000332]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat,

Это совсем другое, сильно круче. В дельфийской доке вообще указано, что хелпер может иметь ancestor list, что, как бы, намекает... Однако, упс.
23 окт 19, 01:02    [22000356]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Как такое может быть?

Установил пакет Indy10. Там есть ZLib.

IDE по клику на типе переходит а компилятор не находит, даже если явно юнит указать.

К сообщению приложен файл. Размер - 21Kb
29 окт 19, 18:35    [22005495]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Решил проблему добавление каталога с ZLib в Other Unit Files.

Но непонятно почему такое происходит?
Почему не видно сорцов установленного пакета, и где это настраивается в IDE?

В дельфе я могу прописать в IDE пути к библиотекам глобально, а в лазаре как?
29 окт 19, 21:14    [22005562]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
rgreat,

в fpc.cfg
29 окт 19, 23:18    [22005602]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Руками в notepad-e?

А раздел какой?
29 окт 19, 23:33    [22005608]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Поставил Indy 10.
Пакет установился без ошибок.

Стоит добавить в проект пакет indylaz - проект перестает линковатся.
+
Compile Project, Mode: Windows, Target: Test1.exe: Exit code 1, Errors: 11
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\adler32.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\compress.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\crc32.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\deflate.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\infback.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\inffast.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\inflate.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\inftrees.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\trees.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\uncompr.obj
Test1.lpr(115,1) Error: Illegal COFF Magic while reading C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\zutil.obj

Win x64.

Если вручную копирую объектные файлы:
copy C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\x86_64-Win64-ZLib\*.obj C:\Lazarus-Linux\fpcsrc\rtl\Indy10\Protocols\ZLib\*.obj

Выдает:
+
Compile Project, Mode: Windows, Target: Test1.exe: Exit code 1, Errors: 50
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomPage
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomNotebook
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomImageListResolution
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterMenuItem
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterMenu
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterMainMenu
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterPopupMenu
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterDragImageListResolution
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterLazAccessibleObject
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterControl
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterWinControl
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterGraphicControl
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomControl
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterScrollingWinControl
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterScrollBox
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomFrame
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomForm
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterHintWindow
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomScrollBar
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomGroupBox
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomComboBox
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomListBox
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomEdit
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomMemo
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterButtonControl
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomButton
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomCheckBox
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterToggleBox
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterRadioButton
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomStaticText
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomLabel
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomBitBtn
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomSpeedButton
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterShape
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomSplitter
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterPaintBox
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomImage
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterBevel
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomRadioGroup
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomCheckGroup
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomLabeledEdit
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomPanel
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomTrayIcon
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterStatusBar
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterTabSheet
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterPageControl
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomListView
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomProgressBar
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomUpDown
Test1.lpr(115,1) Error: Undefined symbol: WSRegisterCustomToolButton


Сообщение было отредактировано: 30 окт 19, 21:40
30 окт 19, 21:40    [22006582]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
rgreat,

с таким уровнем вопросов лучше стучаться в основной буржуйский форум (а еще лучше, в mailing list), где трутся основные разрабы.
31 окт 19, 18:28    [22007493]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Печаль. Я думал тут кто-нибудь инди под лазаря юзал.
31 окт 19, 19:33    [22007528]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
В основном лазарьцы на синапсе сидят, кмк
31 окт 19, 19:39    [22007533]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
rgreat,

да нормально вроде синапс работает. дописанный вариант, к слову:
https://github.com/Makhaon/Ararat-Synapse
31 окт 19, 22:42    [22007598]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
-Rik-
Member

Откуда: Урал
Сообщений: 190
Я раньше на Delphi то же Indy юзал, как на Lazarus перешел, давно это было, Инди с ходу не взлетел, поэтому заморачиваться не стал и перешел на Синапс и не разу не пожалел. Почту отсылает-принимает, с http, ftp работает, у меня интеграция сделана с личным кабинетом Почты России, Боксберри, СДЭК, все работает абсолютно без проблем. Ещё на Синапсе TCP сервер сделал, у меня программа через него со станком общается, выдает задание, получает результат. Ну и само собой синапс работает на любой платформе, программа с ним и на Линуксе заведется и Маке и на ARM-Линуксе. Зря Вы от него нос воротите. Стоит попробовать.

Сообщение было отредактировано: 3 ноя 19, 16:58
1 ноя 19, 10:35    [22007818]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
А синапс разве не забросили?
http://synapse.ararat.cz/doc/ChangeLog.html
1 ноя 19, 12:51    [22008030]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26656
DmSer
А синапс разве не забросили?
http://synapse.ararat.cz/doc/ChangeLog.html

Кто-то забросил, кто-то подхватил. Там и так код вылизанный и минимальный в сравнении от...
1 ноя 19, 12:55    [22008034]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 356
Вот тут посвежее, отсюда беру: https://sourceforge.net/projects/synalist/
1 ноя 19, 12:56    [22008036]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
В своё время выбирал между Indy, synapse и OverbyteIcs. Делал поддержку системы платежей CreditPilot. Синапс не подошёл, т.к. периодически он зависал на вызовах https. С OverbyteIcs зависаний не было, поэтому на нём остановился. Жалею, что тогда Indy не обновил до актуальной версии, может быть и с ним бы всё пошло (на старой версии каждый https-Запрос выполнялся более секунды).
OverbyteIcs не особо нравится, всё асинхронно, работать с email очень тяжело, как реализовать TCP-сервер, который формирует ответы сложнее "hello, world", так и не удалось выяснить, а все их демки как раз уровня "hello, world".
1 ноя 19, 12:59    [22008041]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
DmSer
OverbyteIcs не особо нравится, всё асинхронно, работать с email очень тяжело, как реализовать TCP-сервер, который формирует ответы сложнее "hello, world", так и не удалось выяснить, а все их демки как раз уровня "hello, world".

Ничего особо тяжелого. Пора осваивать асинхронное мышление, блокировки уже не в моде. Тем более что там куча высокоуровневых классов для всех мыслимых протоколов.
1 ноя 19, 13:47    [22008105]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Впрочем, для одного-двух соединений и разветвлённого протокола в стиле запрос-ответ*N асинхронная модель в самом деле может оказаться избыточной. Иногда жалею, что в одной своей программе решил использовать асинхронную модель для FTP. Нахлебался с ней порядочно.
1 ноя 19, 14:06    [22008125]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
Василий 2
DmSer
OverbyteIcs не особо нравится, всё асинхронно, работать с email очень тяжело, как реализовать TCP-сервер, который формирует ответы сложнее "hello, world", так и не удалось выяснить, а все их демки как раз уровня "hello, world".

Ничего особо тяжелого. Пора осваивать асинхронное мышление, блокировки уже не в моде. Тем более что там куча высокоуровневых классов для всех мыслимых протоколов.


Асинхронное программирование на Паскале это не тоже самое, что на c#, JavaScript и других языках с поддержкой async / await. Пусть уж лучше будут блокировки.
1 ноя 19, 23:41    [22008539]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
DmSer
С OverbyteIcs зависаний не было, поэтому на нём остановился.

Кстати, уже довольно давно касперский почему-то очень агрится сильно на ссылки для скачивания ICS...
2 ноя 19, 00:19    [22008545]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
DmSer
Василий 2
пропущено...

Ничего особо тяжелого. Пора осваивать асинхронное мышление, блокировки уже не в моде. Тем более что там куча высокоуровневых классов для всех мыслимых протоколов.


Асинхронное программирование на Паскале это не тоже самое, что на c#, JavaScript и других языках с поддержкой async / await. Пусть уж лучше будут блокировки.
как либу + какой-то базовый RTL к ней напишешь так и будет
не вижу никаких причин вводить для этого синтаксический сахар, текущих языковых возможностей с лихвой хватает
2 ноя 19, 00:47    [22008551]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
kealon(Ruslan)
как либу + какой-то базовый RTL к ней напишешь так и будет
не вижу никаких причин вводить для этого синтаксический сахар, текущих языковых возможностей с лихвой хватает


В целом мне хватает Indy. С нею стиль программирование такой же удобный, как в C# / JavaScript при использовании async/await. Разница только в том, что в Indy на каждое подключение выделяется отдельный поток, а при async/await потоки выделяются при необходимости, один поток может обслуживать десятки подключений.
В другой стороны, потоки в Delphi намного легче, чем потоки в C# / JavaScript. В Delphi при создании потока выделяется порядка 16КБ ОЗУ (+ ещё 16КБ, если Windows 64-битный, а прога 32-битная). Таким образом, установить несколько тысяч потоков (если и прога и ОС - 64-битные) - не проблема. Важно с таким количеством потоков избегать использование Sleep (особенно Sleep(0)), иначе планировщик задач Windows загнётся.
Не знаю, сколько подключений можно установить на C# с его async/await. Скорее всего больше, чем в Indy (а может и меньше, тупо может начать тормозить основной поток, из которого на практике вероятнее всего начинаются await-вызовы из-за того, что будет быстро заполняться очередь сообщений у потока).
В этом плане лучше всего GoLang - у него нет потока, у которого может заполнится очередь сообщений и он начнёт тормозить при её обработке, поэтому без проблем может держать десятки тысяч подключений, причем ему для этого хватит лишь несколько десятков потоков Worker. Правда, у него есть поток диспетчеризации, который раскидывает задачи (горутины) между тредами и копирует куски стека, в него всё может упереться. Вроде такую же вещь сделали и в котлине - скрестили оба подхода - там и аналог async/await и копирование кусков стека корутин.
2 ноя 19, 09:21    [22008604]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
DmSer
В Delphi при создании потока выделяется порядка 16КБ ОЗУ (+ ещё 16КБ, если Windows 64-битный, а прога 32-битная). Таким образом, установить несколько тысяч потоков (если и прога и ОС - 64-битные) - не проблема.

А стек на каждую нить почему не учел?
2 ноя 19, 14:25    [22008708]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
DmSer,

Насколько мне известно, под нагрузкой Go упирается в GC, поэтому сейчас идут работы над его (GC) улучшением.

ёёёёё
А стек на каждую нить почему не учел?

Даже с дефолтным размером стека на 32-битах можно создать чуть более 1900 потоков. Если размер стека для нитей ограничить, то это значение будет ещё больше. Переход на 64 бита решает.
2 ноя 19, 16:06    [22008735]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Картинка с другого сайта.
2 ноя 19, 16:11    [22008738]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
ёёёёё
DmSer
В Delphi при создании потока выделяется порядка 16КБ ОЗУ (+ ещё 16КБ, если Windows 64-битный, а прога 32-битная). Таким образом, установить несколько тысяч потоков (если и прога и ОС - 64-битные) - не проблема.

А стек на каждую нить почему не учел?


16КБ - это и было про стек.
2 ноя 19, 19:49    [22008800]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
DmSer
kealon(Ruslan)
как либу + какой-то базовый RTL к ней напишешь так и будет
не вижу никаких причин вводить для этого синтаксический сахар, текущих языковых возможностей с лихвой хватает


В целом мне хватает Indy. С нею стиль программирование такой же удобный, как в C# / JavaScript при использовании async/await. Разница только в том, что в Indy на каждое подключение выделяется отдельный поток, а при async/await потоки выделяются при необходимости, один поток может обслуживать десятки подключений.
В другой стороны, потоки в Delphi намного легче, чем потоки в C# / JavaScript. В Delphi при создании потока выделяется порядка 16КБ ОЗУ (+ ещё 16КБ, если Windows 64-битный, а прога 32-битная). Таким образом, установить несколько тысяч потоков (если и прога и ОС - 64-битные) - не проблема. Важно с таким количеством потоков избегать использование Sleep (особенно Sleep(0)), иначе планировщик задач Windows загнётся.
Не знаю, сколько подключений можно установить на C# с его async/await. Скорее всего больше, чем в Indy (а может и меньше, тупо может начать тормозить основной поток, из которого на практике вероятнее всего начинаются await-вызовы из-за того, что будет быстро заполняться очередь сообщений у потока).
В этом плане лучше всего GoLang - у него нет потока, у которого может заполнится очередь сообщений и он начнёт тормозить при её обработке, поэтому без проблем может держать десятки тысяч подключений, причем ему для этого хватит лишь несколько десятков потоков Worker. Правда, у него есть поток диспетчеризации, который раскидывает задачи (горутины) между тредами и копирует куски стека, в него всё может упереться. Вроде такую же вещь сделали и в котлине - скрестили оба подхода - там и аналог async/await и копирование кусков стека корутин.
мда...
вас послушать, так шарписты и голубцы под какими то разными ОС запускают свои программы
я вот прям перекрестился, до пенсии мне работы хватит
2 ноя 19, 20:48    [22008813]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
DmSer
ёёёёё
пропущено...

А стек на каждую нить почему не учел?


16КБ - это и было про стек.

"Вопросов больше не имею" - (с).
2 ноя 19, 22:23    [22008853]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
ёёёёё
DmSer
пропущено...


16КБ - это и было про стек.

"Вопросов больше не имею" - (с).


А что не так?
2 ноя 19, 22:38    [22008862]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
kealon(Ruslan)
голубцы

никогда такого не слышал.
3 ноя 19, 00:47    [22008908]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
DmSer
А что не так?

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.
3 ноя 19, 00:56    [22008909]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Kazantsev Alexey
DmSer
А что не так?

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.

А как его поменять для потока, кстати?
3 ноя 19, 01:49    [22008918]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
alekcvp
Kazantsev Alexey
пропущено...

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.

А как его поменять для потока, кстати?

В параметрах линкера. Задается для всех создаваемых нитей приложения.

Для отдельной нити - в CreateThread() есть параметр, можно задать свое значение. Но - не меньше величины гранулярности памяти Windows, т.е. 64кБ.
3 ноя 19, 02:29    [22008922]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
Kazantsev Alexey
DmSer
А что не так?

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.


Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем.
3 ноя 19, 08:51    [22008941]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1891
DmSer
В другой стороны, потоки в Delphi намного легче, чем потоки в ... JavaScript.


DmSer
В этом плане лучше всего GoLang - у него нет потока, у которого может заполнится очередь сообщений и он начнёт тормозить при её обработке, поэтому без проблем может держать десятки тысяч подключений, причем ему для этого хватит лишь несколько десятков потоков Worker. Правда, у него есть поток диспетчеризации, который раскидывает задачи (горутины) между тредами и копирует куски стека, в него всё может упереться.


забористо
3 ноя 19, 17:43    [22009073]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
DmSer
Kazantsev Alexey
пропущено...

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.


Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем.

Прэлэстно. Особенно про постоянную оговорку "особенно".
3 ноя 19, 20:46    [22009104]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
ёёёёё
Прэлэстно. Особенно про постоянную оговорку "особенно".


Если Вы хотите что-то спросить, то спрашивайте, чего стесняться? Может я чего-то не понимаю, а благодаря Вам узнаю что-то новое.
3 ноя 19, 21:26    [22009122]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
DmSer,

нет, меня ваши бормоталки устраивают прямо в этом виде.
3 ноя 19, 22:35    [22009147]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
ёёёёё
DmSer,

нет, меня ваши бормоталки устраивают прямо в этом виде.


Слово "особенно" мною было сказано только в двух сообщениях: применительно к Sleep(0) и к 64-битным приложениям.

Виртуальное адресное пространство для 64-битных приложений упоминать нет смысла, поскольку его дохрена и при создании даже десятков тысяч тредов мы не упрёмся в его дефицит. А для 32-битных приложений, как уже было сказано выше, можно задать в параметрах линкера "max stack size" (например 64КБ) и тем самым резко увеличить максимальное число тредов. Причем следует учитывать, что для 32-битного приложения, запущенного на 64-битной винде, ОС создаёт для каждого треда 64-битный стек размером 256КБ, поэтому кол-во потоков будет меньше, чем для 32-битной винды.
При создании треда выделяется совсем небольшое физической памяти (примерно 8 - 16 КБ на стек), причем оно никак не связано с параметром "max stack size".
4 ноя 19, 00:57    [22009174]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
DmSer,

Физическая память без нужды, да, не выделяется, на старте потока 1 страница всего
Но, что бы была возможность увеличить его до max stack size нужно зарезирвировать для этого адреса на весь этот объём - а они очень быстро конечны.

По поводу, повторить то, что сделано в .Net - совсем не Rocket Science.
Если упрощённо, то там просто пул потоков разгребает нити с задачами из IOPort

Сам диспетчер написать, это строчек 500
А вот с библиотеками которые будут его поддерживать уже проблема
Даже минимум вроде работы с примитивами блокировки, файлами и сетью при переписке на overlapped-режим потянет на несколько человеко-месяцев разработки.
Если замахнуться на гуи, то объём вообще становится непосильный
4 ноя 19, 11:51    [22009274]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
Но, что бы была возможность увеличить его до max stack size нужно зарезирвировать для этого адреса на весь этот объём - а они очень быстро конечны.


Логично! Однако в реальных задачах крайне редко возникает необходимость достигать max stack size, который по умолчанию в Windows равен 1МБ. В своих программах не встречал случаев, чтобы и за 64 КБ вылезло.

По поводу, повторить то, что сделано в .Net - совсем не Rocket Science.
Если упрощённо, то там просто пул потоков разгребает нити с задачами из IOPort

Сам диспетчер написать, это строчек 500
А вот с библиотеками которые будут его поддерживать уже проблема
Даже минимум вроде работы с примитивами блокировки, файлами и сетью при переписке на overlapped-режим потянет на несколько человеко-месяцев разработки.
Если замахнуться на гуи, то объём вообще становится непосильный


Да и не нужно это переносить на Delphi. Итак всё работает, незачем ломать. Пусть лучше допилят 64-битный Android и управляемые записи.
4 ноя 19, 12:13    [22009287]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5363
Kazantsev Alexey
Даже с дефолтным размером стека на 32-битах можно создать чуть более 1900 потоков.

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}


Кстати, а так на ~2900 потоков хватит?
4 ноя 19, 14:23    [22009359]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Квейд
Кстати, а так на ~2900 потоков хватит?

На 32-битной ОС с ключём /3GB, теоретически, примерно столько. На 64-битной, теоретически, под 4 тыс. на практике (Windows 7 x64) получилось 3120.
4 ноя 19, 15:04    [22009386]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6330
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)
4 ноя 19, 19:23    [22009502]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

Ничего подобного.

Пул тоже ресурсов стоит и далеко не всегда выгоден, даже если не учитывать усложнение кода.
4 ноя 19, 19:25    [22009505]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
Siemargl

JavaScript с потоками - что то новое =)


К сожалению не могу объяснить как это в мой пост проскачило. Набираю вслепую, иногда попадает такое, о чем не задумываешься. Возможно в тот момент были мысли о nodejs. А может о java ;)
4 ноя 19, 19:40    [22009515]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
DmSer,

сделайте паузу. Вход-мееедленный выдох.
4 ноя 19, 19:56    [22009521]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1891
DmSer
Siemargl

JavaScript с потоками - что то новое =)


К сожалению не могу объяснить как это в мой пост проскачило. Набираю вслепую, иногда попадает такое, о чем не задумываешься. Возможно в тот момент были мысли о nodejs. А может о java ;)

java и javascript это ведь одно и то же
5 ноя 19, 05:05    [22009658]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)

https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое

DmSer
Асинхронное программирование на Паскале это не тоже самое, что на c#, JavaScript и других языках с поддержкой async / await. Пусть уж лучше будут блокировки.

Это все сахар, призванный помочь тем, кто не осилил асинхронное мышление, писать асинхронный код в манере синхронного. И async в JS появился не так уж давно, до этого все сидели на коллбэках, а ведь это вывих мозга покруче событий
5 ноя 19, 09:40    [22009738]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
Василий 2
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)

https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое

DmSer
Асинхронное программирование на Паскале это не тоже самое, что на c#, JavaScript и других языках с поддержкой async / await. Пусть уж лучше будут блокировки.

Это все сахар, призванный помочь тем, кто не осилил асинхронное мышление, писать асинхронный код в манере синхронного. И async в JS появился не так уж давно, до этого все сидели на коллбэках, а ведь это вывих мозга покруче событий


В JavaScript async / await - это синтактический сахар (вроде сахар, поскольку с точки зрения компиляции наверное ничего не меняется) по отношению к промайзам. Промайзы в JavaScript - был очень важный шаг к решению проблемы коллбэков, а механихм async / await кардинально упростил асинхронное программирование.

А вот является ли async / await синтактическим сахаром по отношению к C# - не уверен. Разработчики механизма async / await в C# ввели новый подход к компиляции, при котором одна функция каждым упоминанием await расщепляется на подфункции, сохраняется состояние переменных на момент вызова await.
5 ноя 19, 12:53    [22009883]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1891
Василий 2
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)

https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое


1. речь не за браузер и ссылку на до было на доку ноды давать
2. воркеры не не новость, но предназначены они для cpu-bound задач, а не для IO
5 ноя 19, 13:24    [22009907]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
DmSer
А вот является ли async / await синтактическим сахаром по отношению к C# - не уверен. Разработчики механизма async / await в C# ввели новый подход к компиляции, при котором одна функция каждым упоминанием await расщепляется на подфункции, сохраняется состояние переменных на момент вызова await.
не перенимайте эти суеверия, ничего там не расщепляется
5 ноя 19, 14:08    [22009934]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Дегтярев Евгений
1. речь не за браузер и ссылку на до было на доку ноды давать

1. Про браузер
2. Конкретики не было, просто упоминался JS
3. Нода добавила их 2018-06-20, тоже не вчера. А если по мажорным версиям смотреть, так вообще 3 версии назад
5 ноя 19, 14:22    [22009954]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1891
Василий 2,

таки в браузере уже tcp-сервера поднимать научились?
5 ноя 19, 16:00    [22010050]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
DmSer
При создании треда выделяется совсем небольшое физической памяти (примерно 8 - 16 КБ на стек), причем оно никак не связано с параметром "max stack size".


На моём ноутбуке (куплен в 2013г, Core i3, 8ГБ ОЗУ, Windows 7 64-битная) с Delphi 2007 вот что получается:
- при дефолтном max stack size удалось создать 1500 потоков, используется 104МБ ОЗУ, время создания 104мс, в среднем 70КБ на поток (32-битный + 64-битный стек).
- при max stack size 64КБ удалось создать 6000 потоков, используется 398МБ ОЗУ, время создания 351мс, в среднем 66КБ на поток (32-битный + 64-битный стек).

Код потока следующий:
procedure TMyThread.Execute;
begin
  FreeOnTerminate := True;
  InterlockedIncrement(ThreadCount);
  while not Stop do
    Sleep(1000);
  InterlockedDecrement(ThreadCount);
end;


В обоих случаях загрузка процессора = 0% (менеджер памяти при работе потоков не задействуется).

Меньше 64КБ вроде нельзя сделать max stack size.
6 ноя 19, 23:12    [22011126]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5952
DmSer,

так, на затравку было бы интересно сколько нитей можно создать - CreateFiber
6 ноя 19, 23:49    [22011137]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1114
Проверил на рабочем компьютере, проц дешёвый AMD FX-4330 Quad Core. Windows 7 32-битная.
При Max stack size = 64КБ удалось создать 28682 доп. потока, ОЗУ потребляется 862МБ, время создания 1254 мс (создаётся 22 потока за 1 мс), в среднем выходит 30КБ ОЗУ на 1 поток.
7 ноя 19, 08:55    [22011200]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Почему искажется строка?

{$MODE DELPHIUNICODE} 

var
  s1,s2 : UnicodeString;
  DS : TMemDataSet;
begin
  s1:='Северо-Кавказская';
  DS.Fields[0].AsUnicodeString:=s1;
  s2:=DS.Fields[0].AsUnicodeString;
end;


Пробовал и AsString и AsAnsiString и AsUTF8String и AsWideString.
И конвертации при присвоении.

Результат одинаков:

К сообщению приложен файл. Размер - 4Kb


Сообщение было отредактировано: 8 ноя 19, 21:25
8 ноя 19, 21:20    [22012611]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
На вход:

К сообщению приложен файл. Размер - 2Kb
8 ноя 19, 21:20    [22012612]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
Почему искажется строка?

Длины поля точно хватает?
9 ноя 19, 15:17    [22012778]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
rgreat,

а если так:

s1,s2 : string;

?
9 ноя 19, 15:18    [22012779]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Kazantsev Alexey
Длины поля точно хватает?
Однако действительно не хватает.
https://wiki.freepascal.org/Database_field_type#Size.2C_DataSize_and_Unicode
автор
Size, DataSize and Unicode
Note that for string type fields, Size indicates the number of characters that can be stored. As indicated in FPC Unicode support#Introduction, FPC up to and including 2.6 only deals with ANSI/ASCII single byte characters; it does not support Unicode/UTF8/UTF16/Unicodestring characters.

The read-only property DataSize indicates the field size in bytes.

If you use multibyte characters (e.g. UTF8 or UTF16/Unicodestring encoded), DataSize and Size do not mean the same thing. If you use only ANSI/ASCII characters, DataSize and Size are effectively the same thing.

Что-то как-то не понятно как это все с реальностью бьется ибо в поле с Size=30 текст 'Северо-Кавказская' не влазит.

В чем хранятся строки? В чем измеряется Size и DataSize?

Сообщение было отредактировано: 12 ноя 19, 17:40
12 ноя 19, 17:35    [22014689]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
b0rk
Member

Откуда: Харьков
Сообщений: 599
rgreat
В чем измеряется Size и DataSize?

В байтах. А все строки в Lazarus в UTF-8 кодировке.
12 ноя 19, 18:01    [22014721]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
b0rk,

Т.е. все Size указаные в БД локально надо умножать как минимум вдвое?
12 ноя 19, 18:16    [22014732]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
В чем хранятся строки? В чем измеряется Size и DataSize?

Зависит от типа поля. Если поле TStringFiled то это будет размер в байтах для текущей локали, если TWideStringField то размер будет в WideChar.
12 ноя 19, 18:23    [22014739]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Спасибо. Сделал так:

          with FieldDefs.AddFieldDef do begin
            Name:=FName;
{$IFDEF FPC}
            DataType:=ftWideString;
{$ELSE}
            DataType:=ftString;
{$ENDIF}
            Size:=FFieldDefs[i].Size;
          end;


Помогло.
12 ноя 19, 18:37    [22014747]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Bali
Member

Откуда:
Сообщений: 63
Скопировал из Делфи модуль
unit blVarList;

{$mode objfpc}{$H+}

interface

uses
  SysUtils, Classes, StrUtils, variants, bslStrings, IniFiles,  VarConsts, bslDBUtils, bslDateUtils;

type
  tTipVarList = (lsNone, lsDOC, lsFirma, lsPartner, lsGrPol, lsGrOtpr,
    lsPP, lsNal, lsNakl, lsGrPerevoz, lsTABNom, lsFactur);

  tTipDateVar =(
    tdCurMY, tdCurM, tdCurY,
    tdPredMY, tdPredM, tdPredY,
    tdCurPeriod, tdCurKV,
    tdFDCurMonth, tdLDCurMonth,
    tdFDNextMonth, tdLDNextMonth,
    tdFDPriorMonth, tdLDPriorMonth,
    tdCurDate,
    tdFDCurPeriod, tdLDCurPeriod,
    tdFDNextPeriod, tdLDPriorPeriod,
    tdFDCurPeriod_Int, tdLDCurPeriod_Int, tdCurPeriod_Int,
    tdFDCurPeriod_DateTime, tdLDCurPeriod_DateTime, tdCurPeriod_DateTime,
    tdDatePrn, tdDateSostavlen, tdBegDateBankOplat, tdEndDateBankOplat,
    tdBegDateBankRasPeriod, tdEndDateBankRasPeriod,
    td1_MCurKV, td2_MCurKV, td3_MCurKV,
    tdRasPeriodBegYear,
    tdBegRasPeriodDate, tdEndRasPeriodDate);

const

DateVars: array[TTipDateVar] of String =(
    'ТекМесГод', 'ТекМес', 'ТекГод',
    'ПредМесГод', 'ПредМес', 'ПредГод',
    'ТекПериод', 'ТекКвартал',
    'НачТекМесДата', 'КонТекМесДата',
    'НачСледМесДата', 'КонСледМесДата',
    'НачПредМесДата', 'КонПредМесДата',
    'ТекДата',
    'НачТекПериодДата', 'КонТекПериодДата',
    'НачСледПериодДата', 'КонПредПериодДата',
    'BegPeriodIntDate', 'EndPeriodIntDate', 'PeriodIntDate',
    'BegPeriodDate', 'EndPeriodDate', 'PeriodDate',
    'ДатаПечати', 'ДатаСоставления', 'НачСрокОплат', 'КонСрокОплат',
    'НачПериодРасПлат', 'КонПериодРасПлат',
    '1_МесТекКВ', '2_МесТекКВ', '3_МесТекКВ',
    'РасчетПериодНачГод',
    'НачРасчетПериодДата', 'КонРасчетПериодДата');
    
implementation    
    
Function GetPosDateVars(const varName: string): integer;
var
    s: string;
begin
  s := DateVars[tdCurMY];
  result := AnsiIndexText(VarName, DateVars);
end;


из Фастрепорта получаю VarName='ТекМесГод', по массиву DateVars ничего не находит result=-1, строка s='????????'.

Копирую модуль в буфер, удаляю его из Лазарус, создаю пустой модуль с таким же именем, вставляю данные из буфера, все работает как положено, переменные вставляются в отчет.

Вопрос: я что, должен сначала создать пустой модуль, а в него уже переность данные или при копировании нужно что то поднастроить?
17 ноя 19, 03:58    [22018051]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Что-то у тебя с кодировкой pas файла, походу, раз константы уплыли.
17 ноя 19, 06:22    [22018058]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Bali
Member

Откуда:
Сообщений: 63
rgreat,
Все там нормально с кодировкой, все работает.
Вопрос не в этом, а как переносить правильно из делфи в лазарус.
Если я сначала создаю модуль в Лазарус, а затем в него через буфер обмена копирую содержимое делфи модуля, то все работает,
а если я копирую делфи модуль в папку с лазарусом, то не работает по массиву строк.
17 ноя 19, 14:29    [22018189]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
Bali
rgreat,
Все там нормально с кодировкой, все работает.
Вопрос не в этом, а как переносить правильно из делфи в лазарус.
Если я сначала создаю модуль в Лазарус, а затем в него через буфер обмена копирую содержимое делфи модуля, то все работает,
а если я копирую делфи модуль в папку с лазарусом, то не работает по массиву строк.

А лазарус модули не в UTF-8 сохраняет? Потому что дельфя, по-умолчанию, в Win.
17 ноя 19, 14:49    [22018193]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Bali
Member

Откуда:
Сообщений: 63
alekcvp,
Да, абсолютно точно, а из буфера перекодирует.
17 ноя 19, 16:37    [22018232]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alikisay
Member

Откуда:
Сообщений: 1
Bali,
Лазарь все исходники сохраняет в кодировке UTF8. Delphi в кодировке по умолчанию системы.
Вообще походу Лазарь заточили на этот дебильный высер - UTF8 только для совместимости с linux. Возможно иного приемлимого решения не нашлось.
Всё это конечно крайне печально. Весь опыт работы со строками приходится переосмысливать, самописные библы выкидывать в мусорку.
После такого начинаешь задумываться, а надо ли оно это переходить из загибающегося Дельфя в Лазарь, если всё одно предыдущим опытом не попользуешься толком, и дебилизмов С++ все одно избежать не удастся. Мож уж луче встраиваться в когорту программистов от микрософта, которым специально запрещают думать об исключении паразитного кода и лишних операций. Которым когда говоришь про оптимизацию кода, то они впадают в истерику, катаются по полу, сучат ногами и орут, что не вставляют нигде делаев.
Сижу пишу прием SMSок с мамеда, и думаю: ну ладно щас я это сделаю, как нибудь решу, но вот в дальнейшем оно мне это надо???
29 дек 19, 04:14    [22050959]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
alikisay,

Я, попробовав кодить на лазаре, предпочитаю без крайней необходимости на нем не кодить.

А единственная причина на данный момент кодить на лазаре для меня - кроссплатформенная (линукс) графика. С этим в дельфях пока все плохо.

В остальном же дельфи несравнимо удобней и продуманней.

Сообщение было отредактировано: 29 дек 19, 08:00
29 дек 19, 07:59    [22050970]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
alikisay,

Delphi "загибается" уже больше 20ти лет. И еще, думаю, как минимум, будет столько "загибаться". Поэтому можешь спокойно на нем дальше и работать.
И, да, Лазарь и fpc собирается переводить строки дефолтно на такие же как в Делфи. По срокам не скажу.
29 дек 19, 09:14    [22050974]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
rgreat
В остальном же дельфи несравнимо удобней и продуманней.

После лазаревой LCL на дельфийскую VCL смотреть не хочется.
29 дек 19, 11:58    [22051018]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2526
rgreat
alikisay,

Я, попробовав кодить на лазаре, предпочитаю без крайней необходимости на нем не кодить.

А единственная причина на данный момент кодить на лазаре для меня - кроссплатформенная (линукс) графика. С этим в дельфях пока все плохо.

В остальном же дельфи несравнимо удобней и продуманней.


хороший IDE, хороший компилятор - что еще нужно, чтобы встретить старость :)
29 дек 19, 13:12    [22051034]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
makhaon
alikisay,

Delphi "загибается" уже больше 20ти лет. И еще, думаю, как минимум, будет столько "загибаться". Поэтому можешь спокойно на нем дальше и работать.
И, да, Лазарь и fpc собирается переводить строки дефолтно на такие же как в Делфи. По срокам не скажу.

Если не волнуют проблемы по дальнейшему трудоустройству в качестве программиста или не волнует проблема "где взять кадры" - можно и дельфи, и VFP и Clarion продолжать использовать.
ЗЫ: меня - не волнуют, дельфи наверняка меня переживет, просто скучно, много ограничений, "комьюнити" - одни старперы да маргиналы, нафталин с прошедшим сроком годности, короче.
29 дек 19, 15:10    [22051071]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
ёёёёё,

автор
ЗЫ: меня - не волнуют, дельфи наверняка меня переживет, просто скучно, много ограничений, "комьюнити" - одни старперы да маргиналы, нафталин с прошедшим сроком годности, короче.


Не волнуют. Скучать с работой вот ни разу не приходится :) Почти не дня. В проектах движухи выше крыши. Ограничения есть в каждом языке, иначе бы остался просто один для всего. Комьюнити может и старперы, зато всегда есть кого спросить и дождаться внятного ответа, впрочем неофитов хватает.
29 дек 19, 21:20    [22051202]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1588
alikisay
Bali,
Лазарь все исходники сохраняет в кодировке UTF8. Delphi в кодировке по умолчанию системы.
Вообще походу Лазарь заточили на этот дебильный высер - UTF8 только для совместимости с linux. Возможно иного приемлимого решения не нашлось.
Всё это конечно крайне печально. Весь опыт работы со строками приходится переосмысливать, самописные библы выкидывать в мусорку.


А как связана кодировка исходника с работой со строками?
Разве нельзя работать с обычными строками при юникодном исходнике?
И наоборот - работать с юникодными строками при исходнике в ansi?
30 дек 19, 07:37    [22051287]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
fraks,

Когда весь rtl в utf8 а работать надо с utf16 кодинг превращается в фееричную и непрерывную генерацию подпорок.
30 дек 19, 11:50    [22051399]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1588
rgreat

Когда весь rtl в utf8 а работать надо с utf16 кодинг превращается в фееричную и непрерывную генерацию подпорок.

И опять непонятно какая связь кодировки исходника .pas и работы rtl.
30 дек 19, 12:35    [22051434]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
fraks,

Тут каждый о своем. ;)
30 дек 19, 12:45    [22051447]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Как это феерично, обсир@ть креветки только потому, что тебе не нравится их вкус

Сообщение было отредактировано: 30 дек 19, 16:18
30 дек 19, 16:18    [22051672]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Какого буя в лазаре в TMemDataSet при попытке в записать в Field[x].AsDateTime:=Now; приводит к "Invalid floating point operation"?

Где Field.DataType = ftDateTime.

Если же попробовать = ftTimeStamp то выдает что такой тип ваще не поддеривается.

Нагуглил это: https://bugs.freepascal.org/view.php?id=28734

Пробую сделать подпорку:
DT:=Now;
Fields[i].SetData(@DT,True);

Fields[i].AsString выдает: 0-0-00 00:00:43

Или так:
DT:=Now*MSecsPerDay;
Fields[i].SetData(@DT,True);

Fields[i].AsString выдает:0-0-00 05:03:21

Передавать туда TTimeStamp тоже пробовал.

Что там за содомия с форматами даты?

Сообщение было отредактировано: 19 фев 20, 23:07
19 фев 20, 23:03    [22083388]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Дорылся до вот этой мозговыносящей функции:

function TimeStampToMSecs(const TimeStamp: TTimeStamp): comp;
begin
  result := TimeStamp.Time + comp(timestamp.date)*msecsperday;
end ;   


Походу где-то в кишках используется она. Но она блин падает по Invalid floating point operation, если ей текущее время передать!

Что это за маразм?!
19 фев 20, 23:13    [22083394]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 356
А TBufDataset не пробовали? Вроде, кажется поадекватнее. Я когда пытался выяснить для себя, что буду здесь использовать вместо TClientDataset, то пришел к выводу, что это оно, а вот TMemDataset вообще как-то не приглянулся.
19 фев 20, 23:16    [22083396]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
V.Borzov
А TBufDataset не пробовали?

Попробовал. Там свои тараканы. С блобами.

При добавлении поля типа блоб count у FieldDefs и Fields отличаются!

Сообщение было отредактировано: 19 фев 20, 23:38
19 фев 20, 23:30    [22083403]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Хотя может это и чем-то еще проблема.
19 фев 20, 23:52    [22083411]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 6019
Перешел на TBufDataset проблема пропала.

Проблема с разным кол-вом полей оказалась в том что ни Close ни CreateDataset ни изменение FieldDefs не сбрасывает Fields.

Пришлось принудительно делать сброс Fields.Clear во время переиницализации датасета.

Странно это все...
20 фев 20, 01:33    [22083431]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
rgreat
Странно это все...

так пиши в трекер, вход и рега свободные. Заодно доброе дело сделаешь :)

пыс. посмотри, ради интереса, Логуновский TRxMemDataset.

Сообщение было отредактировано: 20 фев 20, 19:20
20 фев 20, 19:20    [22084146]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2526
Док
rgreat
Странно это все...

так пиши в трекер, вход и рега свободные. Заодно доброе дело сделаешь :)

пыс. посмотри, ради интереса, Логуновский TRxMemDataset.


причем компилируется и работает и в линукс и в макос
21 фев 20, 10:03    [22084354]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Док
пыс. посмотри, ради интереса, Логуновский TRxMemDataset.

procedure TForm1.FormShow(Sender: TObject);
var
  i: Integer;
begin
  with RxMemoryData1 do
  begin
    FieldDefs.Add('nn_fld', ftInteger);
    FieldDefs.Add('datetime_fld', ftDateTime);
    FieldDefs.Add('time_fld', ftTime);

    Active:= True;

    for i:= 0 to 10 do
    begin
      AppendRecord([i,now,now]);
      Sleep(100);
    end;

  end;
end; 


К сообщению приложен файл. Размер - 19Kb
22 фев 20, 02:13    [22084997]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Вышел очередной минорный релиз Лазаря 2.0.8 (список багофиксов)
16 апр 20, 13:02    [22117427]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Дженерики в FPC стали ещё круче, теперь их можно специализировать константными значениями.
type
  generic TStaticArray<T; const N: Integer> = array[0..N-1] of T;

generic function TimesX<const N: Integer>(aArg: Integer): Integer;
begin
  Result := aArg * N;
end;

var
  myArray: specialize TStaticArray<LongInt, 2>;
  i: LongInt;
begin
  i := specialize TimesX<2>(21);
end.
28 апр 20, 02:03    [22123915]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Тем, у кого высоконагруженные приложения на FPC: New Multi-thread Friendly Memory Manager for FPC written in x86_64 assembly
8 май 20, 12:01    [22129225]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
pvv.pas
Member

Откуда: Оттуда
Сообщений: 37
Kazantsev Alexey,

Недавно был неприятно удивлён что дженерики фрипаскаля кое в чём уступают всё таки делфёвым, порылся нашёл тикет на их багтрекере который висит с 14-го года
9 май 20, 11:44    [22129809]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
pvv.pas,

Да, недоделок там хватает, к сожалению.
9 май 20, 15:41    [22129881]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
pvv.pas
Kazantsev Alexey,

Недавно был неприятно удивлён что дженерики фрипаскаля кое в чём уступают всё таки делфёвым, порылся нашёл тикет на их багтрекере который висит с 14-го года


Как любит говорить тамошний админ Мартин, "patches will be accepted" :) Бери и делай, на худой конец хотя бы тикет создай. В отличие от Дельфей, патчи мерджят при первой возможности и обоюдном согласии всех сторон.

По поводу дженериков, основной разраб Maciej Izak два года назад ушел из основной команды разработчиков (там был большой разбор полетов). С ними ли он теперь, я не в курсе. Но, судя по сорцам на гитхабе, движуха в плане их дальнейшего развития все-таки есть. Попробуй сравнить/заменить сорцы компилятора и пересобрать его, если они отличаются.
10 май 20, 00:40    [22130032]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Kazantsev Alexey
Тем, у кого высоконагруженные приложения на FPC: New Multi-thread Friendly Memory Manager for FPC written in x86_64 assembly

"У посла -медальон, у Шпака..." У Макоси lldb, у винды с линухом - мормот. Каждой сестре по серьге
10 май 20, 00:43    [22130034]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Док
По поводу дженериков, основной разраб Maciej Izak два года назад ушел из основной команды разработчиков

Док, а с чего ты взял, что он основной разраб дженериков? От того, что он запилил дельфи-компатибл коллекции и попутно фиксил баги в компиляторе? Насколько я понимаю, дженериками в компиляторе занимался совсем другой человек.
10 май 20, 01:22    [22130041]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Kazantsev Alexey
Док, а с чего ты взял, что он основной разраб дженериков?

хм, очень может быть. А на чем основаны твои предположения?
10 май 20, 01:55    [22130042]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4469
Док
А на чем основаны твои предположения?

На структуре бранчей :) Ну и на меиллист я подписан.
10 май 20, 09:42    [22130067]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
Kazantsev Alexey
Ну и на меиллист я подписан

а-а-а-а ... Авторитетно звучит :)
12 май 20, 13:44    [22131167]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3691
How to Cross Compile on Lazarus
https://lazplanet.blogspot.com/2020/05/cross-compile-on-lazarus.html
12 май 20, 22:43    [22131640]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
О, свежатинка! А я думал, сайт у них давно помер.

Я как раз сейчас пытаюсь ваять батник по мотивам логов fpcupdeluxe с загрузкой, установкой и сборкой ресурсов с нуля. Статья как раз кстати.
13 май 20, 01:44    [22131722]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 6699
зарелизился компилятор до стабильной версии 3.2.0

https://wiki.freepascal.org/User_Changes_3.2.0
https://wiki.freepascal.org/FPC_New_Features_3.2.0

скачать:
https://sourceforge.net/projects/freepascal/files/
ftp://ftp.freepascal.org/pub/fpc/dist/3.2.0/
22 июн 20, 16:37    [22155268]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8 9 10 .. 12      [все]
Все форумы / Delphi Ответить