Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.12.2014, 01:04
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию Веселый Грид

Здравствуйте.
подскажите пожалуйста, есть ли уже варианты решения или, возможно, компоненты, чтобы на форме отобразить такую "плитку", которую можно будет наполнить нек. значениями с базы, структура заранее известна, что-то подобное:

или нужно свой вело создавать? спасибо

Последний раз редактировалось activexpoint, 03.12.2014 в 01:06.
Ответить с цитированием
  #2  
Старый 03.12.2014, 08:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Нужен компонет 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  
Старый 03.12.2014, 11:00
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Спасибо, но я не совсем верно описал вопрос
Тут вопрос не в том, как разукрасить ячейки, а в их положении(статическое), и их наполнения.
Структура подобная:

Вопрос, что лучше использовать и есть ли уже что-то подобное готовое?
Мне нужно создать что-то подобное бронированию мест в кинотеатре(расположение и количество заранее известно). Важно еще красиво отображать
Ответить с цитированием
  #4  
Старый 03.12.2014, 14:33
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Если красиво, я бы рисунки в ячейки приятно-информативные повставлял бы - стильно бы смотрелось. А так - можно внедрить в ячейки указатель на их цвет и затем при инициализации сборки раскрашивать их в соответствии с заданной схемой, для простоты в примере цвет условно задаётся числом.

Вот и он (пример)
Код:
...
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  
Старый 17.12.2014, 16:10
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Ребята, подскажите как отследить позицию прокрутки Скролбара у Стрингргрида?
Ползунок прокрутки может быть в трех положениях:левое, по центру, правое. Мне нужно отслеживать при изменении.
Нагуглил, что можно делать свой сабкласс SG, переопределять WMHScroll для перехвата.
Использовать его или есть лучший способ?
Ответить с цитированием
  #6  
Старый 18.12.2014, 06:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А что значит - отследить? В смысле или узнать в какую сторону кликнул юзер, либо следует перемещать "полотно" сетки лишь в три вышеозначенные позиции? Проясните, пжлст

Вот всё, что можно получить\переслать от\к скролбарки (выдержка из модуля Messages)
Цитата:
const
{ Scroll bar messages }
{$EXTERNALSYM SBM_SETPOS}
SBM_SETPOS = 224; { not in win3.1 }
{$EXTERNALSYM SBM_GETPOS}
SBM_GETPOS = 225; { not in win3.1 }
{$EXTERNALSYM SBM_SETRANGE}
SBM_SETRANGE = 226; { not in win3.1 }
{$EXTERNALSYM SBM_SETRANGEREDRAW}
SBM_SETRANGEREDRAW = 230; { not in win3.1 }
{$EXTERNALSYM SBM_GETRANGE}
SBM_GETRANGE = 227; { not in win3.1 }
{$EXTERNALSYM SBM_ENABLE_ARROWS}
SBM_ENABLE_ARROWS = 228; { not in win3.1 }
{$EXTERNALSYM SBM_SETSCROLLINFO}
SBM_SETSCROLLINFO = 233;
{$EXTERNALSYM SBM_GETSCROLLINFO}
SBM_GETSCROLLINFO = 234;

З.Ы. Кстати, второе можно эмпирически подогнать изменяя ширину видимой части стрингрида на форме
Ответить с цитированием
  #7  
Старый 18.12.2014, 10:30
activexpoint activexpoint вне форума
Прохожий
 
Регистрация: 24.07.2014
Сообщения: 10
Версия Delphi: xe2, 7
Репутация: 10
По умолчанию

Так, как я знаю, что заголовки ячеек нельзя объединять, то я кинул пару панелей на форму в качестве заголовков. Хочу, в зависимости от гориз. прокрутки грида, менять размер панелей, чтобы размер совпадал.

Цитата:
А что значит - отследить? В смысле или узнать в какую сторону кликнул юзер, либо следует перемещать "полотно" сетки лишь в три вышеозначенные позиции? Проясните, пжлст
Да, узнать в какую сторону кликнул юзер и в каком положении ползунок.
Скролл имеет 3 позиции, при прокрутке(напр. бегунок с левого положения-по-центру или с центр.- правое) отображаемоя область СГ сдвигается на 1 столбец.

Этот вопрос уже решил так:
Проверяю при отрисовке SG.LeftCol, в зависимости от знач. подгоняю размер панелей.
Не уверен, что это оптимальное решение, но работает.

Появился новый вопрос:
Можно ли менять размер(расстягивать вручную) столбца СГ, если нет фиксированных полей?

читал о способе, через зажим мишки на границе ячейки, рассчет сдвига и потом изменение колонки, но я не могу найти этот кусок кода. Может кто-то сталкивался?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter