Zmiana koloru komórki StringGrid'a po kliknięciu myszką ?

0

Witajcie :)

Chcę po onDblClick myszką na wybraną komórkę zmienić kolor tej komórki w StringGridzie na bardziej ciemny ale bez narusznia wyświetlonej informacji.

Dzięki za podpowiedzi...

0

Czy naprawde na 4programmers nikt nie wie jak to zrobić ?

1

Niech Ci będzie.

Na początek musisz utworzyć tablicę dynamiczną, która będzie przechowywała informacje na temat tego czy komórka była kliknięta. Najlepiej zrealizować to na dwuwymiarowej typu boolean:

StateTab :array of array of Boolean;

Jej wymiar musi odpowiadać rozmiarowi grida, czyli

SetLength(StateTab, SG.ColCount, SG.RowCount);

Następnie inicjujemy ją wartością false (czyli niekliknięte)

for i := 0 to SG.ColCount-1 do
  for j := 0 to SG.RowCount-1 do
    StateTab[i, j] := False;

Do pobierania współżędej aktualnej komórki służy metoda

SG.MouseToCell(X, Y, dbCol, dbRow);

gdzie dbCol, dbRow najelpiej zadeklarować jako globalne.

Pobieranie owych zmiennych najłatwiej zrobić w OnMouseDown grida

procedure TForm1.SGMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SG.MouseToCell(X, Y, dbCol, dbRow);
end

Teraz trzeba odpowiednio oprogramować OnDbClick grida. Na starcie komórki są białe, klikasz, są kolorowe, znowu klikasz białe. Najłatwiej zanegować wartości tablicy:

StateTab[dbCol, dbRow] := not StateTab[dbCol, dbRow];

Kliknięcie to nie wszystko. Grid wymaga ponownego odmalowania

SG.Repaint();

Teraz trzeba oprogramować OnDrawCell. W tym celu własność DefaultDrawing na false.

Kod:

type
  TForm1 = class(TForm)
    SG: TStringGrid;
    procedure SGDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure FormCreate(Sender: TObject);
    procedure SGMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SGDblClick(Sender: TObject);
  public
    StateTab     :array of array of Boolean;
    dbCol, dbRow :Integer;
  end;

procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  x, y :Word;
  s    :string;
begin
  s := SG.Cells[ACol, ARow];
  with SG.Canvas do
    begin
      if StateTab[ACol, ARow] then
         Brush.Color := clSilver else Brush.Color := clWindow;

      FillRect(Rect);

      x := ((Rect.Right - Rect.Left) - TextWidth(s)) div 2;
      y := ((Rect.Bottom - Rect.Top) - TextHeight(s)) div 2;
      TextOut(Rect.Left+x, Rect.Top+y, s);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i, j :Word;
begin
  SetLength(StateTab, SG.ColCount, SG.RowCount);

  for i := 0 to SG.ColCount-1 do
    for j := 0 to SG.RowCount-1 do
      StateTab[i, j] := False;
end;

procedure TForm1.SGMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SG.MouseToCell(X, Y, dbCol, dbRow);
end;

procedure TForm1.SGDblClick(Sender: TObject);
begin
  StateTab[dbCol, dbRow] := not StateTab[dbCol, dbRow];
  SG.Repaint();
end;

Jutro jak będę miał chwilkę to zrobię to jako gotowca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1