Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 849

/ вопрос закрыт /

Здравствуйте, эксперты!

Подскажите пожалуйста как с помощью функции WriteConsoleInput вывести текстовое сообщение в консоль, да еще по определенным координатам?

Я пробовал пользоваться WriteConsoleOutputCharacter, но как выяснил у нее проблемы с русской кодировкой.


Заранее спасибо!

blackhawk Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: blackhawk (статус: Посетитель)
Вопрос отправлен: 22 декабря 2010, 13:21
Состояние вопроса: закрыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Переместил по просьбе автора вопроса.

Цитата (blackhawk):

Но насколько это правильно, пока не решил...

На-ка вот глянь мой самодельный модуль по работе с кодировками. Может пригодится?

UPD: если администрация желает, то может переместить мой модуль в файловый архив, может быть кому-нибудь ещё пригодится.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 декабря 2010, 11:11
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 26; последнее сообщение — 23 декабря 2010, 11:25; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 13:49 [#1]:

WriteConsoleInput() - это ВВОД, а не вывод.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 15:04 [#2]:

min@y™:

"WriteConsoleInput() - это ВВОД, а не вывод."

Да, Вы правы. Я ошибся при написании.

Сформулирую по другому. Мне нужно поместить в консоль текстовое сообщение по определенным координатам и чтобы нормально распознавалась как английская, так и русская кодировки
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 15:29 [#3]:

А консоль своя или чужая?
Есть у меня один модуль интересный. Называется CRT32.pas...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 15:43 [#4]:

Консоль чужая. Это вообще редактор Far.

Я без проблем помещаю сообщение функцией WriteConsoleOutputCharacter. Но сообщение может быть и в русской кодировке. Соответственно вижу кракозябры.
При попытке перевести в OEM все падает, но эта уже другая проблема.
Хотелось бы все таки воспользоваться WriteConsoleInput
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 15:46 [#5]:

Просто мне еще не совсем понятно как нужно заполнить структуру INPUT_RECORD, чтобы работать именно с текстовым сообщением. и как указать координаты.
mirt.steelwater

mirt.steelwater (статус: Посетитель), 22 декабря 2010, 15:52 [#6]:

у меня та же проблема - как писать в чужую консоль, ждать пока она ответит, читать, что она ответила - снова писать и т.п.
я начал для этого писать свой класс на основе TThread - надеюсь, что получится..
Ⓐ свобода сопротивление солидарность
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 16:14 [#7]:

Цитата (blackhawk):

При попытке перевести в OEM все падает, но эта уже другая проблема.

Вот с этой проблемы нужно и начинать.
Что падает? Как падает? Код вызова функции преобразования в студию!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 16:27 [#8]:

var
 HConsole: THandle;
 WrBuff: LongWord;
 Coord:_COORD;
 Buff: String;
 Buff2: String;
begin
  HConsole:=GetStdHandle(STD_OUTPUT_HANDLE);
  Coord.x:=2;
  Coord.y:=2;
  Buff:='абвгд';
 
  SetLength(Buff2, Length(Buff));
  CharToOem(PChar(Buff2), PChar(Buff));
 
  WriteConsoleOutputCharacter(HConsole, PChar(Buff2), Length (Buff2) + 1, Coord, WrBuff);

При попытке вызвать CharToOem - приложение сразу валиться
mirt.steelwater

mirt.steelwater (статус: Посетитель), 22 декабря 2010, 16:29 [#9]:

а если Length(Buff) = 0 -- что будет?)
Ⓐ свобода сопротивление солидарность
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 16:33 [#10]:

Тоже самое
"Исключительная ситуация
Исключение: Нарушение доступа (запись в 0х01064735)
Адрес: 0х7Е36AF1D
Функция ProcessEditorInputW"
mirt.steelwater

mirt.steelwater (статус: Посетитель), 22 декабря 2010, 16:34 [#11]:

так напиши
var
    Buff: String;
    Buff2: PChar;
begin
    Buff:='абвгд';
    Buff2 := AllocMem ( Length (Buff) * SizeOf (Char) );
    try
        Buff2 := PChar (Buff);
        CharToOem (Buff2,Buff2);
        Buff := StrPas (Buff2);
    finally
        FreeMem (Buff2);
        Buff2 := NIL;
    end;
end;
Ⓐ свобода сопротивление солидарность
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 16:38 [#12]:

гы, то же самое. Только теперь еще и неизвестное исключение
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 16:39 [#13]:

Такое ощущение, что фару сам вызов CharToOem не нравиться.
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 16:51 [#14]:

Не нравиться выделение памяти. В принципе.
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 16:52 [#15]:

SetLength(Buff2, Length(Buff) + 1);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 декабря 2010, 16:53 [#16]:

на сколько мне известно, последние версии Far - юникодные. Так что CharToOem не поможет.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2010, 16:53 [#17]:

Цитата (blackhawk):

Не нравиться выделение памяти. В принципе.

А как ты думаешь, что делается у тебя процедурой SetLength()? Уж не выделение ли памяти?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 16:57 [#18]:

Вадим К:

"на сколько мне известно, последние версии Far - юникодные. Так что CharToOem не поможет."

Какие у меня варианты?
blackhawk

blackhawk (статус: Посетитель), 22 декабря 2010, 16:59 [#19]:

min@y™:
"А как ты думаешь, что делается у тебя процедурой SetLength()? Уж не выделение ли памяти?"

Конечно выделение. Изменение размера массива строк. Но это прокатывает.
Ошибка возникает сразу, как только вызывают CharToOem
mirt.steelwater

mirt.steelwater (статус: Посетитель), 22 декабря 2010, 17:08 [#20]:

используй WideString
там действительно в размере памяти +1 нужно, я ошибся
Ⓐ свобода сопротивление солидарность

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:43
Выполнено за 0.04 сек.