Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.26;
Скачать: CL | DM;

Вниз

Русификация   Найти похожие ветки 

 
Nickolay   (2010-07-01 12:06) [0]

Сразу извиняюсь за свой "стон", но все-таки "консоль не поет по-русски": консольное приложение не выдает "Привет!" в Delphi 7 с помощью инструкции WriteLn("Привет!").
Пытался сделать по статье Евгения Каснерика с вашего сайта,
но процедур CharToOem, CharToOemBuff почему-то нет в библиотеке.
Как быть?


 
Anatoly Podgoretsky ©   (2010-07-01 12:20) [1]

> Nickolay  (01.07.2010 12:06:00)  [0]

Кто украл, а что ты делал? Может ты не указал нужные модули в USES


 
RWolf ©   (2010-07-01 13:08) [2]

Если запускать программу из-под FAR, то достаточно ввести предварительно команду chcp 1251. Весь консольный вывод будет перекодироваться в ANSI.


 
Deltas ©   (2010-07-01 13:11) [3]

uses
 Windows;

function AnsiToOem(const S: string): string;
var
 Length: Integer;
begin
 Length := System.Length(S);
 SetLength(Result, Length);
 CharToOemBuff(PChar(S), PChar(Result), Length);
end;


 
Deltas ©   (2010-07-01 13:11) [4]

Writeln(AnsiToOem("Привет!"));


 
Anatoly Podgoretsky ©   (2010-07-01 13:47) [5]


> Writeln(AnsiToOem("Привет!"));


> For compatibility with 16-bit versions of Windows, ...


 
AnsiToOem   (2010-07-01 14:02) [6]

function AnsiToOem(S: string): string;
begin
System.SetLength(Result, Length(S));
CharToOem(PChar(S), PChar(Result));
end;


Так чуть короче, без
var Length: Integer;
и мне не понятен смысл: (const S: string)


 
И. Павел ©   (2010-07-01 14:10) [7]

> и мне не понятен смысл

string не рекомендуется передавать по значению, если его не предполагается изменять - много времени занимает.


 
Deltas ©   (2010-07-01 14:30) [8]


> Anatoly Podgoretsky ©   (01.07.10 13:47) [5]
> > Writeln(AnsiToOem("Привет!"));
> > For compatibility with 16-bit versions of Windows, ...
>

Я переопределил идентификатор AnsiToOem, здесь вызывается функция описанная чуть выше, в [3], а не та, которая импортирована из библиотеки и описана в модуле Windows.


 
Игорь Шевченко ©   (2010-07-01 14:37) [9]


> Я переопределил идентификатор AnsiToOem, здесь вызывается
> функция описанная чуть выше, в [3], а не та, которая импортирована
> из библиотеки и описана в модуле Windows.


а зачем ?


 
Deltas ©   (2010-07-01 14:39) [10]


> а зачем ?

Случайно


 
AnsiToOem   (2010-07-01 14:45) [11]

В частности у меня эта функция называется:

function ConsToRussian(S: string): string;
begin
 System.SetLength(Result, Length(S));
 CharToOem(PChar(S), PChar(Result));
end;

никаких переопределений
:)


 
Anatoly Podgoretsky ©   (2010-07-01 14:48) [12]


> Deltas ©   (01.07.10 14:30) [8]

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


 
Anatoly Podgoretsky ©   (2010-07-01 14:54) [13]

Да еще и когда название не соответствует действию. Это не ANSItoOEM, а CharToOem

AnsiToOem   (01.07.10 14:45) [11]
А у тебя функция не рабочая, рано или поздно получишь AV


 
AnsiToOem   (2010-07-01 14:58) [14]

Почему не рабочая, если не затруднит, поясни, пожалуйста.
Довольно длительное время использую - на AV не нарывался.


 
Deltas ©   (2010-07-01 15:00) [15]

AnsiToOem   (01.07.10 14:45) [11]
Все же, намного правильнее передавать в этом случае строку по ссылке, а не по значению. (const S: string), т.к. в этом случае в стек (или даже в регистр процессора может засунуть хитрый компилятор Delphi) будет записано всего 4 байта, вместо Length(S) + 9 байтов.


 
AnsiToOem   (2010-07-01 15:03) [16]

> Deltas ©   (01.07.10 15:00) [15]

Соглашусь


 
Deltas ©   (2010-07-01 15:12) [17]

Anatoly Podgoretsky ©   (01.07.10 14:54) [13]
По-моему, функция рабочая, работа с памятью корректная.


 
Nickolay   (2010-07-01 15:24) [18]

Ребята! Спасибо за функции и "uses  Windows;" - все работает.

А вот "chcp 1251" - что-то не действует! Выдает, что "текущая страница уже есть 1251", а "Привет!" так и не печатает.


 
RWolf ©   (2010-07-01 15:25) [19]


> Deltas ©   (01.07.10 15:12) [17]
> По-моему, функция
> рабочая, работа с памятью корректная.

вызови её так:
ConsToRussian("");


 
RWolf ©   (2010-07-01 15:27) [20]


> Nickolay   (01.07.10 15:24) [18]
> Ребята! Спасибо за функции и "uses  Windows;" - все работает.
> А вот "chcp 1251" - что-то не действует! Выдает, что "текущая
> страница уже есть 1251", а "Привет!" так и не печатает.

ключевое слово — «в FAR».


 
Nickolay   (2010-07-01 15:32) [21]

Естественно, и "chcp 1251", и EXE-шник запускал из-под FAR!


 
Deltas ©   (2010-07-01 15:33) [22]


> RWolf ©   (01.07.10 15:25) [19]

согласен


 
Deltas ©   (2010-07-01 15:36) [23]


> RWolf ©   (01.07.10 15:25) [19]


тем более, если строка-параметр будет содержать нулевые символы, работать будет некорректно


 
RWolf ©   (2010-07-01 15:46) [24]


> Nickolay   (01.07.10 15:32) [21]
> Естественно, и "chcp 1251", и EXE-шник запускал из-под FAR!

http://clip2net.com/page/m0/6616284


 
Nickolay   (2010-07-01 15:56) [25]


> RWolf ©   (01.07.10 15:46) [24]

Все дело, наверное, в верии FAR. У меня:

The FAR manager, version 1.70 beta 2 (build 321)
Copyright (C) 1996-2000 Eugene Roshal, Copyright (C) 2000 FAR Group


 
Anatoly Podgoretsky ©   (2010-07-01 16:36) [26]

> RWolf  (01.07.2010 15:25:19)  [19]

Ну и как, насколько корректна работа с памятью,


 
Dimka Maslov ©   (2010-07-01 17:15) [27]

Вообще-то правильней будет переопределить системную переменную output, чтобы функция обработки вывода перекодировала в нужную кодировку а затем осуществляла вывод на консоль.


 
Leonid Troyanovsky ©   (2010-07-01 23:19) [28]


> Dimka Maslov ©   (01.07.10 17:15) [27]

> Вообще-то правильней будет переопределить системную переменную

Сперва тож хотел заказать "Text-file device drivers", но,
поразмыслив о правильности, пропустил.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2010-07-02 00:54) [29]

> Leonid Troyanovsky  (01.07.2010 23:19:28)  [28]

Побоялся, что скажут ты не умничай.


 
Nickolay   (2010-07-02 09:01) [30]

Ребята, а про модуль Windows где можно почитать? А то у меня куча толстых книг (Архангельского, Хомоненко и др.), а про Windows только слегка упоминается. В справке Delphi тоже ничего нет.


 
RWolf ©   (2010-07-02 09:29) [31]


> Nickolay   (02.07.10 09:01) [30]

Пуск — Программы — Borland Delphi 7 — Help — MS SDK Help Files — Win32 SDK Reference.


 
Anatoly Podgoretsky ©   (2010-07-02 10:35) [32]

> Nickolay  (02.07.2010 09:01:30)  [30]

MSDN


 
Nickolay   (2010-07-02 12:52) [33]

MSDN - это который в поставке Visual C++ 6.0 идет?


 
Anatoly Podgoretsky ©   (2010-07-02 14:46) [34]

> Nickolay  (02.07.2010 12:52:33)  [33]

Лучше который на сайте msdn.microsoft.com



Страницы: 1 вся ветка

Текущий архив: 2010.09.26;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.01 c
15-1277748407
@!!ex
2010-06-28 22:06
2010.09.26
Проблема с заданием полей таблицы в Lua


15-1277806505
ficus
2010-06-29 14:15
2010.09.26
Творческий кризис


15-1277965959
MonoLife
2010-07-01 10:32
2010.09.26
Рабочий вопрос.


15-1277801604
Кто б сомневался
2010-06-29 12:53
2010.09.26
Антигравитация


2-1277807207
mefodiy
2010-06-29 14:26
2010.09.26
Настройки Дельфи при смене учетной записи