Форум: "Основная";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
ВнизКонсольное приложение Найти похожие ветки
← →
Анатолий (2003-01-18 21:18) [0]Уважаемые знатоки!
У меня чего-то сходу не решается такая задачка.
Надо написать консольное приложение на Delphi естественно
которое на входе из StdInput будет получать задание в виде
текстовой строки скажем "круг" или "прямоугольник";
получив указание консольное приложение на BitMap
рисует соответствующую фигуру (пример условный - не будем говорить о размерах и прочее). Но эту BitMap надо
выбросить в StdOutput. При этом никаких промежуточных записей
на диск не допускается. Вопросы связанные с WEB меня пока не интересуют. Хотелось бы увидеть живой РАБОТАЮЩИЙ кусок
Буду очень признателен.
← →
TTCustomDelphiMaster (2003-01-18 22:50) [1]program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, windows, Classes, graphics;
var
s, t: string;
b: TBitmap;
ms: TMemoryStream;
begin
writeln("Enter circle");
readln(s);
if s <> "circle" then
Exit;
b := TBitmap.Create;
ms := TMemoryStream.Create;
try
b.Width := 50;
b.Height := 50;
b.Canvas.Brush.Color := clRed;
b.Canvas.Ellipse(0, 0, 50, 50);
// Проверка
with TCanvas.Create do
try
Handle:=GetDC(HWND_DeskTop);
CopyRect(Rect(300,400,350,450), b.Canvas, Rect(0,0,50,50));
finally
Free;
end;
b.SaveToStream(ms);
SetLength(t, ms.Size);
ms.Position := 0;
ms.Read(t[1], ms.Size);
write(t);
finally
ms.Free;
b.Free;
end;
write("end");
readln;
end.
← →
Анатолий (2003-01-19 16:13) [2]to TTCustomDelphiMaster ©
Большое спасибо!
Попробовал - работает в том виде, как Вы задумали
Я хотел бы удостовериться правильно я понимаю
я проставил свои коментарии
b.SaveToStream(ms);//записали в поток b - аналог записи в файл
SetLength(t, ms.Size); //Вычислили размер (в байтах)
ms.Position := 0;//вернулись на начальную позицию
ms.Read(t[1], ms.Size);//из потока переписали в строку t
//начиная с первой позиции ms.Size байт
write(t);//а это мне не понятно
Меня смущает только следующее.
Уточню с Вашего позволения задачку
Управляет процессом еще одно консольное приложение,
которое выдает мне строку s
А я должен возвратить строку t
Я не хотел бы спорить о целесообразности создания двух консольных приложений. Но так получилось. Бывает.
Так вот меня смущает только вопрос: в Вашем фрагменте не видно
где StdInput а где StdOut. Наверно еще какие-то функции должны быть связанные с адрессацией стандартного потока ввода-вывода. Или я не прав
И еще - у Вас s, t: string;
А с меня требуют типа s, t: Array[1..1000000] of Byte;
Ну я понаглею, если скажу что мне надо вместо Bitmap
заганять на выход gif-картинку - ну здесь я думаю ничего
нового по сравнению с Bitmap не будет. (Саму gif я умею делать)
То есть уточнение такое: Во внешней программе формируется задание
нарисовать наш круг ("circle")
Я через StdInput получаю это задание - анализирую
Если все Okey я рисую на Bitmap круг (не будем касаться того что потом это я превращаю в gif)
Эту битмепку сбрасываю в StdOutput в виде массива байтов + какой-то признак конца (или это не надо)
На другом конце читают этот поток уже как StdInput, делают с него картинку и,например,сбрасывают на диск.
Я больше прикладник-алгоритмист и поэтому пассую перед общими вопросами.
Еще раз благодарю.
PS. К TMemoryStream я и сам устремлял свои взоры - но сомневался
Вы эти сомнения немного развеяли. У меня поначалу были мысли
непосредственно Bitmap строку за строкой переписать в массив
байтов. Но там надо достаточно тонко знать структуру bmp
да еще с оглядкой на то, что в конце концов надо не bmp
а gif - поэтому и я сначала соображал, что надо все сначала
сбрасывать в TMemoryStream. Но я пасую перед магией StdInput,
StdOutput.
← →
Романов Р.В. (2003-01-19 17:14) [3]
> write(t);//а это мне не понятно
Выводим строку с картинкой в StdOut
> А с меня требуют типа s, t: Array[1..1000000] of Byte;
Пожалуйста только вывод делайте в цикле
for i:=1 ..
write(Char(t[i]));
Чтобы не возникло преобразование значения байта в его строковое представление.
> Так вот меня смущает только вопрос: в Вашем фрагменте не
> видно
> где StdInput а где StdOut. Наверно еще какие-то функции
> должны быть связанные с адрессацией стандартного потока
> ввода-вывода. Или я не прав
В консольном приложении команды read/write асоциированы со стандартным потоком ввода/вывода
А как перенаправить поток вывода одного консольного приложения на поток другого я не подскажу (сам не знаю).
PS: Обмен информацией между приложениями можно сделать через файлы отображенные в память (см. CreateFileMapping)
Желаю Успеха.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c