unit TntVawrgrid; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, Grids, TntStdCtrls, TntGrids; type TVAWrapGrid = class(TntStringGrid) private { Private declarations } fHiddenCols: string; fHiddenColMap: string[255]; procedure SetHiddenCols(Value:string); protected { Protected declarations } { This DrawCell procedure wraps text in the grid cell } procedure DrawCell(Col, Row : Longint; Rect : TRect; State : TGridDrawState); override ; public constructor Create(AOwner : TComponent); override ; published { Published declarations } property HiddenCols: string read fHiddenCols write SetHiddenCols; end; procedure Register; implementation constructor TVAWrapGrid.Create(AOwner : TComponent); begin { Create a TStringGrid } inherited Create(AOwner); HiddenCols:=''; {change to bit map someday} fHiddenColMap:=''; end; procedure TVAWrapGrid.SetHiddenCols(value:string); var v,old:string; j:integer; procedure SetCol(val:string); var i:integer; begin i:=strtoint(val) + 1; {offset for 1 based string index} if (i in [1..255]) then fHiddenColMap[i]:='1'; end; begin old:=fHiddenColMap; {save oldmap image} fHiddenCols:=Value; fHiddenColMap:=''; {reset the map} for j:=1 to 255 do fHiddenColMap:=fHiddenColMap + '0'; while pos(',',value)>0 do begin v:=copy(value,1,pos(',',value)-1); SetCol(v); Delete(value,1,pos(',',value)); end; if value <> '' then begin SetCol(value); {get the last piece} if not (csDesigning in componentstate) then invalidate; end; if old='' then exit; if (old <> fHiddenColMap) and (not (csDesigning in componentState)) then begin j:=pos('1',old); while j > 0 do begin if fHiddenColMap[j]='0' then if pred(j) < colcount then colwidths[pred(j)]:=defaultcolwidth; old[j]:='0'; {get rid of hit} j:=pos('1',old); end; end; end; { This DrawCell procedure wraps text in the grid cell } procedure TVAWrapGrid.DrawCell(Col,Row: Longint; Rect: TRect; State: TGridDrawState); var i, MaxRowHeight, CurrRowHeight, hgt, CellLen :integer; CellValue :PChar; begin {don't display hidden cols} if RowHeights[Row] = 0 then exit; if (fHiddenColMap[succ(col)] = '1') and (not (csDesigning in componentstate)) then {disappear the column} begin if colwidths[col] > 0 then colwidths[col] := 0; exit; end; with Canvas do {not a hidden col} begin if colwidths[col]=0 then ColWidths[col] := defaultcolwidth; { Initialize the font to be the control's font } Canvas.Font := Font; Canvas.Font.Color := Font.Color; {If this is a fixed cell, then use the fixed color } if gdFixed in State then begin Pen.Color := FixedColor; Brush.Color := FixedColor; font.color := self.font.color; end {if highlighted cell} else if (gdSelected in State) and (not (gdFocused in State) or ([goDrawFocusSelected, goRowSelect] * Options <> [])) then begin Brush.Color := clHighlight; Font.Color := clHighlightText; end {else, use the normal color } else begin Pen.Color := Color; Brush.Color := Color; font.color := self.font.color; end; {Prepaint cell in cell color } FillRect(rect); end; CellValue := PChar(cells[col,row]); CellLen := strlen(CellValue); {get cell size} Drawtext(canvas.handle,CellValue,CellLen,rect,DT_LEFT or DT_WORdbreak or DT_CALCRECT or DT_NOPREFIX); {Draw text in cell} Drawtext(canvas.handle,CellValue,CellLen,rect,DT_LEFT or DT_WORdbreak or DT_NOPREFIX); {adjust row heights up OR DOWN} MaxRowHeight := DefaultRowHeight; CurrRowHeight := RowHeights[row]; for i := pred(colcount) downto 0 do begin if (not (gdFixed in state)) then begin rect := cellrect(i,row); hgt := Drawtext(canvas.handle,PChar(cells[i,row]),length(cells[i,row]),rect,DT_LEFT or DT_WORdbreak or DT_CALCRECT or DT_NOPREFIX); if hgt > MaxRowHeight then MaxRowHeight := hgt; end; end; if MaxRowHeight <> CurrRowHeight then rowheights[row] := MaxRowHeight; end; procedure Register; begin { You can change Samples to whichever part of the Component Palette you want to install this component to } RegisterComponents('TntCPRS', [TntVAWrapGrid]); end; end.