Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7   вперед  Ctrl      все
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Fr0sT-Brutal

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


Если программа содержит, скажем, 100 форм - в каждой из которых так или иначе требуется похожий функционал из этих модулей - в чём смысл вручную прописывать в каждой форме в USES кучу одинакового мусора для каждой формы - который кроме того требуется ещё прописывать в определенном порядке иначе будут несовместимости типов с одинаковыми названиями (такое даже в VCL есть!) из разных модулей? Если можно просто написать USES {$I AllVcl.pas}?

Кроме того, в проекте присутствуют переписанные модули Forms.pas, Grids.pas, DBGrids.pas и т. д. - которые теперь используют функционал из других моих модулей - поэтому USES должен быть в строго определённом порядке.

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

Правда, есть подозрение, что что-то было сделано не так, не по гайдлайнам, не общепринятым способом так скажем, отсюда и проблемы сейчас.
8 апр 21, 18:03    [22306113]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 379
Анна Петровна,

Пихать в uses всё что надо, и что не надо - это, конечно, дурная практика.
А вот упорядочивать модули в нужном порядке - это имеет смысл, для этого можно и IDE-визард написать (а возможно оно даже уже где-то есть).
8 апр 21, 19:48    [22306157]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Анна Петровна
там в AllVcl.pas надо написать

{$IFDEF Declared Windows} Windows,{$ENDIF}
{$IFDEF Declared Messages} Messages,{$ENDIF}
{$IFDEF Declared SysUtils} SysUtils,{$ENDIF}
А потом вы откроете для себя неймспейсы.

Еще раз - выкиньте свой инклуд и пропишите в каждом модуле требуемый именно этому модулю uses и все. И забудьте о проблеме навсегда
8 апр 21, 21:41    [22306179]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
_Vasilisk_
Еще раз - выкиньте свой инклуд и пропишите в каждом модуле требуемый именно этому модулю uses и все. И забудьте о проблеме навсегда

Да бесполезно убеждать. Что совой об пень, что пнём об сову. Особенно после этого
Анна Петровна

Кроме того, в проекте присутствуют переписанные модули Forms.pas, Grids.pas, DBGrids.pas и т. д. - которые теперь используют функционал из других моих модулей - поэтому USES должен быть в строго определённом порядке.

"Всё прогнило, нужно всю систему менять"

Сообщение было отредактировано: 9 апр 21, 11:31
9 апр 21, 11:37    [22306356]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
avp_
Member

Откуда:
Сообщений: 100
Интересно, а если просто перехватить все функции вывода текста типа DrawTextA и TextOutA и перекодировать в W на лету, то получится поправить хотя бы весь вывод?
9 апр 21, 12:41    [22306403]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
GunSmoker
Member

Откуда:
Сообщений: 3210
avp_, нет. Потому что на вход будут идти смешанные строки: какие-то в UTF-8, какие-то в ANSI.
9 апр 21, 16:07    [22306571]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
avp_
Интересно, а если просто перехватить все функции вывода текста типа DrawTextA и TextOutA и перекодировать в W на лету, то получится поправить хотя бы весь вывод?


Как я понимаю, вывод текста ещё зависит от используемого шрифта. В общем, надо определиться и желательно использовать во всей программе один шрифт. Потому что с MS Sans Serif одни особенности (и алгоритмы перехвата), с Arial другие, чтобы тексты отображались нормально и т. д. В моем случае во всей программе Arial, RUSSIAN_CHARSET, SetThreadLocale(1049) - но в некоторых местах может оказаться и MS Sans Serif или что-то другое.

В общем, как я понимаю, по-нормальному вопрос в рамках Delphi 7 не решается - речь может только вестись о минимизации глюков (и в том, чтобы убедить пользователя отключить злополучную галочку).
9 апр 21, 16:39    [22306586]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Fr0sT-Brutal

Да бесполезно убеждать. Что совой об пень, что пнём об сову. Особенно после этого

Кроме того, в проекте присутствуют переписанные модули Forms.pas, Grids.pas, DBGrids.pas и т. д. - которые теперь используют функционал из других моих модулей - поэтому USES должен быть в строго определённом порядке.
"Всё прогнило, нужно всю систему менять"


