Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.10.2014, 11:01
OSIRIS OSIRIS вне форума
Прохожий
 
Регистрация: 04.01.2008
Сообщения: 11
Репутация: 10
По умолчанию нид хелп (командная строка в мемо)

ситуация следующая:
есть консольное приложение, после запуска надо в него предавать данные и считывать результат соответственно

перекопал много чего - рабочего примера так и не нашел

самое близкое - исходники redirect-a ( http://vovan-ve.fatal.ru/download/55 )
но там проблема с кодировкой

пробовал

компонент RusCod1 - не помогло

функции
Код:
function StrOemToAnsi(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  OemToAnsiBuff(@S[1], @Result[1], Length(S));
end;

//---------------------------------------------------------------
function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;
Админ: Пользуемся тегами для оформления кода!

тоже не спасают

PS:
Embarcadero® RAD Studio XE 2010
Windows 7 проф.

Последний раз редактировалось Admin, 02.10.2014 в 19:20.
Ответить с цитированием
  #2  
Старый 03.10.2014, 09:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от OSIRIS
функции
Код:
function StrOemToAnsi(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  OemToAnsiBuff(@S[1], @Result[1], Length(S));
end;

//---------------------------------------------------------------
function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;

тоже не спасают
Вот так должно работать:
Код:
function CharToOemCase(Value: AnsiString): AnsiString;
begin
  Result := Value;
  if Result <> '' then CharToOemBuffA(Pointer(Result), Pointer(Result), Length(Result));
end;

function OemToCharCase(Value: AnsiString): AnsiString;
begin
  Result := Value;
  if Result <> '' then OemToCharBuffA(Pointer(Result), Pointer(Result), Length(Result))
end;
Пример:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

function CharToOemCase(Value: AnsiString): AnsiString;
begin
  Result := Value;
  if Result <> '' then CharToOemBuffA(Pointer(Result), Pointer(Result), Length(Result));
end;

function OemToCharCase(Value: AnsiString): AnsiString;
begin
  Result := Value;
  if Result <> '' then OemToCharBuffA(Pointer(Result), Pointer(Result), Length(Result))
end;

begin
  Writeln(CharToOemCase('Проверка'));
  Readln;
end.
Ответить с цитированием
  #3  
Старый 03.10.2014, 17:07
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Гадостью CharToOem лучше не пользоваться, она корежит символы псевдографики. Для современных версий Delphi правильным будет решение через встроенные преобразования UnicodeString:
Код:
type
  OEMString = type AnsiString(CP_OEMCP);
var
  S: OEMString;
  U: UnicodeString;
begin
  ReadLn(RedirOut, S);
  U := S;
  Memo1.Add(U);
end;
По идее, должно сработать и прямое присваивание, поскольку OEMString физически тоже UnicodeString:
Код:
begin
  ReadLn(RedirOut, S);
  Memo1.Add(S);
end;
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #4  
Старый 08.10.2014, 10:40
OSIRIS OSIRIS вне форума
Прохожий
 
Регистрация: 04.01.2008
Сообщения: 11
Репутация: 10
По умолчанию

заработал вот такой код:
Код:
function StrAnsiToOem(const S: String): AnsiString;
begin
  SetLength(Result, Length(S)*2);
  AnsiToOemBuff(@S[1], @Result[1], Length(S)*2);
end;

function StrOemToAnsi(const S: String): AnsiString;
begin
  SetLength(Result, Length(S)*2);
  OemToAnsiBuff(@S[1], @Result[1], Length(S)*2);
end;

прием работает нормально, по крайней мере при старте ( запускается консольное приложение и выдает данные в подобающем виде)
однако при попытке отправить команду ничего не происходит, а при нажатии "end write" команда вроде отправляется - однако обрезается по ходу дела до 1 символа
исправленные исходники могу приложить или выложить какую либо часть кода
Ответить с цитированием
  #5  
Старый 08.10.2014, 13:09
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от OSIRIS
при нажатии "end write" команда вроде отправляется - однако обрезается по ходу дела до 1 символа
Аффтар, ты баран. Пользоваться Юникод-версией Delphi и городить какую-то кривую самопальщину вместо встроенного преобразования кодовых страниц -- надо быть альтернативно одаренным. Неужели нельзя справку почитать? Есть прекрасная функция SetCodePage. Передавай ей GetOEMCP, и будет тебе преобразование из кодовой страницы OEM.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #6  
Старый 08.10.2014, 15:09
OSIRIS OSIRIS вне форума
Прохожий
 
Регистрация: 04.01.2008
Сообщения: 11
Репутация: 10
По умолчанию

Цитата:
Сообщение от Freeman
Аффтар, ты баран. Пользоваться Юникод-версией Delphi и городить какую-то кривую самопальщину вместо встроенного преобразования кодовых страниц -- надо быть альтернативно одаренным. Неужели нельзя справку почитать? Есть прекрасная функция SetCodePage. Передавай ей GetOEMCP, и будет тебе преобразование из кодовой страницы OEM.

"setcodepage" надо будет запомнить, ранее не натыкался, вопрос же сейчас уже по больше части в другом - почему не идет отправка данных в консольное приложение, или же оно идет но не полностью?

к слову говоря:
Код:
procedure TForm1.btnWriteClick(Sender: TObject);
var s:string;
begin
    if zRedirect<>nil then begin
        s := edInput.Text+#13#10;
        if rgCharset.ItemIndex=1 then
            //CharToOem(@s[1],@s[1]);   //////////
            s:=StrAnsiToOem(s);
        zRedirect.WriteData(s);
        edInput.Text := '';
    end;
end;

procedure TRedirectThread.WriteData(Data: string);
var writen:Cardinal;
begin
    if (hWriteIn<>0) and (Length(Data)>0) then begin
        WriteFile(hWriteIn, Data[1], Length(Data), writen, nil);
    end;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter