Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2015, 23:08   #11
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

чтобы быстро найти что либо) ярко зеленое слово или текст привлечёт внимание, ну и вообще интересно было
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 15.10.2015, 00:09   #12
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,888
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. а зачем цвета в консоли?! Вам не кажется, что это блажь?
Я бы спросил другое. А зачем/почему консоль? И если ТС объяснит необходимость именно консоли, тогда можно подумать и о том зачем в ней цвета.
P.S. Ностальгия по ДОСу

P.P.S. Кстати сейчас я являюсь главным стрелочником(козлом отпущения) по функционированию систем видеонаблюдения в одном из международных банков.
Загрузка ОС и ПО в видеосерверах сопровождается кучей сообщений именно в консоли. Так вот весьма полезно видеть сообщения об ошибке именно красным цветом. Точнее любым другим, но лучше красным.

Последний раз редактировалось northener; 15.10.2015 в 00:54.
northener вне форума Ответить с цитированием
Старый 15.10.2015, 08:41   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А зачем/почему консоль?
Наверное консольный бравзерь ТС пишет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.10.2015, 10:02   #14
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,596
По умолчанию

Проверил такой вариант:
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

function Color(C: Byte): string;
var
  hConsoleOutput: THandle;
  CBI: TConsoleScreenBufferInfo;
  TextAttr: Byte;
begin
  hConsoleOutput := GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(hConsoleOutput, CBI);
  TextAttr := (C and $0F) or (CBI.wAttributes and $F0);
  SetConsoleTextAttribute(hConsoleOutput, TextAttr);
  Result := '';
end;

begin
  // Так не работает:
  WriteLn(Color(12), 'Hello, ', Color(14), 'World!');
  // Так работает:
  Write(Color(12), 'Hello, ');
  WriteLn(Color(14), 'World!');
  ReadLn;
end.
Не прокатило, сначала вычисляются значения всех параметров в Write (причем справа-налево), а потом уже выводится готовая строка.
Arigato на форуме Ответить с цитированием
Старый 15.10.2015, 13:10   #15
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Раньше тоже так делал: удобно подсвечивать ошибки или важную информацию.
Обычно пишу пару процедур наподобие:
Код:
procedure clwriteln(color:byte; value:shortstring);
var
  h:thandle;
  attr:cardinal;
  cr:_coord;
  scbi:TConsoleScreenBufferInfo;
begin
  h:=GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(h,scbi);
  cr:=scbi.dwCursorPosition;
  writeln(value);
  FillConsoleOutputAttribute(h,color,length(value),cr,attr);
end;

procedure clwrite(color:byte; value:shortstring);
var
  h:thandle;
  attr:cardinal;
  cr:_coord;
  scbi:TConsoleScreenBufferInfo;
begin
  h:=GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(h,scbi);
  cr:=scbi.dwCursorPosition;
  write(value);
  FillConsoleOutputAttribute(h,color,length(value),cr,attr);
end;
использовать например так:
Код:
const
  clerror=12;
  clregular=15;
  clhighlight=240;
  clmark=14;


begin
try
  clwriteln(clhighlight,'Just another "Hello world" application');
  clwriteln(clregular,'this is just a test application');
  clwrite(10,'it ');
  clwrite(11,'allows ');
  clwrite(12,'to ');
  clwrite(13,'write ');
  clwrite(14,'colored ');
  clwrite(15,'text ');

except
      on E: Exception do
      clWriteln(clerror,E.ClassName+': '+ E.Message);
end;
    readln;
end.
ну и на выходе:
DIONISKA вне форума Ответить с цитированием
Старый 15.10.2015, 14:04   #16
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,596
По умолчанию

Я тут немного поиздевался:

Код:
program CC;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

type
  TColor = class
    private
      constructor Create(C: Byte);
      destructor Free;
      procedure SetColor;
    public
      hConsoleOutput: THandle;
      TextAttr: Byte;
      Color: Byte;
  end;

constructor TColor.Create(C: Byte);
var
  CBI: TConsoleScreenBufferInfo;
begin
  hConsoleOutput := GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(hConsoleOutput, CBI);
  TextAttr := CBI.wAttributes;
  Color := C;
end;

destructor TColor.Free;
begin
  SetConsoleTextAttribute(hConsoleOutput, TextAttr);
end;

procedure TColor.SetColor;
var
  CBI: TConsoleScreenBufferInfo;
begin
  GetConsoleScreenBufferInfo(hConsoleOutput, CBI);
  SetConsoleTextAttribute(
    hConsoleOutput,
    (Color and $0F) or (CBI.wAttributes and $F0)
  );
end;

procedure ColorWrite(Args: array of const);
var
  i: Integer;
  Color: TColor;
begin
  Color := TColor.Create(0);
  for i := Low(Args) to High(Args) do begin
    case Args[i].VType of
      vtInteger: Write(Args[i].VInteger);
      vtExtended: Write(Args[i].VExtended^);
      vtBoolean: Write(Args[i].VBoolean);
      vtChar: Write(Args[i].VChar);
      vtWideChar: Write(Args[i].VWideChar);
      vtString: Write(Args[i].VString^);
      vtAnsiString: Write(AnsiString(PAnsiString(Args[i].VAnsiString)));
      vtWideString: Write(WideString(Args[i].VWideString));
      vtPChar: Write(Args[i].VPChar);
      vtPWideChar: Write(Args[i].VPWideChar);
      vtVariant: Write(Args[i].VVariant^);
      vtInt64: Write(Args[i].VInt64^);
      vtPointer: Write(IntToHex(Cardinal(Args[i].VPointer), 8));
      vtObject: TColor(Args[i].VObject).SetColor;
    end;
  end;
  Color.Free;
end;

procedure ColorWriteLn(Args: array of const);
begin
  ColorWrite(Args);
  WriteLn;
end;

var
  Red, Yellow, White: TColor;

  a: integer;

begin
  Red := TColor.Create(12);
  Yellow := TColor.Create(14);
  White := TColor.Create(15);
  a := 123;
  ColorWriteLn([357, White, ' Hello, ', true, Red, ' World - ', a+5, Yellow, ' ', 'C']);
  Writeln('eee - aaa');
  ReadLn;
end.
Вот, собственно, строка вывода с цветами:

ColorWriteLn([357, White, ' Hello, ', true, Red, ' World - ', a+5, Yellow, ' ', 'C']);

В примере задано 3 цвета, можно надобавлять по аналогии и остальные цвета.

Последний раз редактировалось Arigato; 15.10.2015 в 14:06.
Arigato на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка с writeln shalgan Помощь студентам 1 08.06.2015 17:31
Цвет для writeln - паскаль Silverstone Помощь студентам 4 03.06.2012 10:07
Когда нужно присваивать.. Writeln(Sum:8:4) ? Erlotaza Общие вопросы Delphi 1 09.03.2012 11:25
Writeln в TPascal VadEr Помощь студентам 8 13.05.2009 15:12
задачи через writeln и readln MELKOVSKY Паскаль, Turbo Pascal, PascalABC.NET 3 24.01.2008 14:04