![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте.
подскажите пожалуйста, есть ли уже варианты решения или, возможно, компоненты, чтобы на форме отобразить такую "плитку", которую можно будет наполнить нек. значениями с базы, структура заранее известна, что-то подобное: ![]() или нужно свой вело создавать? спасибо Последний раз редактировалось activexpoint, 03.12.2014 в 01:06. |
|
#2
|
||||
|
||||
|
Нужен компонет StringGrid плюс его "родная" процедура DrawCell, для примера, похожая на эту из drkb
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Const //сдесь определяем Ваш цвет.
clPaleGreen = TColor($CCFFCC);
clPaleRed = TColor($CCCCFF);
begin
//Если ячейка получает фокус, то нам надо закрасить её другими цветами
if (gdFocused in State) then begin
StringGrid1.Canvas.Brush.Color := clBlack;
StringGrid1.Canvas.Font.Color := clWhite;
end else //Если же ячейка теряет фокус, то закрашиваем её красным и зелёным
if ACol = 2 //Вторая колонка будет зелёной , другие - ячейки красными
then StringGrid1.Canvas.Brush.color := clPaleGreen
else StringGrid1.canvas.brush.Color := clPaleRed;
//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column
//Естевственно это завит от того, есть у Вас title-Row/Columns или нет.
If (ACol > 0) and (ARow>0) then
begin
//Закрашиваем бэкграунд
StringGrid1.canvas.fillRect(Rect);
//Закрашиваем текст (Text). Также здесь можно добавить выравнивание и т.д..
StringGrid1.canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
end;
end; |
|
#3
|
|||
|
|||
|
Спасибо, но я не совсем верно описал вопрос
Тут вопрос не в том, как разукрасить ячейки, а в их положении(статическое), и их наполнения. Структура подобная: ![]() Вопрос, что лучше использовать и есть ли уже что-то подобное готовое? Мне нужно создать что-то подобное бронированию мест в кинотеатре(расположение и количество заранее известно). Важно еще красиво отображать |
|
#4
|
||||
|
||||
|
Если красиво, я бы рисунки в ячейки приятно-информативные повставлял бы - стильно бы смотрелось. А так - можно внедрить в ячейки указатель на их цвет и затем при инициализации сборки раскрашивать их в соответствии с заданной схемой, для простоты в примере цвет условно задаётся числом.
Вот и он (пример) Код:
...
var
dt: array[0..10] of array[0..7] of integer =
((0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0),
(0,0,1,1,1,2,2,0),
(0,0,1,1,1,2,2,0),
(0,0,1,1,1,2,2,0),
(0,0,0,1,1,2,2,0),
(0,0,0,1,1,2,0,0),
(0,0,0,1,1,0,0,0),
(0,0,0,3,3,0,0,0),
(0,0,0,3,0,0,0,0),
(0,0,0,0,0,0,0,0));
type
TColorRowColObj = class(TObject)
public
clr: integer;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i, j: integer;
begin
for i := 0 to StringGrid1.RowCount do
for j := 0 to StringGrid1.ColCount do
begin
StringGrid1.Objects[j, i]:= TColorRowColObj.Create;
(StringGrid1.Objects[j, i] as TColorRowColObj).clr:= dt[i, j];
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; vCol, vRow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with (Sender as TStringGrid), Canvas do
begin
case (Objects[vCol, vRow] as TColorRowColObj).clr of
0: Brush.Color:= clWhite;
1: Brush.Color:= clYellow;
2: Brush.Color:= clGreen;
3: Brush.Color:= clRed;
end;{case}
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, Cells[vCol, vRow]);
end;
end; |
|
#5
|
|||
|
|||
|
Ребята, подскажите как отследить позицию прокрутки Скролбара у Стрингргрида?
Ползунок прокрутки может быть в трех положениях:левое, по центру, правое. Мне нужно отслеживать при изменении. Нагуглил, что можно делать свой сабкласс SG, переопределять WMHScroll для перехвата. Использовать его или есть лучший способ? |
|
#6
|
||||
|
||||
|
А что значит - отследить? В смысле или узнать в какую сторону кликнул юзер, либо следует перемещать "полотно" сетки лишь в три вышеозначенные позиции? Проясните, пжлст
Вот всё, что можно получить\переслать от\к скролбарки (выдержка из модуля Messages) Цитата:
З.Ы. Кстати, второе можно эмпирически подогнать изменяя ширину видимой части стрингрида на форме ![]() |
|
#7
|
|||
|
|||
|
Так, как я знаю, что заголовки ячеек нельзя объединять, то я кинул пару панелей на форму в качестве заголовков. Хочу, в зависимости от гориз. прокрутки грида, менять размер панелей, чтобы размер совпадал.
Цитата:
Скролл имеет 3 позиции, при прокрутке(напр. бегунок с левого положения-по-центру или с центр.- правое) отображаемоя область СГ сдвигается на 1 столбец. Этот вопрос уже решил так: Проверяю при отрисовке SG.LeftCol, в зависимости от знач. подгоняю размер панелей. Не уверен, что это оптимальное решение, но работает. Появился новый вопрос: Можно ли менять размер(расстягивать вручную) столбца СГ, если нет фиксированных полей? читал о способе, через зажим мишки на границе ячейки, рассчет сдвига и потом изменение колонки, но я не могу найти этот кусок кода. Может кто-то сталкивался? |