StringGrid行列的增加和删除
typeTExCell = class(TStringGrid)publicprocedure DeleteRow(ARow: Longint);procedure DeleteColumn(ACol: Longint);procedure InsertRow(ARow: LongInt);procedure InsertColumn(ACol: LongInt);end;procedure TExCell.InsertColumn(ACol: Integer);beginColCount :=ColCount +1;MoveColumn(ColCount-1, ACol);end;procedure TExCell.InsertRow(ARow: Integer);beginRowCount :=RowCount +1;MoveRow(RowCount-1, ARow);end;procedure TExCell.DeleteColumn(ACol: Longint);beginMoveColumn(ACol, ColCount -1);ColCount := ColCount - 1;end;procedure TExCell.DeleteRow(ARow: Longint);beginMoveRow(ARow, RowCount - 1);RowCount := RowCount - 1;end; 如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids;typeTForm1 = class(TForm)grid: TStringGrid;procedure FormCreate(Sender: TObject);procedure gridDrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState);procedure gridClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;fcheck,fnocheck:tbitmap;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);vari:SmallInt;bmp:TBitmap;beginFCheck:= TBitmap.Create;FNoCheck:= TBitmap.Create;bmp:= TBitmap.create;try bmp.handle := LoadBitmap( 0, PChar(OBM_CHECKBOXES )); With FNoCheck Do Begin width := bmp.width div 4; height := bmp.height div 3; canvas.copyrect( canvas.cliprect, bmp.canvas, canvas.cliprect ); End;With FCheck Do Begin width := bmp.width div 4; height := bmp.height div 3; canvas.copyrect(canvas.cliprect, bmp.canvas, rect( width, 0, 2*width, height ));End;finally bmp.freeend;end;procedure TForm1.gridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);beginif not (gdFixed in State) then with TStringGrid(Sender).Canvas dobegin brush.Color:=clWindow; FillRect(Rect); if Grid.Cells[ACol,ARow]='yes' then Draw( (rect.right + rect.left - FCheck.width) div 2, (rect.bottom + rect.top - FCheck.height) div 2, FCheck ) else Draw( (rect.right + rect.left - FCheck.width) div 2, (rect.bottom + rect.top - FCheck.height) div 2, FNoCheck );end;end;procedure TForm1.gridClick(Sender: TObject);beginif grid.Cells[grid.col,grid.row]='yes' then grid.Cells[grid.col,grid.row]:='no'else grid.Cells[grid.col,grid.row]:='yes';end;end. StringGrid组件Cells内容分行显示在Tstringgrid.ondrawcell事件中DrawText(StringGrid1.Canvas.Handle,pchar(StringGrid1.Cells[Acol,Arow]),Length(StringGrid1.Cells[Acol,Arow]),Rect,DT_WORDBREAK or DT_LEFT);可以实现文字换行! 在StringGrid怎样制作只读的列在 OnSelectCell事件处理程序中,加入: (所有的列均设成可修改的)if Col mod 2 = 0 then grd.Options := grd.Options + [goEditing]else grd.Options := grd.Options - [goEditing]; stringgrid从文本读入的问题(Save/Load a TStringGrid to/from a file?)stringgrid从文本读入的问题// Save a TStringGrid to a fileprocedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);varf: TextFile;i, k: Integer;beginAssignFile(f, FileName);Rewrite(f);with StringGrid dobegin // Write number of Columns/Rows Writeln(f, ColCount); Writeln(f, RowCount); // loop through cells for i := 0 to ColCount - 1 do for k := 0 to RowCount - 1 do Writeln(F, Cells[i, k]);end;CloseFile(F);end;// Load a TStringGrid from a fileprocedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);varf: TextFile;iTmp, i, k: Integer;strTemp: String;beginAssignFile(f, FileName);Reset(f);with StringGrid dobegin // Get number of columns Readln(f, iTmp); ColCount := iTmp; // Get number of rows Readln(f, iTmp); RowCount := iTmp; // loop through cells & fill in values for i := 0 to ColCount - 1 do for k := 0 to RowCount - 1 do begin Readln(f, strTemp); Cells[i, k] := strTemp; end; end;CloseFile(f);end;// Save StringGrid1 to 'c:.txt':procedure TForm1.Button1Click(Sender: TObject);beginSaveStringGrid(StringGrid1, 'c:.txt');end;// Load StringGrid1 from 'c:.txt':procedure TForm1.Button2Click(Sender: TObject);beginLoadStringGrid(StringGrid1, 'c:.txt');end;*******************************************打开一个已有的文本文件,并将内容放到stringgrid中,文本行与stringgrid行一致; 在文本中遇到空格则放入下一cells.搞定!注意,我只写了一个空格间隔的,你自己修改一下splitstring可以用多个空格分隔!procedure TForm1.Button1Click(Sender: TObject);varaa,bb:tstringlist;i:integer;beginaa:=tstringlist.Create;bb:=tstringlist.Create;aa.LoadFromFile('c:.txt');for i:=0 to aa.Count-1 dobegin bb:=SplitString(aa.Strings[i],' '); stringgrid1.Rows[i]:=bb;end;aa.Free;bb.Free;end;其中splitstring为:function SplitString(const source,ch:string):tstringlist;vartemp:string;i:integer;beginresult:=tstringlist.Create;temp:=source;i:=pos(ch,source);while i<>0 dobegin result.Add(copy(temp,0,i-1)); delete(temp,1,i); i:=pos(ch,temp);end;result.Add(temp);end;StringGrid组件Cells内容对齐在StringGrid的DrawCell事件中添加类似的代码就可以了:VARvCol, vRow : LongInt;beginvCol := ACol; vRow := ARow;WITH Sender AS TStringGrid, Canvas DO IF vCol = 2 THEN BEGIN ///对于第2列设置为右对齐 SetTextAlign(Handle, TA_RIGHT); FillRect(Rect); TextRect(Rect, Rect.RIGHT-2, Rect.Top+2, Cells[vCol, vRow]); END;end; 当我将StringGird的options属性中包含goRowSelect项时每当我选中StringGrid中一行, 则选中行用深蓝色显示,我想将深蓝色改为其他颜色应怎样该?当我将StringGird的options属性中包含goRowSelect项时每当我选中StringGrid中一行, 则选中行用深蓝色显示,我想将深蓝色改为其他颜色应怎样该?procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState);beginWith StringGrid1 dobegin If (ARow= Krow) and not (acol = 0) then begin Canvas.Brush.Color :=clYellow;// ClBlue; Canvas.FillRect(Rect); Canvas.font.color:=ClBlack; Canvas.TextOut(rect.left , rect.top, cells[acol, arow]); end;end;end;procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean);beginkrow := Arow; //*kcol := Acol;end; 注意:必须把变量KROW的值初始为1或其他不为0的值,否则如果锁定第一行的话,第一行的颜色将被自设颜色取代,而锁定行不会被重画。怎么改变StringGrid控件某一列的背景和某一列的只读属性,StringGrid控件标题栏的对齐.怎么改变StringGrid控件某一列的背景和某一列的只读属性,StringGrid控件标题栏的对齐.请参考以下代码:在OnDrawCell事件中处理背景色。程序如下://将第二列背景变为红色。procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState);beginif not((acol=1) and (arow>=stringgrid1.fixedrows)) then exit;with stringgrid1 dobegin canvas.Brush.color:=clRed; canvas.FillRect(Rect); canvas.TextOut(rect.left+2,rect.top+2,cells[acol,arow])end;end;//加入如下代码,那么StringGrid的第四列就只读了.其他列非只读procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);beginwith StringGrid1 do begin if ACol = 4 then Options := Options - [goEditing] else Options := Options + [goEditing];end;procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);vardx,dy:byte;beginif (acol = 4) and not (arow = 0) then with stringgrid1 do begin canvas.Brush.color := clYellow; canvas.FillRect(Rect); canvas.font.color := clblue; dx:=2;//调整此值,控制字在网格中显示的水平位置 dy:=2;//调整此值,控制字在网格中显示的垂直位置 canvas.TextOut(rect.left+dx , rect.top+dy , cells[acol, arow]); end;//控制标题栏的对齐if (arow = 0) then with stringgrid1 do begin canvas.Brush.color := clbtnface; canvas.FillRect(Rect); dx := 12; //调整此值,控制字在网格中显示的水平位置 dy := 5; //调整此值,控制字在网格中显示的垂直位置 canvas.TextOut(rect.left + dx, rect.top + dy, cells[acol, arow]); end;end; 在stringGrid中使用回车键模拟TAB键切换单元格的功能实现......procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);labelnexttab;beginif key=#13 thenbegin key:=#0; nexttab: if (stringgrid1.Col begin stringgrid1.Col:=stringgrid1.Col+1; end else begin if stringgrid1.Row>=stringgrid1.RowCount-1 then stringgrid1.RowCount:=stringgrid1.rowCount+1; stringgrid1.Row:=stringgrid1.Row+1; stringgrid1.Col:=0; goto nexttab; end;end;end;......... stringgrid如何清空with StringGrid1 do for I := 0 to ColCount - 1 do Cols[I].Clear; 选中某单元格,然后在该单元格中修改-> 选中某单元格,然后在该单元格中修改设置属性: StringGrid1.Options:=StringGrid1.Options+[goEditing]; 让记录在StringGrid中分页显示在Uses中加入: ADOInt //首先设定PageSize,取出PageCountprocedure TForm1.Button1Click(Sender: TObject);beginADoquery1.Recordset.PageSize :=spinedit1.Value;Edit1.Text := IntToStr(ADoquery1.Recordset.PageCount);ShowData(spinedit2.Value);end; //然后将AbsolutePage的数据乾坤大挪移到StringGrid1中 procedure TForm1.ShowData(page:integer);variRow, iCol, iCount : Integer;rs : ADOInt.Recordset;beginADoquery1.Recordset.AbsolutePage:=Page;Currpage:=page; iRow := 0;iCol := 1;stringgrid1.Cells[iCol, iRow] := 'FixedCol1';Inc(iCol);stringgrid1.Cells[iCol, iRow] := 'FixedCol2';Inc(iRow);Dec(iCol);rs := adoquery1.Recordset;for iCount := 1 to SpinEdit1.Value do begin stringgrid1.Cells[iCol, iRow] := rs.Fields.Get_Item('FieldName1').Value; Inc(iCol); stringgrid1.Cells[iCol, iRow] := rs.Fields.Get_Item('FieldName1').Value; Inc(iRow); Dec(iCol); rs.MoveNext;end; //上一页 procedure TForm1.Button2Click(Sender: TObject);beginIf (CurrPage)<>1 then ShowData(CurrPage-1);end;//下一页procedure TForm1.Button3Click(Sender: TObject);beginIf CurrPage<>ADoquery1.Recordset.PageCount then ShowData(CurrPage+1);end; 打印StringGrid的程序源码这段代码没有看懂,但是可能有的朋友需要,所以共享一下子 :)procedure TForm1.SpeedButton11Click(Sender: TObject);VarIndex_R ,ALeft: Integer;Index : Integer;beginStringGrid_File('D:\AAA.TXT');if Not LinkTextFile thenbegin ShowMessage('失败'); Exit;end;//QuickRep1.DataSet := ADOTable1;Index_R := ReSize(StringGrid1.Width);ALeft := 13;Create_Title(TitleBand1,ALeft,24,HeaderControl1.Sections.Items[0].Width,20, HeaderControl1.Sections[0].Text,taLeftJustify);with Create_QRDBText(DetailBand1,ALeft,8,StringGrid1.ColWidths[0],20, StringGrid1.Font,taLeftJustify) dobegin DataSet := ADOTable1; DataField := ADOTable1.Fields[0].DisplayName;end;ALeft := ALeft + StringGrid1.ColWidths[0] * Index_R + Index_R;For Index := 1 to ADOTable1.FieldCount - 1 dobegin Create_VLine(TitleBand1,ALeft - 13,16,1,40); Create_Title(TitleBand1,ALeft,24,HeaderControl1.Sections.Items[Index].Width,20, HeaderControl1.Sections[Index].Text,taLeftJustify); Create_VLine(DetailBand1,ALeft - 13,-1,1,31); with Create_QRDBText(DetailBand1,ALeft ,8,StringGrid1.ColWidths[Index] * Index_R,20, StringGrid1.Font,taLeftJustify) do begin DataSet := ADOTable1; DataField := ADOTable1.Fields[Index].DisplayName; end; ALeft := ALeft + StringGrid1.ColWidths[Index] * Index_R + Index_R;end;QuickRep1.Preview;end;function TForm1.ReSize(AGridWidth: Integer): Integer;beginResult := Trunc(718 / AGridWidth);end;function TForm1.StringGrid_File(AFileName: String): Boolean;varStrValue : String;Index : Integer;ACol , ARow : Integer;AFileValue : System.TextFile;beginStrValue := '';Try AssignFile(AFileValue , AFileName); ReWrite(AFileValue); StrValue := HeaderControl1.Sections[0].Text; For Index := 1 to HeaderControl1.Sections.Count - 1 do StrValue := StrValue + ',' + HeaderControl1.Sections[Index].Text; Writeln(AFileValue,StrValue); StrValue := ''; For ARow := 0 To StringGrid1.RowCount - 1 do begin StrValue := ''; StrValue := StringGrid1.Cells[0,ARow]; For ACol := 1 To StringGrid1.ColCount - 1 do begin StrValue := StrValue + ', ' + StringGrid1.Cells[ACol,ARow]; end; Writeln(AFileValue,StrValue); end;Finally CloseFile(AFileValue);end;end;function TForm1.LinkTextfile: Boolean;beginResult := False;with ADOTable1 dobegin {ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source= D:\;Extended Properties=Text;' + 'Persist Security Info=False'; TableName := 'AAA#TXT'; Open; } if Active then Result := True;end;end;function TForm1.Create_QRDBText(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; AFont: TFont; AAlignMent: TAlignment): TQRDBText;varAQRDBText : TQRDBText;beginAQRDBText := TQRDBText.Create(Nil);with AQRDBText dobegin Parent := Sender; Left := ALeft; Top := ATop; Width := AWidth; Height := AHight; AlignMent := AAlignMent; Font.Assign(AFont);end;Result := AQRDBText;end;function TForm1.Create_VLine(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer): TQRShape;varAQRShapeV : TQRShape;beginAQRShapeV := TQRShape.Create(Nil);with AQRShapeV dobegin Parent := Sender; Left := ALeft; Top := ATop; Width := AWidth; Height := AHight;end;Result := AQRShapeV;end;procedure TForm1.Create_Title(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; ACaption: String; AAlignMent: TAlignment);varAQRLabel : TQRLabel;beginAQRLabel := TQRLabel.Create(Nil);with AQRLabel dobegin Parent := Sender; Left := ALeft; Top := ATop; Width := AWidth; AlignMent := AAlignMent; Caption := ACaption;end;end;
?