Почему нет - очень даже рассматриваю такой вариант. Причем даже до размещения вопроса на этом форуме. Просто очень не хочется так делать - очень уж удобно и красиво модули сгруппированы в Delphi 7 и никаких проблем.

В Delphi 2010, кстати, исходники VCL в комплекте есть если сборка нормальная - тот кто говорил про мою кривую сборку - был прав.
9 апр 21, 16:44    [22306590]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
GunSmoker
avp_, нет. Потому что на вход будут идти смешанные строки: какие-то в UTF-8, какие-то в ANSI.


Разве что если только вне зависимости от исходного формата строки - пытаться распознать строку, в каком она формате и всё равно пытаться выполнять преобразование. А в случае неудачи преобразования - оставлять тот формат, что был. Например, преобразовываем UTF-8 в ANSI а если в процессе преобразования произошла неудача - оставляет результат в ANSI т. к. скорее всего строка и так в ANSI.

Конечно, понимаю, что поведение программы в этом случае будет непредсказуемым и некрасивым и вообще за такое надо руки отрывать, разве что использовать такое как вариант - если нужно чтобы отображалось без крякозябр любой ценой, даже ценой потери стабильности программы ...
9 апр 21, 16:50    [22306602]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
avp_
Интересно, а если просто перехватить все функции вывода текста типа DrawTextA и TextOutA и перекодировать в W на лету, то получится поправить хотя бы весь вывод?


Как я понимаю, гораздо надёжнее и стабильнее - перехватывать свойства Text, Caption и прочие у объектов и писать свои наследники стандартных объектов. По мере обнаружения крякозябр в разных местах программы - добавляем перехватчики для разных компонентов и свойств. Например, аналогично Text перехватываем обращения к Hint, аналогично Button перехватывает обращения к Edit и т. д.

И разумеется, у всех компонентов указать одинаковый шрифт (например, Arial) и RUSSIAN_CHARSET. Чтобы поведение перехватчиков было не случайным, а предсказуемым.

Как мне кажется, это единственный способ обеспечить более-менее стабильную работу программы без перехода на юникодный Delphi (написать такой модуль, который подключать ко всем формам программы в секции INTERFACE после USES всех стандартных VCL-модулей и до USES своих модулей (чтобы они - если работают с VCL - использовали уже новые обёртки)):



UNIT UtfVcl;

.......
type
   TUtfButton=class(TButton)
      public
         procedure SetCaption(s: string);
         function GetCaption: string;
         property Caption: string read GetCaption write SetCaption;
   end;
   TButton=class(TUtfButton)
   end;
..........
IMPLEMENTATION
var
   mode: integer=0;

procedure TUtfButton.SetCaption(s: string);
begin
   if mode=0 then
      inherited Caption := s
   else
      inherited Caption := AnsiToUtf8(s);
end;

function TUtfButton.GetCaption: string;
begin
   if mode=0 then
      result := inherited Caption
   else
      result := Utf8ToAnsi(inherited Caption);
end;

..............

BEGIN
   if GetACP=65001 then mode:=1;
   SetThreadLocale(1049);
END.


Сообщение было отредактировано: 9 апр 21, 16:55
9 апр 21, 17:01    [22306611]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
Анна Петровна
Как я понимаю, гораздо надёжнее и стабильнее - перехватывать свойства Text, Caption и прочие у объектов и писать свои наследники стандартных объектов.
в TNT это уже сделано.
вам непременно нужен ещё один велосипед?
9 апр 21, 17:07    [22306613]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
avp_
Member

Откуда:
Сообщений: 100
GunSmoker
avp_, нет. Потому что на вход будут идти смешанные строки: какие-то в UTF-8, какие-то в ANSI.

Откуда? UTF-8 будет мне видится только оттуда где что то вводилось с клавиатуры.
9 апр 21, 17:57    [22306648]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
GunSmoker
Member

Откуда:
Сообщений: 3210
avp_, из 22305574, 22305637 и 22305592
9 апр 21, 19:28    [22306706]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
Пара мыслей, может кому пригодится:

