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...
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...
Czy naprawde na 4programmers nikt nie wie jak to zrobić ?
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.