Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
7-87173
opoloXAI
2002-11-16 19:06
2003.01.27
AutoRun Windows


14-87053
Лёха2003
2003-01-05 14:51
2003.01.27
Создание ядра ОС


7-87174
BarikNT
2002-11-13 01:12
2003.01.27
Загрузка DLL


4-87186
sen
2002-12-10 11:09
2003.01.27
закрытие приложения


7-87149
sergio234
2002-11-13 20:04
2003.01.27
Как узнать права юзера под 2000/xp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский