Code:

{

The user can move rows and columns of a StringGrid with the mouse.

Can it also be done by code?

In the help for TCustomGrid you can see the methods MoveColumn and MoveRow,

but they are hidden in TStringGrid.

We can make them accessible again by subclassing TStringGrid and

declaring these methods as public:

}

 

type

TStringGridHack = class(TStringGrid)

public

   procedure MoveColumn(FromIndex, ToIndex: Longint);

   procedure MoveRow(FromIndex, ToIndex: Longint);

end;

 

{

The implementation of these methods simply consists of invoking the

corresponding method of the ancestor:

}

 

procedure TStringGridHack.MoveColumn(FromIndex, ToIndex: Integer);

begin

inherited;

end;

 

procedure TStringGridHack.MoveRow(FromIndex, ToIndex: Integer);

begin

inherited;

end;

 

 

// Example, Beispiel:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

TStringGridHack(StringGrid1).MoveColumn(1, 3);

end;

 

 

 Можно ли сделать так чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?

 

Code:

procedure AutoSizeGridColumn(Grid: TStringGrid; column: integer);

var

i: integer;

temp: integer;

max: integer;

begin

max := 0;

for i := 0 to (Grid.RowCount - 1) do

   begin

     temp := Grid.Canvas.TextWidth(grid.cells

);

     if temp > max then max := temp;

   end;

Grid.ColWidths

:= Max + Grid.GridLineWidth + 3;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

AutoSizeGridColumn(StringGrid1, 1);

end;

 

Автор: Пётр Соболь

 

Code:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow:

Integer; Rect: TRect; State: TGridDrawState);

var

Format: Word;

C: array[0..255] of Char;

r: integer;

begin

C := '';

Format := DT_LEFT or DT_WORDBREAK;

(Sender as TStringGrid).Canvas.FillRect(Rect);

StrPCopy(C, (Sender as TStringGrid).Cells[ACol, ARow]);

if c <> '' then //если есть значения

begin

   r := WinProcs.DrawText((Sender as TStringGrid).Canvas.Handle, C,

     StrLen(C), Rect, Format);

   if r > (Sender as TStringGrid).RowHeights[Arow] then

     //если высота колонки меньше

     (Sender as TStringGrid).RowHeights[Arow] := r;

end;

end;

Поскольку в компоненте StringGrid по умолчанию все столбцы имеют одинаковую ширину - в некоторых ячейках текст обрезается. Чтобы этого избежать, после заполнения StringGrid нужно для каждого столбца находить текст максимальной длины и в соответствии с его длиной устанавливать ширину всего столбца

 

Code:

{

There are two routines to implement the OnColumnClick Methods for a TStringGrid.

Set the first row as fixed and the Defaultdrawing to True.

}

 

 

type

  TForm1 = class(TForm)

    StringGrid1: TStringGrid;

    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

  private

    zelle: TRect; // cell

   acol, arow: Integer;

  public

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

var

  Text: string;

begin

  with stringgrid1 do

  begin

    MouseRoCell(x, y, acol, arow);

    if (arow = 0) and (button = mbleft) then

      case acol of

        0..2:

          begin

            // Draws a 3D Effect (Push)

           // Zeichnet 3D-Effekt (Push)

           zelle := CellRect(acol, arow);

            Text := Cells[acol, arow];

            Canvas.Font := Font;

            Canvas.Brush.Color := clBtnFace;

            Canvas.FillRect(zelle);

            Canvas.TextRect(zelle, zelle.Left + 2, zelle.Top + 2, Text);

            DrawEdge(Canvas.Handle, zelle, 10, 2 or 4 or 8);

            DrawEdge(Canvas.Handle, zelle, 2 or 4, 1);

          end;

      end;

  end;

end;

 

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

var

  Text: string;

begin

  with StringGrid1 do

  begin

    // Draws a 3D-Effect (Up)

   // Zeichnet 3D-Effekt (Up)

   Text := Cells[acol, arow];

    if arow = 0 then

    begin

      Canvas.Font := Font;

      Canvas.Brush.Color := clBtnFace;

      Canvas.FillRect(zelle);

      Canvas.TextRect(zelle, zelle.Left + 2, zelle.Top + 2, Text);

      DrawEdge(Canvas.Handle, zelle, 4, 4 or 8);

      DrawEdge(Canvas.Handle, zelle, 4, 1 or 2);

      MouseToCell(zelle.Left, zelle.Top, acol, arow);

    end;

  end;

  if (arow = 0) and (Button = mbleft) then

    case acol of

      0..2:

        begin

          // Code to be executed...

         // Programmcode der ausgefuhrt werden soll

         ShowMessage('Column ' + IntToStr(acol));

          zelle := stringgrid1.CellRect(1, 1);

        end;

    end;

end;

 

end.

 

Автор: Kurt

 Организуйте обработчик события сетки OnDrawCell. Создайте код обработчика подобный этому:

 

Code:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;

Rect: TRect; State: TGridDrawState);

var

Txt: array[0..255] of Char;

begin

StrPCopy(Txt, StringGrid1.Cells[Col, Row]);

SetTextAlign(StringGrid1.Canvas.Handle,

   GetTextAlign(StringGrid1.Canvas.Handle)

   and not (TA_LEFT or TA_CENTER) or TA_RIGHT);

ExtTextOut(StringGrid1.Canvas.Handle, Rect.Right - 2, Rect.Top + 2,

   ETO_CLIPPED or ETO_OPAQUE, @Rect, Txt, StrLen(Txt), nil);

end;

 

Ну это может выглядеть приблизительно так (возможно нужна некоторая доработка, написал от руки, не проверяя):

 

Code:

table.first;

row := 0;

grid.rowcount := table.recordCount;

while not table.eof do

begin

for i := 0 to table.fieldCount-1 do

   grid.cells[i,row] := table.fields[i].asString;

inc (row);

table.next;

end;

 


 

Ниже приведён примен кода, который позволяет автоматически подогнать размер колонки в компененте TStringGrid, под размер самой длинной строки текста в колонке:

 

Code:

procedure AutoSizeGridColumn(Grid : TStringGrid;

                             column : integer);

var

i : integer;

temp : integer;

max : integer;

begin

max := 0;

for i := 0 to (Grid.RowCount - 1) do begin

   temp := Grid.Canvas.TextWidth(grid.cells

);

   if temp > max then max := temp;

end;

Grid.ColWidths

:= Max + Grid.GridLineWidth + 3;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

AutoSizeGridColumn(StringGrid1, 1);

end;

 

 

Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids;

 

type

TForm1 = class(TForm)

   StringGrid: TStringGrid;

   procedure FormCreate(Sender: TObject);

   procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;

     Rect: TRect; State: TGridDrawState);

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

var

C, R: Integer;

begin

for C := 0 to StringGrid.ColCount - 1 do

   for R := 0 to StringGrid.RowCount - 1 do

     StringGrid.Cells[C, R] := 'A very very very long string';

end;

 

procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

begin

if not (Sender is TStringGrid) then Exit;

 

with TStringGrid(Sender) do

begin

   Canvas.FillRect(Rect);

   DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect, DT_WORDBREAK);

end;

end;

 

end.

 

Code:

procedure TForm1.GridSumaDrawCell(Sender: TObject; ACol, ARow: Longint;

ARect: TRect; State: TGridDrawState);

var

dx: integer;

begin

with (Sender as TStringGrid).Canvas do

begin

   Font := GridSuma.Font;

   Pen.Color := clBlack;

   if (ACol = 0) or (ARow = 0) then

   begin

     { Рисуем заголовок }

     Brush.Color := clBtnFace;

     FillRect(ARect);

     TextOut(ARect.Left, ARect.Top, GridSuma.Cells[ACol, ARow])

   end

   else

   begin

     { Рисуем ячейку с правым выравниванием }

     Brush.Color := clWhite;

     FillRect(ARect);

     dx := TextWidth(GridSuma.Cells[ACol, ARow]) + 2;

     TextOut(ARect.Right - dx, ARect.Top, GridSuma.Cells[ACol, ARow])

   end

end

end;

 

 

 

Автор: Дмитрий Карагеур

 

Например, у нас есть таблица с некоторыми данными, и нам необходимо какую-либо запись отредактировать/удалить и т.п. Чтобы не считать, какой это столбец или строка используем следующее: создаем popup menu, прописываем его в форме и создаем соответствующие обработчики событий - это все в файле. На самой таблице жмем правым кликом и edit и перед нами номер строки и столбца. Эти данные пригодятся для создания более интерактивного и дружественного интерфейса ваших приложений.