| 
| 
 | Вопрос # 4 849/ вопрос закрыт / | 
 |  Здравствуйте, эксперты!
 Подскажите пожалуйста как с помощью функции WriteConsoleInput вывести текстовое сообщение в консоль, да еще по определенным координатам?
 
 Я пробовал пользоваться WriteConsoleOutputCharacter, но как выяснил у нее проблемы с русской кодировкой.
 
 
 Заранее спасибо!
 
|  |   Вопрос задал: 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™ (статус: Доктор наук), 22 декабря 2010, 13:49 [#1]:WriteConsoleInput() - это ВВОД, а не вывод. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 15:04 [#2]:min@y™: 
 "WriteConsoleInput() - это ВВОД, а не вывод."
 
 Да, Вы правы. Я ошибся при написании.
 
 Сформулирую по другому. Мне нужно поместить в консоль текстовое сообщение по определенным координатам и чтобы нормально распознавалась как английская, так и русская кодировки
 |  
|   | min@y™ (статус: Доктор наук), 22 декабря 2010, 15:29 [#3]:А консоль своя или чужая? Есть у меня один модуль интересный. Называется CRT32.pas...
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 15:43 [#4]:Консоль чужая. Это вообще редактор Far. 
 Я без проблем помещаю сообщение функцией WriteConsoleOutputCharacter. Но сообщение может быть и в русской кодировке. Соответственно вижу кракозябры.
 При попытке перевести в OEM все падает, но эта уже другая проблема.
 Хотелось бы все таки воспользоваться WriteConsoleInput
 |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 15:46 [#5]:Просто мне еще не совсем понятно как нужно заполнить структуру INPUT_RECORD, чтобы работать именно с текстовым сообщением. и как указать координаты. |  
|   | mirt.steelwater (статус: Посетитель), 22 декабря 2010, 15:52 [#6]:у меня та же проблема - как писать в чужую консоль, ждать пока она ответит, читать, что она ответила - снова писать и т.п. я начал для этого писать свой класс на основе TThread - надеюсь, что получится..
 Ⓐ свобода сопротивление солидарность |  
|   | min@y™ (статус: Доктор наук), 22 декабря 2010, 16:14 [#7]: Цитата (blackhawk): При попытке перевести в OEM все падает, но эта уже другая проблема. Вот с этой проблемы нужно и начинать.
 Что падает? Как падает? Код вызова функции преобразования в студию!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 22 декабря 2010, 16:29 [#9]:а если Length(Buff) = 0 -- что будет?) Ⓐ свобода сопротивление солидарность |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 16:33 [#10]:Тоже самое "Исключительная ситуация
 Исключение: Нарушение доступа (запись в 0х01064735)
 Адрес: 0х7Е36AF1D
 Функция ProcessEditorInputW"
 |  
|   | 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 (статус: Посетитель), 22 декабря 2010, 16:38 [#12]:гы, то же самое. Только теперь еще и неизвестное исключение |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 16:39 [#13]:Такое ощущение, что фару сам вызов CharToOem не нравиться. |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 16:51 [#14]:Не нравиться выделение памяти. В принципе. |  
|   | min@y™ (статус: Доктор наук), 22 декабря 2010, 16:52 [#15]: SetLength(Buff2, Length(Buff) + 1); Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 22 декабря 2010, 16:53 [#16]:на сколько мне известно, последние версии Far - юникодные. Так что CharToOem не поможет. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 22 декабря 2010, 16:53 [#17]: Цитата (blackhawk): Не нравиться выделение памяти. В принципе.  А как ты думаешь, что делается у тебя процедурой SetLength()? Уж не выделение ли памяти?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 16:57 [#18]:Вадим К: 
 "на сколько мне известно, последние версии Far - юникодные. Так что CharToOem не поможет."
 
 Какие у меня варианты?
 |  
|   | blackhawk (статус: Посетитель), 22 декабря 2010, 16:59 [#19]:min@y™: "А как ты думаешь, что делается у тебя процедурой SetLength()? Уж не выделение ли памяти?"
 
 Конечно выделение. Изменение размера массива строк. Но это прокатывает.
 Ошибка возникает сразу, как только вызывают CharToOem
 |  
|   | mirt.steelwater (статус: Посетитель), 22 декабря 2010, 17:08 [#20]:используй WideString там действительно в размере памяти +1 нужно, я ошибся
 Ⓐ свобода сопротивление солидарность |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |