Komponent xstringgrid - dokumentacja/przykłady

0

Witam. Potrzebuje się dowiedzieć jakie atrybuty posiada komponent xstringgrid. Z dołączonego dema wynika że sporo ciekawych rzeczy można tym zrobić nie znalazłem jednak tego co mnie najbardziej interesowało mianowicie potrzebuję w prosty sposób kolorować pojedyncze komórki. Da się przez canvas ale nie potrafię tego zrobić tak żeby działało poprawnie. Szukam więc innego rozwiązania. Z tego co widziałem w demie da się pokolorować co drugą komórkę tego komponentu na inny kolor więc czemu miało by się nie dać pokolorować dowolnej ? Druga sprawa potrzebuję odczytać jaki kolor ma kliknięta komórka. Czy ktoś takie coś robił z tym albo innym komponentem ? Jeśli tak to proszę o jakieś przykłady. Przeszukałem forum i znalazłem wiele pytań na temat kolorowania klasycznego stringgrida niestety ludzie chcieli kolorować albo wiersze albo kolumny - to potrafię zrobić z tym xstringgrid. natomiast jeśli kolorowane były komórki wymagało to wyłączenia defaultdrawing-u a takie rozwiązanie mnie nie satysfakcjonuje bo strasznie komplikuje wyświetlanie jakiegokolwiek tekstu. Pozostaje jeszcze zmiana komponentu na drawgrid ale wtedy także jest problem z wprowadzaniem tekstu tam gdzie jest potrzebny. Czy naprawdę nie ma komponentu który by pozwalał na zrobienie tak pozornie banalnej rzeczy jak zmiana koloru komórki po jej kliknięciu ? Nie zajmuję sie programowaniem na co dzień więc pisanie własnego komponentu raczej odpada. Potrzebuję napisać jeden program i mam mało czasu jak na razie jest zmiana koloru zastąpiona zmianą zawartości tekstowej i cała reszta funkcji w programie działa ale tekst zamiast kolorów powoduje że całość jest bardzo nie czytelna. Z góry dziękuję za pomoc.

0

Naskrobałem Ci kod. Mam nadzieję, że pomoże. Pozdrawiam. Adam.

unit Unit7;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm7 = class(TForm)
    SG: TStringGrid;
    procedure SGMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
      State: TGridDrawState);
    procedure SGMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

    IsClicked :array of array of Boolean;
    pt :TGridCoord;
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.FormCreate(Sender: TObject);
var
  i, j :Word;
begin
  SG.ColCount := 10;
  SG.RowCount := 10;

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

  SG.DefaultDrawing := false;

  for i := 0 to SG.ColCount - 1 do
    for j := 0 to SG.RowCount - 1 do
      IsClicked[i][j] := false;
end;

procedure TForm7.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
  State: TGridDrawState);
begin
  with SG do
  begin
    if (gdFixed in State) then
        begin
          Canvas.Brush.Color := clBtnFace;
          Canvas.Font.Color := clWindowText;
        end else
        begin
          if (IsClicked[ACol, ARow]) then
             begin
               Canvas.Brush.Color := clMoneyGreen;
               Canvas.Font.Color := clGreen;
               Canvas.Font.Style := [fsBold];
             end else
             begin
               Canvas.Brush.Color := clWindow;
               Canvas.Font.Color := clWindowText;
               Canvas.Font.Style := [];
             end;
        end;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+1, Rect.Top+1, SG.Cells[ACol, ARow]);
  end;
end;

procedure TForm7.SGMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  pt := SG.MouseCoord(x, y);
end;

procedure TForm7.SGMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  IsClicked[pt.X, pt.Y] := not IsClicked[pt.X, pt.Y];
  SG.Repaint();
end;

end.
0

No niestety nie bardzo mi to działa pewnie gdzieś robię błąd jak na razie po prostu utworzyłem forme ze stringgrid-em i przekleiłem kod pozmieniałem co trzeba i niestety nie chodzi jak mniemam po kliknięciu którejś komórki powinna ona zmienić kolor.

0

Dlaczego mam wrażenie, ze nie przypisałeś procedur obsługi eventów pod eventy?

Utwórz formę, upuść TStringGrid, wygeneruj zdarzenia:
OnCreate dla formy, OnDrawCell, OnMouseDown, OnMouseUp dla SG. Przeklej ciała procedur

0

No teraz działa :) Pozostały mi 2 pytania jak wprowadzić tekst do szarych komórek dookoła i co zrobić żeby wyglądały one trójwymiarowo tak jak przy włączonym DefaultDrawing-u.

0

Co do 3D - so namaluj. Co do wprowadzania tekstu - nie przeginaj

0

No uporałem się z problemami program wygląda i działa już całkiem nieźle. pozostał jeszcze jeden problem do rozwiązania mianowicie jak zresetować stringgrid-a do stanu jak po odpaleniu programu ? tj usunąć całą zawartość tablicy ? pÓÓÓÓki co robie to na piechotę kasując zawartość kolumna po kolumnie przy małej ilości kolumn wszystko jest ok ale przy 8000 zaczyna trwać wieki więc pytanie czy jest na to jakieś gotowe rozwiązanie ?

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