Q:> Как изменить стандартный набор цветов в программе на TV?
A: Начнем с того, что все видимые обьекты, создаваемые вами наследованием
от TView имеют метод GetPalette.
Переопределяя палитру мы получаем цвет из стандартной палитры...
Стандартная палитра представляет собой строку символов,
каждый символ которой представляет собой байт текстового атрибута,
аналогичного переменной TextAttr модуля Crt.
TV имеет в своем распоряжении 3 палитры:
CAppColor,CAppBlackWhite,CAppMonochrome;
К сожалению, данные переменные описаны как константы,
поэтому манипулирование ими невозможно...
Вот тут и поможет метод Application.GetPallette;
Достаточно создать наследника от TApplication и перекрыть его метод
GetPalette;
Вот пример кода:
Function TApp.GetPalette:PPalette;
var S:String;
begin
case WhatPalette of
1:S:=MyPalette;
2:S:=CAppColor;
3:S:=CAppBlackWhite;
4:S:=CAppMonochrome;
end;
{и кстати, что мешает нам сделать например S[22]:=#$8A ?-)))) }
GetPalette:=@S;
end;
Q:> А мне тех цветов, что есть в палитре, не хватает! Что делать?
A: В этом случае необходимо обратить внимание на процедуру рисования обьекта
на экране, т.е. на метод Draw.
При отображении его можно заставить вывести вообще произвольный цвет...
Вот небольшой пример...
Bkg:=(lo(GetColor(2)) and $F0) shr 4; {получаем цвет для фона}
MyColor:=Bkg*16+ColorAttr[1]; {назначаем свой цвет для
отображения символов
(палитра - не используется) }
Color:=MyColor;
MoveChar(B[CurCol],' ',Color,ColWidth); {переносим изображение в буфер (фон)}
MoveStr(B[CurCol+1],Text,Color); {переносим текст}
WriteLine(0, I, Size.X, 1, B); {выводим буфер}
Q:> А как сделать хранение многих палитр во внешних файлах
> (как в Дос Навигаторе) ?
A: Вот набор процедур для организации этого...
Все они достаточно примитивны ;))))
И не забудьте переопределить метод GetPalette у вашего наследника
TApplication...
const WorkPalette:String=' ваша рабочая палитра по умолчанию ';
Procedure SavePalette(PaletteFile:String);
{сохранить палитру в файл}
var f:file;
begin
Assign(f,PaletteFile);
rewrite(f,1);
BlockWrite(f,WorkPalette,SizeOf(String));
close(f);
end;
Procedure LoadPalette(PaletteFile:String);
{ загрузить палитру из файла }
var f:File;
begin
Assign(f,s);
reset(f,1);
BlockRead(f,WorkPalette,SizeOf(String));
close(f);
end;
Procedure SetAppPalette(PaletteFile:String);
{ загрузить и установить палитру }
begin
LoadPalette(PaletteFile);
Application^.GetPalette^:=WorkPalette; {небольшой финт ушами ;))))}
{ эти две строчки необходимы для моментального отображения изменений в
палитре, не ожидая по какое либо окно свернеться/развернеться}
Application^.Redraw;
Desktop^.Redraw;
end;
(с) 2001 by Dmitry Beloshistov AKA [-=BDS=-]
WBR, Dmitry Beloshistov AKA [-=BDS=-]
e-mail: torin@kerin.donetsk.ua
|