// Der folgende Code dient dazu, mehrere Zellen eines TStringGrid zur
// gleichen Zeit zu markieren.



// Wenn man die Control-Taste
(Strg) gedrückt hält, kann man mit der
// linken Maustaste einzelne Zellen markieren. Hält man die Shift-Taste,
// dann werden gleichzeitig wagerecht nebeneinander und senkrecht
// untereinander liegende markierte Zellen miteinander verbunden.

// Getestet mit D4 unter XP

type 
  aoaob = array of array of boolean; 
 
const 
  selBrush = clBlue; 
  selFont = clWhite; 
  normBrush = clWhite; 
  normFont = clNavy; 
 
var 
  cellArray: aoaob; 
 
procedure leer(sg: TStringgrid; arr: aoaob); 
var 
  x, y: integer; 
begin 
  with sg do 
    for x := 0 to Colcount - 1 do 
      for y := 0 to Rowcount - 1 do 
        arr[x, y] := false; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  with Stringgrid1 do begin 
    setlength(cellArray, Colcount, Rowcount); 
    Options := Options - [goRowselect]; 
  end; 
  leer(Stringgrid1, cellArray); 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  cellArray := nil; 
end; 
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
  Rect: TRect; State: TGridDrawState); 
begin 
  with TStringGrid(Sender), canvas do 
    if (aCol >= Fixedcols) and (aRow >= Fixedrows) then begin 
      if cellArray[aCol, aRow] then begin 
        brush.color := selBrush; 
        font.color := selFont; 
      end else begin 
        brush.color := normBrush; 
        font.color := normFont; 
      end; 
      fillrect(Rect); 
      TextRect(Rect, Rect.left + 2, Rect.top + 2, Cells[aCol, aRow]); 
    end; 
end; 
 
procedure TForm1.StringGrid1MouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
var i, j: integer; 
  b: boolean; 
begin 
  with TStringGrid(Sender) do begin 
    mousetocell(x, y, x, y); 
    if Shift = [ssCtrl, ssLeft] then begin 
      Editormode := false; 
      cellArray[x, y] := not cellArray[x, y]; 
      Refresh; 
    end else if Shift = [ssShift, ssLeft] then begin 
      CellArray[x, y] := true; 
      b := false; 
      for i := x - 1 downto 0 do 
        if CellArray[i, y] then begin 
          for j := i + 1 to x - 1 do 
            CellArray[j, y] := true; 
          b := true; 
          break; 
        end; 
      if not b then begin 
        for i := x + 1 to colcount - 1 do 
          if CellArray[i, y] then begin 
            for j := i - 1 downto x + 1 do 
              CellArray[j, y] := true; 
            break; 
          end; 
      end; 
      b := false; 
      for i := y + 1 to rowcount - 1 do 
        if CellArray[x, i] then begin 
          for j := i - 1 downto y + 1 do 
            CellArray[x, j] := true; 
          b := true; 
          break; 
        end; 
      if not b then begin 
        for i := y - 1 downto 0 do 
          if CellArray[x, i] then begin 
            for j := i + 1 to y - 1 do 
              CellArray[x, j] := true; 
            break; 
          end; 
      end; 
      Refresh; 
    end; 
  end; 
end; 
 
 
// alle Markierungen löschen: 
 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  leer(Stringgrid1, cellArray); 
  Stringgrid1.refresh; 
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke