Забавный но досадный глюк

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Забавный но досадный глюк

Сообщение Alex2013 » 03.04.2013 12:29:47

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

(Лазарус 1.0.0.2 win32)
Проверка в другом ЯВУ ошибки не выявила то есть дело не в системе...
Код: Выделить всё
program gluk1;
uses
  Interfaces,Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
{$mode objfpc}{$H+}
type
  { TForm1 }
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
//{$R *.lfm}

{ TForm1 }
Const
  SLine:String='Шура пилите гири !                  ';
procedure TForm1.Timer1Timer(Sender: TObject);

Var C:Char;
begin
  C:= SLine[1];
  Delete(SLine,1,1);
  SLine:=SLine+c;
  Caption:=Sline;;
end;

var
  Application:tApplication;
begin
/// RequireDerivedFormResource := True;
Application:=TApplication.Create(nil);
Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  With Form1 do begin
  Left := 880;
  Height := 40;
  Top := 197 ;
  Width := 320 ;
  Caption := '' ;
   Timer1:= TTimer.Create(form1);
  Timer1.OnTimer := @form1.Timer1Timer;
  Timer1.Enabled:=true;;
  timer1.Interval:=100;
  end ;
  Application.Run;
end.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Забавный но досадный глюк

Сообщение dunin » 03.04.2013 13:15:42

Код: Выделить всё
procedure TForm1.Timer1Timer(Sender: TObject);
Var C:Char;
    D:Char;
begin
  C:= SLine[1];
  D:= SLine[2];
  Delete(SLine,1,2);
  SLine:=SLine+c+d;
  Caption:=Sline;;
end;


Добавлено спустя 4 минуты 48 секунд:
Вариант решения номер два:
Код: Выделить всё
procedure TForm1.Timer1Timer(Sender: TObject);
Var C:Char;
begin
  SLine:= UTF8ToAnsi(SLine);
  C:= SLine[1];
  Delete(SLine,1,1);
  SLine:=SLine+c;
  SLine:= AnsiToUTF8(SLine);
  Caption:=Sline;;
end;
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Забавный но досадный глюк

Сообщение Alex2013 » 03.04.2013 13:52:24

Спасибо!
Судя по второму варианту я был прав и дело в кодировке.. :idea:

Добавлено спустя 22 часа 12 минут 37 секунд:
Не помогло ...
Первый вариант вообще напоминает шутку, второй хронически выдает крякозяблы..
Возможно нужно подобрать другую функцию, попробую отпишусь ....
Ps
Да, в программе есть ошибка если запустить вне среды при закрытии окна она остается в памяти
Извиняюсь но сделал наспех просто для демонстрации эффекта
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Забавный но досадный глюк

Сообщение Brainenjii » 04.04.2013 12:13:43

да пользуйтесь вы уже UTF8* функциями. Объявлены в модуле LCLProc. Конкретно для вас будет
Код: Выделить всё
..
Var
  C:String;
begin
  C:= UTF8Copy(SLine, 1, 1);
  UTF8Delete(SLine,1,1);
  SLine:=SLine+c;
  Caption:=Sline;
End;
..
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Забавный но досадный глюк

Сообщение Alex2013 » 04.04.2013 14:38:56

Попробую ... :idea:

Добавлено спустя 22 часа 5 минут 40 секунд:
Спасибо выручили !!

Ух это вообще-то прямо анекдот "Кодировка называется UTF8 все нормальные люди считают ее 8-ми битной, а некоторые продвинутые 16-битной но на самом деле ..
UTF8 то не не другое это ГИБРИД из обоих видов кодировки !( английский алфавит цифры и наиболее часто употребляемые символы 8-бит а все другие языки используют 16-бит )"

В общем если встретите того "Клауса" который придумал такое "замечательное " название передайте ему "очень пламенный привет"...

Думаю нужно описание UTF8 поместить в ЧаВо самым первым многие вопросы отпадут сразу .
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Забавный но досадный глюк

Сообщение vada » 05.04.2013 17:50:48

Я тоже считаю что изобретатель UTF-8 надо гвоздь в голову забить! :mrgreen:
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Забавный но досадный глюк

Сообщение alexey38 » 05.04.2013 18:40:09

В этом смысле в Винде и затем в Дельфях пошли по более правильному пути, сделав за базу UTF16, сделав для большинства языков символ длиной в 2 байта и только редким и извратным символам нужно 4 байта.
Юниксоиды, будучи в своей массе англоязычными из лени и нежелания обеспечивать совместимость старых прог с мультиязычными кодировками выдумали UTF8, который для англоязычных челов как был, так и остался обычной 8-битной кодировкой. Это был изначально баговый путь развития, исходя из расисткого (пренебрежительного) отношения к неанглоязычным челам.

