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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2014, 06:46   #1
S_Yevgeniy
Форумчанин
 
Аватар для S_Yevgeniy
 
Регистрация: 08.07.2009
Сообщений: 246
По умолчанию Объедение ячеек StringGrid_a

Доброе время суток.
Встала задача объединения ячеек StringGrid. Кто-то скажет гугол в помощь, я там уже был толковых примеров к сожалению не нашел. Чаще всего предлагают сторонние компоненты, хотя и говорят про прорисовку StringGrid1DrawCell. Просто мне не хватает знаний как объединить там ячейки, или напротив разделить.
после того как мне помогли с ComboBox http://www.programmersforum.ru/showt...light=combobox, закрались сомнения в использование сторонних компонентов и появилась уверенность что и в гриде есть возможность решить поставленную задачу. Очень надеюсь на помощь.
Заранее большое спасибо!
Да прибудет с Вами свет и радость!!!
S_Yevgeniy вне форума Ответить с цитированием
Старый 19.12.2014, 11:37   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

А теперь расшифруйте, что значит "объединить" и что значит "разделить" ячейки StringGrid в вашем понимании.
Или опять надо звать на помощь min@y™ и пытать вас электрошоком?

Последний раз редактировалось kropotkina-alice; 19.12.2014 в 12:40.
kropotkina-alice вне форума Ответить с цитированием
Старый 19.12.2014, 12:08   #3
S_Yevgeniy
Форумчанин
 
Аватар для S_Yevgeniy
 
Регистрация: 08.07.2009
Сообщений: 246
По умолчанию

На рисунках представлено что значит объединить.

Что-то у народа наклонности странные последние время. Попытать электрошокером и так далее.
Изображения
Тип файла: jpg 111.jpg (12.2 Кб, 300 просмотров)
Тип файла: jpg 1111.jpg (43.8 Кб, 267 просмотров)
Да прибудет с Вами свет и радость!!!
S_Yevgeniy вне форума Ответить с цитированием
Старый 19.12.2014, 12:13   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Объединить то можно, убрав стандартную прорисовку ячеек и разделительных линий и делать это самостоятельно. Но текст в объединенных поместить аккуратно проблемно. Скорее всего искать более продвинутый вариант. Насчет текста в объединенных нужно пробовать, может и получится
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.12.2014, 12:37   #5
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от S_Yevgeniy Посмотреть сообщение
На рисунках представлено что значит объединить
А составить нужный стринггрид из нескольких в голову не пришло?
Или вообще "сконстролить" шапку из панелек?
kropotkina-alice вне форума Ответить с цитированием
Старый 19.12.2014, 13:55   #6
S_Yevgeniy
Форумчанин
 
Аватар для S_Yevgeniy
 
Регистрация: 08.07.2009
Сообщений: 246
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
А составить нужный стринггрид из нескольких в голову не пришло?
Или вообще "сконстролить" шапку из панелек?
Ну да лучше скотчем приклеить к экрану шапку и не парится или кнопками пригвоздить.


Цитата:
Сообщение от Аватар Посмотреть сообщение
Объединить то можно, убрав стандартную прорисовку ячеек и разделительных линий и делать это самостоятельно.
Аватар Вы не могли бы с прорисовкой помочь. То что у меня получилось не совсем правильно работает

Насчет проблем с текстом может что гугол подскажет или другие участники форума.
Да прибудет с Вами свет и радость!!!
S_Yevgeniy вне форума Ответить с цитированием
Старый 19.12.2014, 16:15   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.RowCount:=6; StringGrid1.FixedRows:=0;
  StringGrid1.ColCount:=6; StringGrid1.FixedColor:=0;
  StringGrid1.Options:=StringGrid1.Options-[goVertLine,goHorzLine];
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var s: String;
    Rect1,Rect2: TRect;
    xFilled: Boolean;
begin
  StringGrid1.Canvas.Brush.Color:=clBlack;
  xFilled:=True;
  if (ARow=0) and (ACol in [1..3]) then begin
    Rect1:=StringGrid1.CellRect(1,0);
    Rect2:=StringGrid1.CellRect(3,0);
    Rect:=Classes.Rect(Rect1.Left,Rect1.Top,Rect2.Right,Rect2.Bottom);
    s:='Заголовок1';
  end
  else if ARow=3 then begin
    Rect1:=StringGrid1.CellRect(0,3);
    Rect2:=StringGrid1.CellRect(5,3);
    Rect:=Classes.Rect(Rect1.Left,Rect1.Top,Rect2.Right,Rect2.Bottom);
    s:='Заголовок2';
  end
  else begin
    s:=IntToStr(ARow*10+ACol);
    xFilled:=False;
  end;
  StringGrid1.Canvas.FrameRect(Classes.Rect(Rect.Left-1,Rect.Top-1,Rect.Right+1,Rect.Bottom+1));
  if xFilled then begin
    StringGrid1.Canvas.Brush.Color:=clYellow;
    StringGrid1.Canvas.FillRect(Rect);
  end
  else StringGrid1.Canvas.Brush.Color:=clWhite;
  DrawText(StringGrid1.Canvas.Handle,PChar(s),Length(s),Rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;
Можно еще поиграться с заливкой для разных State
Изображения
Тип файла: jpg Безымянный.JPG (21.7 Кб, 283 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.12.2014 в 16:36.
Аватар вне форума Ответить с цитированием
Старый 22.12.2014, 12:47   #8
S_Yevgeniy
Форумчанин
 
Аватар для S_Yevgeniy
 
Регистрация: 08.07.2009
Сообщений: 246
По умолчанию

Огромное Вам Спасибо!
Да прибудет с Вами свет и радость!!!
S_Yevgeniy вне форума Ответить с цитированием
Старый 25.12.2014, 13:01   #9
S_Yevgeniy
Форумчанин
 
Аватар для S_Yevgeniy
 
Регистрация: 08.07.2009
Сообщений: 246
По умолчанию

Возникала еще одна проблема с выделением ячеек.

Вот немного изменённый код может будет кому полезен.

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.DefaultDrawing:=false;
  StringGrid1.RowCount:=6; StringGrid1.FixedRows:=0;
  StringGrid1.ColCount:=6; StringGrid1.FixedColor:=0;
  StringGrid1.Options:=StringGrid1.Options-[goVertLine,goHorzLine];
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;  Rect: TRect; State: TGridDrawState);
var s: String;
    Rect1,Rect2: TRect;
    xFilled: Boolean;
    Color_G, SCol, SRow : integer;

begin

     SRow:=TStringGrid(Sender).Row;
     SCol:=TStringGrid(Sender).Col;

            TStringGrid(Sender).Canvas.Brush.Color:=clBlack; Color_G:=0;
            TStringGrid(Sender).Canvas.Font.Color :=clBlack;

  xFilled:=True;

  if (ARow=0) and (ACol in [1..3]) then begin
    Rect1:=StringGrid1.CellRect(1,0);
    Rect2:=StringGrid1.CellRect(3,0);
    Rect:=Classes.Rect(Rect1.Left,Rect1.Top,Rect2.Right,Rect2.Bottom);
     Color_G:=1; s:='Заголовок1';
  end
  else if (ACol=0) and (ARow in [1..3]) then begin
    Rect1:=StringGrid1.CellRect(ACol,1);
    Rect2:=StringGrid1.CellRect(ACol,3);
    Rect:=Classes.Rect(Rect1.Left,Rect1.Top,Rect2.Right,Rect2.Bottom);
     Color_G:=2; s:='Заголовок2';
  end
  else begin
    s:=IntToStr(ARow*10+ACol);
    xFilled:=False;
    Rect:=TStringGrid(Sender).CellRect(ACol,ARow);

    if (gdSelected in State) and (SRow=ARow) and (SCol=ACol) then
       begin
          xFilled:=True;
         TStringGrid(Sender).Canvas.Font.Color := clHighlightText;
         TStringGrid(Sender).Canvas.Brush.Color := clBlack;
         Color_G:=3;
       end;

  end;
  StringGrid1.Canvas.FrameRect(Classes.Rect(Rect.Left-1,Rect.Top-1,Rect.Right+1,Rect.Bottom+1));

  if xFilled then begin
    TStringGrid(Sender).Canvas.Brush.Color:=$00D6D6D6;//clYellow;
    if Color_G=1 then TStringGrid(Sender).Canvas.Brush.Color:=clYellow;
    if Color_G=2 then TStringGrid(Sender).Canvas.Brush.Color:=clLime;
    if Color_G=3 then TStringGrid(Sender).Canvas.Brush.Color:=clBlue;
    TStringGrid(Sender).Canvas.FillRect(Rect);
    StringGrid1.Canvas.FillRect(Rect);
  end
  else StringGrid1.Canvas.Brush.Color:=clWhite;
  TStringGrid(Sender).Canvas.FillRect(Rect);
  DrawText(StringGrid1.Canvas.Handle,PChar(s),Length(s),Rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER);


end;


Еще раз спасибо за помощь
Изображения
Тип файла: jpg 1.jpg (45.8 Кб, 178 просмотров)
Да прибудет с Вами свет и радость!!!
S_Yevgeniy вне форума Ответить с цитированием
Старый 08.02.2017, 09:59   #10
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Всем добра
Очень помогла эта тема.
Вот только не могу понять как заставить перерисовываться (выделяться) всю объеденную область а не только ячейку которая изменяет фокус?
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделить и разнести данные одной ячеек в несколько указанных ячеек sasha555 Microsoft Office Excel 2 31.08.2013 14:24
Расширение зависимости значений ячеек от ниспадающих ячеек Mevok Microsoft Office Excel 8 08.06.2013 16:25
как разделить значения ячеек по формату ячеек? ARIRAN Microsoft Office Excel 6 11.12.2009 15:30
помогите с циклом на объедение 12 dbf таблиц Руслан БД в Delphi 2 29.09.2009 08:35