|
#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, в зависимости от знач. подгоняю размер панелей. Не уверен, что это оптимальное решение, но работает. Появился новый вопрос: Можно ли менять размер(расстягивать вручную) столбца СГ, если нет фиксированных полей? читал о способе, через зажим мишки на границе ячейки, рассчет сдвига и потом изменение колонки, но я не могу найти этот кусок кода. Может кто-то сталкивался? |