1. Давно перешел на хранение настроек в json-файле (если есть такая возможность). Очень удобно. Причем не надо придумывать ничего чтением, записью, преобразованием данных. Очень удобно и наглядно в коде использовать. Компонент JsonDataObjects

2. Был опыт поддержки с кучей форм в двух версиях делфи (2006 и 2009, если правильно помню) -- ничего хорошего не приносило, иногда что-то левое пробиралось в dfm и приходилось вручную чистить-восстанавливать. Вздохнул с облегчением, когда все перешли на обновленную версию.
9 апр 21, 20:25    [22306747]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Мимопроходящий
Анна Петровна
Как я понимаю, гораздо надёжнее и стабильнее - перехватывать свойства Text, Caption и прочие у объектов и писать свои наследники стандартных объектов.
в TNT это уже сделано.
вам непременно нужен ещё один велосипед?


Не нужно. Нужно только чтобы тот код, который уже есть - продолжал нормально работать и ни в коем случае не стал хоть на 1% менее стабильным. Хорошо, что пока у большинства пользователей эта опция отключена и вообще многие вообще на Windows 7. С TntComponents если на него переходить стабильность программы может пострадать и у основной категории пользователей да и зачем на них переходить уж лучше сразу тогда наи новую версию Delphi, да и вообще любой компонент в том числе TntComponents это тоже дополнительный костыль, который также затруднит переход на новые версии Delphi в дальнейшнем.

Логика тут в том, что у основной массы пользователей всё должно остаться как есть и чтобы не стало хуже. А у тех, у кого опция эта включена - хотя бы основной функционал чтобы работал и если и будут где-то какие-то глюки - то пусть уж лучше они будут только у тех, у кого данная опция включена (а если они будут обращаться в техподдержку - предлагать эту опцию отключить), но не у вообще всех.
9 апр 21, 23:12    [22306810]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
JayDi

1. Давно перешел на хранение настроек в json-файле (если есть такая возможность). Очень удобно. Причем не надо придумывать ничего чтением, записью, преобразованием данных. Очень удобно и наглядно в коде использовать. Компонент JsonDataObjects


Кажется, еще один сторонний компонент - то есть костыль. Который затруднит переход на новые версии Delphi и дополнительно привяжет к Delphi 7. Как мне кажется, при переходе на новые версии Delphi сам по себе появляется доступ ко многим новым стандартным компонентам - которых нет в Delphi 7 и в новых версиях Delphi придётся изобретать меньше велосипедов, тк в комплекте больше возможностей "из коробки".
9 апр 21, 23:16    [22306814]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
Анна Петровна
JayDi
JsonDataObjects


Кажется, еще один сторонний компонент - то есть костыль. Который затруднит переход на новые версии Delphi и дополнительно привяжет к Delphi 7. Как мне кажется, при переходе на новые версии Delphi сам по себе появляется доступ ко многим новым стандартным компонентам - которых нет в Delphi 7 и в новых версиях Delphi придётся изобретать меньше велосипедов, тк в комплекте больше возможностей "из коробки".


В делфи 7 вообще ничего нет для работы с JSON (собственно, даже JsonDataObjects работает только с 2009 -- но она как пример дана). Я к тому, что у делфи идет настолько кривая и раздутая JSON-библиотека, что тупо отпугнет любого разработчика, кто захочет с ней работать "ради облегчения" процесса -- в результате они так и сидят на устаревших ini-файлах.
9 апр 21, 23:21    [22306816]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
JayDi

В делфи 7 вообще ничего нет для работы с JSON (собственно, даже JsonDataObjects работает только с 2009 -- но она как пример дана). Я к тому, что у делфи идет настолько кривая и раздутая JSON-библиотека, что тупо отпугнет любого разработчика, кто захочет с ней работать "ради облегчения" процесса -- в результате они так и сидят на устаревших ini-файлах.


Использую для распознавания JSON велосипед под названием OLE-объекта MSScriptControl.ScriptControl. Как вариант, можно еще использовать Node.js как внешнюю программу для разбора JSON - вызывая скрипт на Node и возвращая ответ в виде файла.

