StringGrid
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;
|
- Подробности
- Родительская категория: StringGrid
- Категория: Перемещение строк, столбцов и ячеек
Можно ли сделать так чтобы 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 end;
procedure TForm1.Button1Click(Sender: TObject); begin AutoSizeGridColumn(StringGrid1, 1); end; |
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
Автор: Пётр Соболь
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 по умолчанию все столбцы имеют одинаковую ширину - в некоторых ячейках текст обрезается. Чтобы этого избежать, после заполнения 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. |
- Подробности
- Родительская категория: StringGrid
- Категория: Разные вопросы StringGrid
Автор: 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; |
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
Ну это может выглядеть приблизительно так (возможно нужна некоторая доработка, написал от руки, не проверяя):
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; |
- Подробности
- Родительская категория: StringGrid
- Категория: Разные вопросы StringGrid
Ниже приведён примен кода, который позволяет автоматически подогнать размер колонки в компененте 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 end;
procedure TForm1.Button1Click(Sender: TObject); begin AutoSizeGridColumn(StringGrid1, 1); end; |
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
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. |
- Подробности
- Родительская категория: StringGrid
- Категория: Разные вопросы StringGrid
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;
|
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
Автор: Дмитрий Карагеур
Например, у нас есть таблица с некоторыми данными, и нам необходимо какую-либо запись отредактировать/удалить и т.п. Чтобы не считать, какой это столбец или строка используем следующее: создаем popup menu, прописываем его в форме и создаем соответствующие обработчики событий - это все в файле. На самой таблице жмем правым кликом и edit и перед нами номер строки и столбца. Эти данные пригодятся для создания более интерактивного и дружественного интерфейса ваших приложений.
- Подробности
- Родительская категория: StringGrid
- Категория: Разные вопросы StringGrid
Страница 2 из 6