Поэтому я искренне считаю UTF-8 - маразмом и извращением, т.к. любая простейшая строковая функция становится настолько алгоритмически маразматичной и извращенной, что на это больно смотреть. Наиболее правильная это UTF-32, но как компромисс можно рассматривать UTF-16.

Добавлено спустя 6 минут 22 секунды:
Когда-то в паскале тип Integer был 16 битным, но затем он стал 32 битным. Сейчас есть еще и int64. Кто сегодня использует SmallInt? или ShortInt? Это редкость и экзотика, для редких алгоритмов требуемая. А в прогах 20-летней давности специально делали функции на основе массива SmallInt под 32 и 64 битную арифметику. Но сегодня уже нет этого изврата. UTF-8 настолько же маразматичен, как сегодня вместо integer использовать массив из 4-х ShortInt.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Забавный но досадный глюк

Сообщение xdsl » 06.04.2013 09:29:04

Насчет лени и нежелания - изрядно сказано. Платите деньги и персонально для Вас перепишут все программы на поддержку хоть utf16, хоть utf32. А utf8 и бесплатно всех устраивает.

Добавлено спустя 6 минут 27 секунд:
vada писал(а):Я тоже считаю что изобретатель UTF-8 надо гвоздь в голову забить! :mrgreen:
За что-же Вы так дедушку Кена Томпсона ненавидите? Как никак заслуженный деятель, один их создателей unix. Регулярные выражения мы сейчас то-же благодаря ему используем. А Вы так безапелляционно - "гвоздь в голову" ...
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Забавный но досадный глюк

Сообщение hovadur » 06.04.2013 09:41:44

alexey38 писал(а):UTF-8 настолько же маразматичен, как сегодня вместо integer использовать массив из 4-х ShortInt.

Нифига же ты вбросил :) А я считаю, что UTF-8 идеален. И винда, я считаю, не перешла на него только из-за совместимости. Ведь основной недостаток UTF-16 в том, что 2 байт все равно не хватает, и нужно 4 байта. UTF-32 в этом смысле лучше всего бы использовать, но появляется еще одна проблема - размер. Англоязычный файл в UTF-32 в 4 раза больше, чем в UTF-8.
Резюмируя:
1) Проблема UTF-16 в том, что он 2-байтовый, а иногда нужно 4 байта.
2) Проблема UTF-32 в том, что файл слишком много места занимает.
UTF-8 решает все эти проблемы.
Юниксоиды более прогрессивны и они плюют на обратную совместимость, а винде без совместимости никуда не деться, поэтому и приходится тащить UTF-16.
hovadur
постоялец
 
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Re: Забавный но досадный глюк

Сообщение SeZuka » 06.04.2013 09:46:05

За что-же Вы так дедушку Кена Томпсона ненавидите? Как никак заслуженный деятель, один их создателей unix. Регулярные выражения мы сейчас то-же благодаря ему используем. А Вы так безапелляционно - "гвоздь в голову" ...
За регулярные выражения - ему второй гвоздь полагается :mrgreen:
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Забавный но досадный глюк

Сообщение alexey38 » 06.04.2013 09:53:09

xdsl писал(а):А utf8 и бесплатно всех устраивает.

Он устраивает только англоязычных.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Забавный но досадный глюк

Сообщение xdsl » 06.04.2013 09:58:48

SeZuka писал(а):
За что-же Вы так дедушку Кена Томпсона ненавидите? Как никак заслуженный деятель, один их создателей unix. Регулярные выражения мы сейчас то-же благодаря ему используем. А Вы так безапелляционно - "гвоздь в голову" ...
За регулярные выражения - ему второй гвоздь полагается :mrgreen:
А за призывы к насилию чего там по УК полагается?
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Забавный но досадный глюк

Сообщение alexey38 » 06.04.2013 10:04:35

hovadur писал(а):UTF-8 решает все эти проблемы.
Юниксоиды более прогрессивны и они плюют на обратную совместимость, а винде без совместимости никуда не деться, поэтому и приходится тащить UTF-16.


1. Юниксоиды по жизни очень часто склонны к извращениям. Имея в базе отличную ОС, только лет через 15 после винды или MacOS сделали более-менее приемлемую пользовательскую оболочку, и тут же их опять понесло в другую сторону сдали делать нечто типа unity.

2. UTF-8 был придуман сугубо из-за обратной совместимости, и юниксоиды на нее не плюют, они за нее держатся всеми руками и ногами.

3. Как формат файла на диске UTF-8 вполне приемлемый вариант сжатия объема файла. Не об этом спор, т.к. когда нужна компактность, то можно вместо конвертации UTF-32 в UTF-16 запаковать файл ZIPом или иным архиватором, будет всяко меньше занимать места.

4. Как тип данных (переменная, параметр вызова функции и т.п.) только UTF-32 является нормальным типом (а не извратным или маразматическим). UTF-16 для многих тоже приемлем, т.к. не во всех человеческих языках используются символы длинною в 32 бита. UTF-8 как тип переменных - это маразм и извращение. Для 99.99% случаев перевод переменных с UTF-8 на UTF-32 не увеличит существенно, ни объем бинарника, ни объем программы в оперативной памяти. А там, где нужно перемалывать огромные массивы текста в тех случаях, все равно строка с типом UTF-8 ничего не дает, т.к. оперативы может не хватить, и там используются уже алгоритмы поблочной обработки.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Забавный но досадный глюк

Сообщение xdsl » 06.04.2013 10:17:16

alexey38 писал(а):
xdsl писал(а):А utf8 и бесплатно всех устраивает.

Он устраивает только англоязычных.
После чехарды с разнокодироваными текстами в cp866, cp1251 и koi8-r лично я, русскоязычный, воспринял utf8 как манну небесную.

А по поводу utf-16... много Вы видели текстов программ, кодированных в utf-16, шоб по два байта на символ? Не желаете заняться переводом своих программ в utf-16? Или в utf32?

Для 99.99% случаев перевод переменных с UTF-8 на UTF-32 не увеличит существенно, ни объем бинарника, ни объем программы в оперативной памяти.
Ничего-так заявление. Было на символ от 1 до 4 байт, а теперь без вариантов - 4 байта. Особо шикарными станут массивы и строки.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Забавный но досадный глюк

Сообщение alexey38 » 06.04.2013 10:18:46

5. В большинстве современных программ имеем целочисленные переменные типа Integer (32 бита), иногда int64. Хотя во многих случаях для экономии памяти нам бы по алгоритму хватило SmallInt или ShortInt. Но редкий извращенец экономит таким образом оперативную память под переменные. Тип Integer даже работать будет быстрее на современном проце. Но в строковых переменных полный изврат и маразм, все очень любят тип UTF8, в котором во впервых 8-битный элемент (что уже замедляет работу), так и символы переменной длины, и нужно делать полный парсинг для любой строковой операции. Сколько ни смотрел в инете, ни где не видел разумного объяснения в необходимости строковых переменных с типом UTF8 (не путать с форматом файла на диске).

Добавлено спустя 2 минуты 57 секунд:
xdsl писал(а):После чехарды с разнокодироваными текстами в cp866, cp1251 и koi8-r лично я, русскоязычный, воспринял utf8 как манну небесную.

Полумеры они и в Африке полумеры. А utf8 внес не менее сумбура и хаотичности, тем более файлы на диске в формате UTF8 редко когда содержат в первых символах признак формата UTF8, т.е. как была чехарда с разнокодироваными текстами в cp866, cp1251 и koi8-r, так она и осталась. Открываете файл и не знаете в какой он кодировке, то ли UTF8, то ли cp1251, то ли cp866 и т.п.

Добавлено спустя 3 минуты 1 секунду:
xdsl писал(а):А по поводу utf-16... много Вы видели текстов программ, кодированных в utf-16, шоб по два байта на символ? Не желаете заняться переводом своих программ в utf-16? Или в utf32?

Большая часть моих проектов реализована и работает под Дельфями. Там в базе utf-16. Программы уже давно переведены на utf-16, и перевод занял так мало времени, т.к. пришлось переработать только собственную строковую библиотеку. В ФПС и Лазаре - уникод был введен совсем неразумно. В Дельфях много лет назад появился WideString и ни каких проблем не было. Затем был введен UnicodeString и опять ни каких проблем. Все гладко.

Добавлено спустя 1 минуту 47 секунд:
xdsl писал(а):Ничего-так заявление. Было на символ от 1 до 4 байт, а теперь без вариантов - 4 байта. Особо шикарными станут массивы и строки.

Я уже выше писал про целочисленные типы SmallInt или ShortInt. Для вещественных переменных есть тип Single (float по сишному). И кто из современников часто использует данные типы? И почему никого не напрягает 32-битная переменная в цикле for?

Добавлено спустя 6 минут 47 секунд:
xdsl писал(а):А по поводу utf-16... много Вы видели текстов программ, кодированных в utf-16, шоб по два байта на символ?

Вы о формате файла с кодом программы? Как на диске хранится файл меня мало волнует, я часто файлы храню в формате 7z, и в проге использую соответствующий Stream для чтения из файлов 7z.

Но если все же про текст моих программ, то по самому тексту не так много кирилистических слов, хотя они есть - это комментарии и строковые константы (не всегда интересует мультиязычность пользовательского интерфейса).
Но сами строковые переменные, используемые в программе очень редко работают только с английскими символами и цифрами. То есть в большинстве строковых переменных есть символы длинною больше 8 битов.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 33

Рейтинг@Mail.ru