В общем, и так понятно - надо уходить с Delphi 7 - иначе с каждым годом количество вынужденных велосипедов будет расти и проблема велосипедов ещё в том, что зачастую менее эффективны, чем стандартные решения - в итоге дойдет до того, что программа для своей работы будет требовать Intel Core i7, да ещё и работать при этом неспешно.
9 апр 21, 23:55    [22306832]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Cobalt747
Member

Откуда:
Сообщений: 2300
Анна Петровна, вот же вы выдумщица )))

для JSON в D7 есть прекрасный superobject.
10 апр 21, 00:10    [22306838]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Cobalt747
Анна Петровна, вот же вы выдумщица )))
для JSON в D7 есть прекрасный superobject.


Еще один сторонний велосипед с GitHub. Неизвестно, кто его делал и неизвестно, как он работает и какие там глюки.
Скорее всего, он гораздо эффективнее, чем предлагаемое мной решение. Но вот опасаюсь - если на него, например, завязать много логики в программе, а потом он заглючит - копаться в чужом коде и выяснять причины ошибок это ад для меня по крайней мере.

Со своими бы велосипедами разобраться они хоть и с квадратными колёсами, зато обкатаны и работают предсказуемо. А стандартным компонентам и программам вроде Node.js я по умолчанию больше доверяю, чем разным сторонним решениям.

Но если конечно - нужна именно скорость и стандартных решений нет, а велосипеды с квадратными колёсами едут слишком медленно - и единственный нормальный вариант использовать стороннее решение - приходится сжав зубы качать и использовать на свой страх и риск.
10 апр 21, 00:31    [22306843]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Кстати, с переходом на Delphi 2010 гадость обнаружилась. Не даёт собака писать длинные процедуры.

Выдаёт ошибку

E2283 Too many local constants. Use shorter procedures

приходится разбивать длинную процедуру на несколько более коротких

Конечно я всё понимаю, писать несколько тысяч литералов в одной процедуре это не есть хорошо. Но с другой стороны зачем выдавать ошибку достаточно предупредить, что так делать нехорошо. Чем-то напоминает глупое ограничение еще из Турбо Паскаль - размер кода не должен превышать 64 килобайта. Смешно - но изучая Турбо Паскаль в свой время - столкнулась с этим ограничением (не более 64 Кб кода) буквально на 7-й день изучения. Используя многократно Copy&Paste это совсем даже не удивительно.
10 апр 21, 00:37    [22306846]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

А ведь говорили Вам, что 2010 - глючная. Но некоторые просто обязаны наступить на грабли
лично...

Posted via ActualForum NNTP Server 1.5

10 апр 21, 00:45    [22306848]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
Анна Петровна
Но вот опасаюсь - если на него, например, завязать много логики в программе, а потом он заглючит - копаться в чужом коде и выяснять причины ошибок это ад для меня по крайней мере.

Они годами отлажены. Обычно, если библиотека "глючит" -- значит в нашем коде было сделано что-то не то. Шанс на ошибку в самой библиотеке минимален. В критическом случае можно либо самостоятельно поправить исходники, либо поискать альтернативы. В свое время так пришлось переехать с SimpleXML на OXml, т.к. первый не поддерживал некоторые специфические конструкции, кодировки и большие объемы.

Но сторонняя библиотека НАМНОГО лучшее решение, нежели городить огород со сторонними скриптами (msscript) или сервисами (node.js).

Сообщение было отредактировано: 10 апр 21, 01:03
10 апр 21, 01:09    [22306854]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2520
Анна Петровна
E2283 Too many local constants. Use shorter procedures
Как правило, это свидетельствует об ужасном коде. Возьмите за правило писать процедуры так чтобы они влезали на экран. Хотя бы более 90% всех процедур
10 апр 21, 01:53    [22306865]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5101
white_nigger
Возьмите за правило писать процедуры так чтобы они влезали на экран.

На 4K экран в портретной ориентации
10 апр 21, 09:59    [22306895]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7   вперед  Ctrl      все
Все форумы / Delphi Ответить