|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
нид хелп (командная строка в мемо)
ситуация следующая:
есть консольное приложение, после запуска надо в него предавать данные и считывать результат соответственно перекопал много чего - рабочего примера так и не нашел самое близкое - исходники 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
|
||||
|
||||
Цитата:
Код:
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
|
||||
|
||||
Гадостью CharToOem лучше не пользоваться, она корежит символы псевдографики. Для современных версий Delphi правильным будет решение через встроенные преобразования UnicodeString:
Код:
type OEMString = type AnsiString(CP_OEMCP); var S: OEMString; U: UnicodeString; begin ReadLn(RedirOut, S); U := S; Memo1.Add(U); end; Код:
begin ReadLn(RedirOut, S); Memo1.Add(S); end; Не стоит путать форумы с богадельнями. © Bargest |
#4
|
|||
|
|||
заработал вот такой код:
Код:
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
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#6
|
|||
|
|||
Цитата:
"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; |