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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2008, 21:05   #1
dimon000
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 30
По умолчанию Кнопки в TStringGrid

Как можно сделать так, чтобы во всех ячейках определённого столбца TStringGrid находилось по кнопке, причём реакция на нажатие разных кнопок была разной?
dimon000 вне форума Ответить с цитированием
Старый 28.07.2008, 22:08   #2
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

таким спсобом можно разные компоненты засовывать в ячейки.
держи исходник, там основная идея КАК это сделать. Если кнопок будет много, то придется подумать над оптимизацией кода
Вложения
Тип файла: rar na forum but in grid.rar (5.9 Кб, 129 просмотров)
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 28.07.2008, 22:15   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от dimon000 Посмотреть сообщение
Как можно сделать так, чтобы во всех ячейках определённого столбца TStringGrid находилось по кнопке, причём реакция на нажатие разных кнопок была разной?
При желании можно и TButton вставить:
Код:
type
  TNewStringGrid = class(TStringGrid)
  private
     FLastTopRow : integer;
  protected
     procedure Paint; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    SG:TNewStringGrid;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var B:TButton;
    i:integer;
begin
   SG := TNewStringGrid.Create(Self);
   SG.Parent     := Self;
   SG.RowCount   := 66;
   SG.Align      := alClient;
   SG.OnDrawCell := StringGrid1DrawCell;

   for i:=0 to SG.RowCount-1 do begin
      B := TButton.Create(Self);
      B.Parent := SG;
      B.Caption := 'Button '+intToStr(i);
      B.Left := -100;
      B.Top  := -100;
      //B.OnClick := Button1Click;
      B.OnMouseDown := Button1MouseDown;
      B.Tag     := i+1;
      SG.objects[1, i] := B;
   end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
var B:TButton;
begin
   if Col = 1 then begin // В этой колонке кнопки
      B := TButton(SG.objects[1, Row]);
      B.BoundsRect := Rect;
   end;

   if Col = 2 then begin  // Простое рисование
      Windows.DrawFrameControl(SG.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH);
   end;
end;

procedure TNewStringGrid.Paint;
var i:integer;
    B:TButton;
begin
   // К сожалению методы не виртуальные и об изменении проще узнать здесь
   if FLastTopRow <> TopRow then begin
      FLastTopRow := TopRow;
      InvalidateCol(1);
      for i:=0 to RowCount-1 do begin
         B := TButton(objects[1, i]);
         B.Left := -100;
      end;
   end;
   inherited
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   ShowMessage(intToStr(TButton(Sender).Tag));
end;
Но проще будет просто нарисовать кнопку и сделать реакцию на нажатие мышки. Рисование в OnDrawCell вызовом

Windows.DrawFrameControl(StringGrid 1.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH);

--------------------------------
2Roof Метод тот-же. Только приходится пересчитывать координаты кнопок при изменении TopRow. StringGrid не вызывает DrawCell для всех ячеек при сдвиге окна на одну строку.

Последний раз редактировалось alexBlack; 28.07.2008 в 22:21.
alexBlack вне форума Ответить с цитированием
Старый 29.07.2008, 09:15   #4
Банзай
Пользователь
 
Аватар для Банзай
 
Регистрация: 21.08.2007
Сообщений: 89
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
B := TButton.Create(Self);
а нужно память очищать потом?
подписываюсь
Банзай вне форума Ответить с цитированием
Старый 29.07.2008, 10:54   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Банзай Посмотреть сообщение
а нужно память очищать потом?
В данном случае нет, т.к. мы указываем владельца - TForm1. Кнопки будут уничтожены при освобождении формы.
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UCOZ: Кнопки кнопки на изображении ReDuX HTML и CSS 19 25.04.2008 02:39
Помогите со TStringGrid Sanprof Общие вопросы Delphi 3 06.03.2008 16:20
TStringGrid Gromsky Компоненты Delphi 4 04.03.2008 23:41
триггерные кнопки и кнопки переключатели в DELPHI MARGO Помощь студентам 3 12.11.2007 17:35
TStringGrid mrandrey Компоненты Delphi 2 06.07.2007 15:24