{"id":586,"date":"2011-06-02T16:16:11","date_gmt":"2011-06-02T08:16:11","guid":{"rendered":"http:\/\/blog.infinity.idv.tw\/index.php\/2011\/06\/02\/delphi-cxgrid%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/"},"modified":"2011-06-02T16:16:11","modified_gmt":"2011-06-02T08:16:11","slug":"delphi-cxgrid%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"http:\/\/blog.infinity.idv.tw\/?p=586","title":{"rendered":"[DELPHI] cxGrid\u7684\u4f7f\u7528\u65b9\u6cd5"},"content":{"rendered":"<p><b>\u670b\u53cb\u8cbc\u7d66\u6211\u7684\uff0c\u53ea\u77e5\u9053\u662f\u5927\u9678\u7db2\u7ad9\u4e0a\u5206\u4eab\u7684\u8cc7\u6599\uff0c\u53ef\u5728cxGrid\u5167\u4f7f\u7528CheckBox\u5594!!!\u53ea\u662f\u7528\u4e86\u4e4b\u5f8c\u4ee5\u524d\u53ef\u4f7f\u7528 Shift \u9078\u5340\u6bb5\u7684\u529f\u80fd\u4f3c\u4e4e\u4e0d\u80fd\u7528\u4e86\u3002<\/b><\/p>\n<p><strong>======================================================================<\/strong><\/p>\n<p><b>cxGrid<\/b><b>\u7684\u4f7f\u7528\u65b9\u6cd5<\/b><b><\/b><\/p>\n<p>cxGrid\u529f\u80fd\u5f37\u5927\uff0c\u9069\u5408\u505a\u4f01\u696d\u7d1a\u7684\u8907\u96dc\u67e5\u8a62\u3002\u975e\u5e38\u65b9\u4fbf\u3002<\/p>\n<p>\u4f46\u662f\u5c0d\u5176\u7528\u6cd5\u4ecb\u7d39\u7684\u4e26\u4e0d\u591a\uff0c\u5728\u6b64\u7e3d\u7d50\u4ed6\u4eba\u7684\u4f7f\u7528\u7d93\u9a57\u548c\u81ea\u5df1\u7684\u4e00\u9ede\u5c0f\u7d93\u9a57\uff0c\u4f9b\u5927\u5bb6\u53c3\u8003\u3002<\/p>\n<h5>\uff08\uff11\uff09\u52d5\u614b\u8a2d\u7f6e\u986f\u793a\u683c\u5f0f<\/h5>\n<blockquote>\n<p>procedure SetDisplayFormat(ACtrlData: TClientDataSet;<\/p>\n<p>&#160; TbView: TcxGridDBTableView);<\/p>\n<p>var<\/p>\n<p>&#160; i: integer;<\/p>\n<p>begin<\/p>\n<p>&#160; if ACtrlData.RecordCount &lt;= 0 then Exit;<\/p>\n<p>&#160; try<\/p>\n<p>&#160;&#160;&#160; TbView.ClearItems;<\/p>\n<p>&#160;&#160;&#160; ACtrlData.First;<\/p>\n<p>&#160;&#160;&#160; for i := 0 to ACtrlData.RecordCount &#8211; 1 do<\/p>\n<p>&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if ACtrlData.FieldByName(&#8216;SQBF_DisplayInGrid&#8217;).AsString = &#8216;1&#8217; then \/\/\u5728\u8868\u683c\u4e2d\u986f\u793a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with TbView.CreateColumn do<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; DataBinding.FieldName := ACtrlData.FieldByName(&#8216;SQBF_FieldName&#8217;).AsString;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Caption := ACtrlData.FieldByName(&#8216;SQBF_Caption&#8217;).AsString; \/\/\u6b04\u4f4d\u4e2d\u6587\u6a19\u984c<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Hint := ACtrlData.FieldByName(&#8216;SQBF_Hint&#8217;).AsString;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Width := ACtrlData.FieldByName(&#8216;SQBF_Width&#8217;).AsInteger;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; HeaderAlignmentHorz := taCenter;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ACtrlData.Next;<\/p>\n<p>&#160;&#160;&#160; end;<\/p>\n<p>&#160; except<\/p>\n<p>&#160;&#160;&#160; on E: Exception do<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; SaveLog(&#8216;\u8a2d\u7f6e\u986f\u793a\u683c\u5f0f\u6642\u51fa\u932f\uff1a&#8217; + E.Message);<\/p>\n<p>&#160; end;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<h5>\uff08\uff12\uff09\u986f\u793a\u884c\u865f<\/h5>\n<blockquote>\n<p>procedure TFmQueryBase.cxDBViewMasterCustomDrawIndicatorCell(<\/p>\n<p>&#160; Sender: TcxGridTableView; ACanvas: TcxCanvas;<\/p>\n<p>&#160; AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);<\/p>\n<p>var<\/p>\n<p>&#160; FValue: string;<\/p>\n<p>&#160; FBounds: TRect;<\/p>\n<p>begin<\/p>\n<p>&#160; FBounds := AViewInfo.Bounds;<\/p>\n<p>&#160; if (AViewInfo is TcxGridIndicatorRowItemViewInfo) then<\/p>\n<p>&#160; begin<\/p>\n<p>&#160;&#160;&#160; ACanvas.FillRect(FBounds);<\/p>\n<p>&#160;&#160;&#160; ACanvas.DrawComplexFrame(FBounds, clBlack, clBlack, [bBottom, bLeft, bRight], 1);<\/p>\n<p>&#160;&#160;&#160; FValue := IntToStr(TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Index+1);<\/p>\n<p>&#160;&#160;&#160; InflateRect(FBounds, -3, -2); \/\/Platform specific. May not work on Linux.<\/p>\n<p>&#160;&#160;&#160; ACanvas.Font.Color := clBlack;<\/p>\n<p>&#160;&#160;&#160; ACanvas.Brush.Style := bsClear;<\/p>\n<p>&#160;&#160;&#160; ACanvas.DrawText(FValue, FBounds, cxAlignCenter or cxAlignTop);<\/p>\n<p>&#160;&#160;&#160; ADone := True;<\/p>\n<p>&#160; end;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<h5>\uff08\uff13\uff09\u8a2d\u7f6e\u986f\u793a\u683c\u5f0f\uff0c\u6211\u7684\u5c08\u6848\u8981\u6c42\u5148\u52d5\u614b\u6dfb\u52a0\u6b04\u4f4d\uff0c\u9019\u6642\u4e0d\u77e5\u9053\u6b04\u4f4d\u985e\u578b\uff0c\u6240\u4ee5\u8a2d\u7f6eDisplayFormat\u4e0d\u65b9\u4fbf\uff0c\u6211\u9084\u6c92\u6709\u627e\u5230\u597d\u65b9\u6cd5\u3002<\/h5>\n<p>\u6240\u4ee5\u63a1\u7528\u6253\u958b\u8cc7\u6599\u96c6\u5f8c\u518d\u8a2d\u7f6e\uff1a<\/p>\n<blockquote>\n<p>procedure TFmQueryBase.cdsMasterAfterOpen(DataSet: TDataSet);<\/p>\n<p>var<\/p>\n<p>&#160; i: Integer;<\/p>\n<p>begin<\/p>\n<p>&#160; for i := 0 to cxDBViewMaster.DataController.DataSet.FieldCount -1 do<\/p>\n<p>&#160; begin<\/p>\n<p>&#160;&#160;&#160; if cxDBViewMaster.DataController.DataSet.Fields[i] is TNumericField then<\/p>\n<p>&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if Pos(&#8216;AMOUNT&#8217;, UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) &gt; 0 then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := &#8216;#,##0.000&#8217;;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Continue;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if Pos(&#8216;QUANTITY&#8217;, UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) &gt; 0 then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := &#8216;#,##0.000&#8217;;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Continue;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; if Pos(&#8216;MONEY&#8217;, UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) &gt; 0 then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := &#8216;#,##0.00&#8217;;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Continue;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160; end;<\/p>\n<p>&#160; end;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>\u6700\u8fd1\u5728\u5b78\u7fd2\u4f7f\u7528cxGrid,\u5b89\u88dd\u7684\u7248\u672c\u662fExpressQuantumGrid&#160;&#160; Suite&#160;&#160; v5.10&#160; <\/p>\n<p>\u6211\u767c\u73fe\u9019\u500b\u63a7\u5236\u9805\u529f\u80fd\u96d6\u7136\u5f37\u5927,\u4f46\u662f\u975e\u5e38\u96e3\u7528\u3002<\/p>\n<p>\u73fe\u5728\u6211\u624b\u982d\u5c31\u6709\u5e7e\u500b\u554f\u984c\u9084\u6c92\u89e3\u6c7a\uff1a<\/p>\n<p>&#160; 1\uff09\u4e3b\u5f9e\u6a21\u5f0f\u4e0b\u5c0e\u51faExcel\u4e2d\u6587\u6703\u7522\u751f\u4e82\u78bc\uff0c\u800c\u4e14\u5f9e\u8868\u5167\u5bb9\u6c92\u6709\u5c0e\u51fa\u3002<\/p>\n<p>\u6211\u4e0d\u77e5\u9053\u662f\u4e0d\u662f\u56e0\u70ba\u6211\u7684\u6b04\u4f4d\u540d\u5305\u62ec\u55ae\u5f15\u865f\u7684\u539f\u56e0\u3002<\/p>\n<p>\u5c0e\u51fa\u4ee3\u78bc\uff1aExportGrid4ToExcel(FileName,&#160;&#160; cxGrid);&#160; <\/p>\n<p>&#160; 2\uff09\u4e3b\u5f9e\u6a21\u5f0f\u4e0b\u901a\u904e\u6309\u9215\u5c0d\u5f9e\u8868\u6dfb\u52a0\/\u522a\u9664\u884c\uff0c\u4ee3\u78bc\u600e\u4e48\u5beb\u3002<\/p>\n<h5>\u9644\uff1a\u55ae\u8868\u6dfb\u52a0\/\u522a\u9664\u884c\u7684\u4ee3\u78bc<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; TFormAccount.cxButtonNewClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.tvAccount.DataController.Append;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.tvAccount.Columns[0].Focused&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; cxGrid.SetFocus;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormAccount.cxButtonDeleteClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; Self.tvAccount.DataController.RowCount&#160;&#160; =&#160;&#160; 0&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; Application.MessageBox(&#8216;\u78ba\u8a8d\u522a\u9664\u7576\u524d\u8a18\u9304?&#8217;,&#160;&#160; &#8216;\u78ba\u8a8d\u522a\u9664&#8217;,&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MB_YesNo&#160;&#160; +&#160;&#160; MB_IconQuestion)&#160;&#160; =&#160;&#160; IDNO&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.tvAccount.DataController.DeleteFocused;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; 3\uff09\u52d5\u614b\u5275\u5efa\u4e3b\u5f9e\u7d50\u69cb\u51fa\u932f\uff08Compiler\u6c92\u932f\uff0c\u904b\u884c\u6642\u51fa\u73fe\u7cfb\u7d71\u932f\u8aa40000000018\uff09\uff0c<\/p>\n<p>\u6211\u4f7f\u7528\u4e86\u4e8c\u500bADOStoreProcedure\u4f5c\u4e3b\u5f9e\u8868<\/p>\n<p>\u4ee3\u78bc\u5982\u4e0b\uff1a<\/p>\n<blockquote>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Level:&#160;&#160; TcxGridLevel;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView:&#160;&#160; TcxGridDBTableView;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Level&#160;&#160; :=&#160;&#160; cxGrid1.Levels[0].Add;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView&#160;&#160; :=&#160;&#160; TcxGridDBTableView(cxGrid1.CreateView(TcxGridDBTableView));&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.DataSource&#160;&#160; :=&#160;&#160; Self.dsDetail;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.KeyFieldNames&#160;&#160; :=&#160;&#160; &#8216;PurchOrderID;POLineNbr;PromiseDate;ReceiverDate&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.MasterKeyFieldNames&#160;&#160; :=&#160;&#160; &#8216;VendorID&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.DetailKeyFieldNames&#160;&#160; :=&#160;&#160; &#8216;VendorID&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.DataModeController.SmartRefresh&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.OptionsCustomize.ColumnHiding&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.OptionsCustomize.ColumnsQuickCustomization&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.OptionsData.Deleting&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.OptionsData.Inserting&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.OptionsView.Indicator&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Level.GridView&#160;&#160; :=&#160;&#160; GridView;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView&#160;&#160; :=&#160;&#160; TcxGridDBTableView(cxGrid1.Levels[0].GridView);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.KeyFieldNames&#160;&#160; :=&#160;&#160; &#8216;VendorID&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.OptionsView.GroupByBox&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u986f\u793a\u4e3b\u8868\u5167\u5bb9<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; tvResult.BeginUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; tvResult.ClearItems;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; tvResult.DataController.CreateAllItems;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; tvResult.EndUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u986f\u793a\u660e\u7d30\u8868\u5167\u5bb9<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView&#160;&#160; :=&#160;&#160; TcxGridDBTableView(cxGrid1.Levels[0].Items[0].GridView);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.BeginUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.ClearItems;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.CreateAllItems;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.DataController.Refresh;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; GridView.EndUpdate;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u5c0f\u6280\u5de7:\u7528\u4ee3\u78bc\u5c55\u958b\/\u6536\u7e2e\u4e3b\u5f9e\u7d50\u69cb<\/p>\n<p>&#160; Self.tvDepartment.ViewData.Expand(True);&#160; <\/p>\n<p>&#160; Self.tvDepartment.ViewData.Collaspe(True);&#160; <\/p>\n<p>\u6ce8:tvDepartment\u70ba\u4e3b\u8868\u5c0d\u61c9\u7684TableView<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u4f60\u8aaa\u7684\u9019\u5e7e\u500b\u554f\u984c\u6211\u4e5f\u9047\u5230\u904e\u3002<\/p>\n<p>\u7b2c\u4e00\u500b\u554f\u984c\u662f\u7de8\u78bc\u7684\u554f\u984c\uff0c\u4fee\u6539\u4e86\u5176\u4e2d\u95dc\u65bc\u7de8\u78bc\u7684\u51fd\u6578\uff0cOK.&#160; <\/p>\n<p>\u7b2c\u4e8c\u500b\u554f\u984c\u5728cxGrid\u7684\u793e\u5340\u53ef\u4ee5\u627e\u5230\u89e3\u7b54\uff0c\u4f46\u5f9e\u8868\u5fc5\u9808\u6eff\u8db3\u67d0\u7a2e\u689d\u4ef6\uff0c\u4f8b\u5982\u95dc\u9375\u5b57\u6392\u5e8f\u3002<\/p>\n<p>\u7b2c\u4e09\u500b\u554f\u984c\u7684\u89e3\u6c7a\u8fa6\u6cd5\uff0c\u4f60\u53ef\u4ee5\u5617\u8a66\u5728\u52d5\u614b\u5275\u5efa\u7684\u4ee3\u78bc\u524d\u5f8c\u52a0\u4e0a\uff1a<\/p>\n<p>&#160; grid.beginupdate;&#160; <\/p>\n<p>&#160; &#8230;&#160; <\/p>\n<p>&#160; grid.endupdate&#160; <\/p>\n<p>\u4f86\u89e3\u6c7a\u3002<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u6c92\u7528\u904e<\/p>\n<p>\u4e0d\u8981\u7d93\u5e38\u4f7f\u7528\u4e09\u65b9\u63a7\u5236\u9805<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>to&#160;&#160; tttk(\u7db2\u8def\u829d\u9ebb)\uff1a<\/p>\n<p>\u7b2c\u4e00\u500b\u554f\u984c\uff1a\u5982\u4f55\u4fee\u6539\u554a\uff0c\u8cbc\u51fa\u4ee3\u78bc<\/p>\n<p>\u7b2c\u4e8c\u500b\u554f\u984c\uff1a\u6c92\u641c\u5230\u554a<\/p>\n<p>\u7b2c\u4e09\u500b\u554f\u984c\uff1a\u8a66\u4e00\u4e0b\u518d\u8aaa<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u4e0d\u8981\u7d93\u5e38\u4f7f\u7528\u4e09\u65b9\u63a7\u5236\u9805<\/p>\n<p>&#160; ======================&#160; <\/p>\n<p>\u6211\u611f\u89ba\u4e0d\u7528cxGrid\u7684\u8a71\uff0c\u6c92\u5fc5\u8981\u7528Delphi\u4e86\uff0c\u5475\u5475<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u6a13\u4e0a\u9019\u8a71\u662f\u4e0d\u662f\u6709\u9ede\u554f\u984c?DELPHI\u80fd\u505a\u5f97\u4e8b\u60c5\u5f88\u591a\u5f88\u591a,\u96e3\u9053\u975e\u8981\u7528CXGRID?CXGRID\u4e0d\u662f\u7528DELPHI\u505a\u51fa\u4f86\u5f97?<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u6c92\u7528\u904e&#8230;..<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u56de\u5fa9\u4eba\uff1a&#160;&#160; zxkid(\u6c92\u6709\u4eba\u6703\u50cf\u6211\u9019\u6a23&#8230;)&#160;&#160; (&#160;&#160; )&#160;&#160; \u4fe1\u8b7d\uff1a101&#160;&#160;&#160;&#160; 2006-01-06&#160;&#160; 16:58:00&#160;&#160;&#160;&#160; \u5f97\u5206:&#160;&#160; 0&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>\u4e0d\u8981\u7d93\u5e38\u4f7f\u7528\u4e09\u65b9\u63a7\u5236\u9805<\/p>\n<p>&#160; ======================&#160; <\/p>\n<p>\u6211\u611f\u89ba\u4e0d\u7528cxGrid\u7684\u8a71\uff0c\u6c92\u5fc5\u8981\u7528Delphi\u4e86\uff0c\u5475\u5475<\/p>\n<p>&#160; **********&#160; <\/p>\n<p>\u6a13\u4e3b\u4e43\u5929\u4eba\u4e5f\uff01\uff01<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u5475\u5475<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>cxGrid\u6bd4\u8f03\u4e0d\u932f,\u6211\u4e5f\u4f7f\u7528\u904e\u5c0e\u51fa\u5230Excel,\u6c92\u6709\u9047\u5230\u4f60\u8aaa\u7684\u4e82\u78bc<\/p>\n<p>\u4e3b\u5f9e\u8868\u4e5f\u6c92\u6709\u554f\u984c\u7684\uff0c\u5176\u5be6\u8ddf\u55ae\u8868\u64cd\u4f5c\u9084\u4e0d\u662f\u4e00\u56de\u4e8b<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>up<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u6c92\u7528\u904ecxGrid\uff0c\u4ee5\u5f8c\u8003\u616e<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u6a13\u4e3b\u4e43\u5929\u4eba\u4e5f\uff01\uff01<\/p>\n<p>&#160; =============================&#160; <\/p>\n<p>&#160; Delphi\u4e0b\u6709cxGrid,&#160;&#160; .NET\u4e0b\u6709XtraGrid,&#160;&#160; \u5b83\u5011\u90fd\u662f\u540c\u4e00\u516c\u53f8\u51fa\u7684\u3002<\/p>\n<p>\u9072\u65e9\u90fd\u6703\u8f49\u5230.NET\uff0c\u6240\u4ee5\u3002\u3002\u3002<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u8def\u904e<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u7528\u904e\uff0c\u633a\u597d\uff0c\u53ea\u6703\u4f7f\u7528\u6700\u7c21\u55ae\u7684\u3002<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u767c\u4e00\u500b\u90f5\u4ef6\u7d66\u6211\uff0c\u6211\u628a\u89e3\u6c7a\u4e82\u78bc\u5f8c\u7684\u6e90\u4ee3\u78bc\u767c\u4e00\u5206\u7d66\u4f60\uff0c\u653e\u5230\u4f60\u7684\u5c08\u6848\u6a94\u593e\u4e0b\u5373\u53ef\u3002<\/p>\n<p>&#160; tttk2000@hotmail.com<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u7b2c\u4e8c\u500b\u554f\u984c\uff1ahttps:\/\/www.devexpress.com\/Support\/Center\/default.aspx?view=ViewIssue&amp;issueid=B2691<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u8b1d\u8b1dtttk(\u7db2\u8def\u829d\u9ebb)&#160;&#160;&#160; <\/p>\n<p>\u7b2c\u4e8c\u500b\u554f\u984c\uff1a\u6211\u73fe\u5728\u76f4\u63a5\u8b93\u7528\u6236\u7528\u5c0e\u822a\u689d\u7684\u522a\u9664\/\u6dfb\u52a0\u6309\u9215\u4e86\u3002\u6839\u64da\u4f60\u7d66\u7684\u7db2\u5740\u4e0a\u7684\u5167\u5bb9\u6211\u77e5\u9053\u5927\u6982\u8a72\u600e\u4e48\u5beb\u4e86\uff0c\u6709\u7a7a\u518d\u8a66\u8a66\u3002<\/p>\n<p>\u7b2c\u4e00\u500b\u554f\u984c\uff1a\u4e0d\u5149\u662f\u4e82\u78bc\u554f\u984c\uff0c\u9084\u6709\u5f9e\u8868\u5167\u5bb9\u6c92\u5c0e\u51fa\u7684\u554f\u984c\u3002<\/p>\n<p>\u53ea\u6709\u4e00\u500b\u8868\u7684\u8a71\u662f\u4e0d\u6703\u51fa\u73fe\u4e82\u78bc\u7684\u3002<\/p>\n<p>\u7b2c\u4e09\u500b\u554f\u984c\uff1a\u9084\u6c92\u4f86\u5f97\u53ca\u8a66\u3002<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u7b2c\u4e00\u500b\u554f\u984c\uff1a\u770b\u4e86\u4e00\u4e0b\u5e6b\u52a9\uff0c\u539f\u4f86cxGrid\u4e0d\u652f\u6301\u4e3b\u5f9e\u8868\u7684\u5c0e\u51fa\uff0c\u53ea\u80fd\u5c0e\u51fa\u4e3b\u8868\uff08\u9802\u5c64\u8868\uff09\u7684\u5167\u5bb9\u3002\u6688<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u8cbc\u4e00\u4e9b\u5c0f\u6280\u5de7,\u5e0c\u671b\u8207\u5404\u4f4d\u4f7f\u7528cxGrid\u7684\u670b\u53cb\u5171\u540c\u4ea4\u6d41<\/p>\n<p>\u5404\u4f4d\u6709\u4ec0\u4e48\u597d\u500b\u6280\u5de7\u4e5f\u53ef\u4ee5\u8cbc\u51fa\u4f86:&#160; <\/p>\n<h5>\u6280\u5de7\u4e8c\uff1a\u5728\u5167\u7f6e\u53f3\u9375\u529f\u80fd\u8868\u7684\u5f8c\u9762\u589e\u52a0\u529f\u80fd\u8868\u9805<\/h5>\n<p>\u9996\u5148\u61c9\u5728Form\u4e0a\u52a0\u4e00\u500bcxGridPopupMenu\u63a7\u5236\u9805 \u4ee5\u555f\u7528\u53f3\u9375\u529f\u80fd\u8868<\/p>\n<blockquote>\n<p>&#160; UseBuildInPopupMenus\u8a2d\u70baTrue&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.FormCreate(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AMenu:&#160;&#160; TComponent;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; FMenuItem,&#160;&#160; FSubMenuItem:&#160;&#160; TMenuItem;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AMenu&#160;&#160; :=&#160;&#160; nil;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; cxGridPopupMenu.BuiltInPopupMenus.Count&#160;&#160; =&#160;&#160; 0&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AMenu&#160;&#160; :=&#160;&#160; cxGridPopupMenu.BuiltInPopupMenus[0].PopupMenu; \/\/\u7b2c\u4e00\u500b\u5167\u7f6e\u53f3\u9375\u529f\u80fd\u8868(\u8868\u982d\u529f\u80fd\u8868)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; Assigned(AMenu)&#160;&#160; and&#160;&#160; AMenu.InheritsFrom(TPopupMenu)&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).AutoHotkeys&#160;&#160; :=&#160;&#160; maManual;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u624b\u52d5\u71b1\u9375<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;-&#8216;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miLineForGroup&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u5c55\u958b\u6240\u6709\u7d44<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miExpandAllGroup&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u5c55\u958b\u6240\u6709\u7d44(&amp;X)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.OnClick&#160;&#160; :=&#160;&#160; miExpandAllGroupClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u6536\u7e2e\u6240\u6709\u7d44<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miCollapseAllGroup&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u6536\u7e2e\u6240\u6709\u7d44(&amp;O)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.OnClick&#160;&#160; :=&#160;&#160; miCollapseAllGroupClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;-&#8216;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u904e\u6ffe\u9762\u677f<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miFilterPanel&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u904e\u6ffe\u9762\u677f(&amp;P)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u81ea\u52d5\u986f\u793a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miFilterPanelAuto&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u81ea\u52d5(&amp;A)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.RadioItem&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.GroupIndex&#160;&#160; :=&#160;&#160; 5; \/\/\u6307\u5b9a\u540c\u4e00\u7d44<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.Checked&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.OnClick&#160;&#160; :=&#160;&#160; miFilterPanelClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Add(FSubMenuItem); \/\/\u52a0\u5165\u4e8c\u7d1a\u5b50\u529f\u80fd\u8868<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u7e3d\u662f\u986f\u793a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miFilterPanelAlways&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u7e3d\u662f\u986f\u793a(&amp;W)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.RadioItem&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.GroupIndex&#160;&#160; :=&#160;&#160; 5;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.OnClick&#160;&#160; :=&#160;&#160; miFilterPanelClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Add(FSubMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u5f9e\u4e0d\u986f\u793a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miFilterPanelNerver&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u5f9e\u4e0d\u986f\u793a(&amp;N)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.RadioItem&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.GroupIndex&#160;&#160; :=&#160;&#160; 5;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FSubMenuItem.OnClick&#160;&#160; :=&#160;&#160; miFilterPanelClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Add(FSubMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u81ea\u5b9a\u7fa9\u904e\u6ffe<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miCustomFilter&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u81ea\u5b9a\u7fa9\u904e\u6ffe(&amp;M)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.OnClick&#160;&#160; :=&#160;&#160; miCustomFilterClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u904e\u6ffe\u7ba1\u7406\u5668<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miFilterBuilder&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,&#160;&#160; 44); \/\/\u6dfb\u52a0\u5716\u793a\u5716\u50cf<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.ImageIndex&#160;&#160; :=&#160;&#160; TPopupMenu(AMenu).Images.Count&#160;&#160; -&#160;&#160; 1; \/\/\u6307\u5b9a\u5716\u793a\u5e8f\u865f<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u904e\u6ffe\u7ba1\u7406\u5668&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.OnClick&#160;&#160; :=&#160;&#160; Self.miFilterBuilderClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;-&#8216;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u5c0e\u51fa<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miExport&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,&#160;&#160; 37);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.ImageIndex&#160;&#160; :=&#160;&#160; TPopupMenu(AMenu).Images.Count&#160;&#160; -&#160;&#160; 1;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u5c0e\u51fa(&amp;E)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.OnClick&#160;&#160; :=&#160;&#160; Self.miExportClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u5217\u5370<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem&#160;&#160; :=&#160;&#160; TMenuItem.Create(Self);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Name&#160;&#160; :=&#160;&#160; &#8216;miPrint&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.Caption&#160;&#160; :=&#160;&#160; &#8216;\u5217\u5370(&amp;P)&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,&#160;&#160; 14);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.ImageIndex&#160;&#160; :=&#160;&#160; TPopupMenu(AMenu).Images.Count&#160;&#160; -&#160;&#160; 1;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FMenuItem.OnClick&#160;&#160; :=&#160;&#160; Self.miPrintClick;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TPopupMenu(AMenu).Items.Add(FMenuItem);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.miExportClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; FileName,&#160;&#160; FileExt,&#160;&#160; msg:&#160;&#160; String;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; Self.aqyQuery.IsEmpty&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; msg&#160;&#160; :=&#160;&#160; &#8216;\u6c92\u6709\u5c0e\u51fa\u8cc7\u6599&#8230;&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Application.MessageBox(PChar(msg),&#160;&#160; PChar(Application.Title),&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MB_OK&#160;&#160; or&#160;&#160; MB_IconWarning);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.SaveDialogExport.Filter&#160;&#160; :=&#160;&#160; &#8216;Excel\u6587\u4ef6&#160;&#160; (*.xls)|*.xls|XML\u6587\u4ef6&#160;&#160; (*.xml)|*.xml&#8217;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; +&#160;&#160; &#8216;|\u6587\u5b57\u6a94\u6848&#160;&#160; (*.txt)|*.txt|\u7db2\u9801\u6587\u4ef6&#160;&#160; (*.html)|*.html&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.SaveDialogExport.Title&#160;&#160; :=&#160;&#160; &#8216;\u5c0e\u51fa\u70ba&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; not&#160;&#160; Self.SaveDialogExport.Execute&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; FileName&#160;&#160; :=&#160;&#160; Self.SaveDialogExport.FileName;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; FileExt&#160;&#160; :=&#160;&#160; LowerCase(ExtractFileExt(FileName));&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; FileExt&#160;&#160; =&#160;&#160; &#8216;.xls&#8217;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ExportGrid4ToExcel(FileName,&#160;&#160; Self.cxGrid1)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; else&#160;&#160; if&#160;&#160; FileExt&#160;&#160; =&#160;&#160; &#8216;.xml&#8217;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ExportGrid4ToXML(FileName,&#160;&#160; Self.cxGrid1)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; else&#160;&#160; if&#160;&#160; FileExt&#160;&#160; =&#160;&#160; &#8216;.txt&#8217;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ExportGrid4ToText(FileName,&#160;&#160; Self.cxGrid1)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; else&#160;&#160; if&#160;&#160; FileExt&#160;&#160; =&#160;&#160; &#8216;.html&#8217;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ExportGrid4ToHTML(FileName,&#160;&#160; Self.cxGrid1)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; else&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; msg&#160;&#160; :=&#160;&#160; &#8216;\u4e0d\u652f\u63f4\u7684\u5c0e\u51fa\u6a94\u985e\u578b&#8230;&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Application.MessageBox(PChar(msg),&#160;&#160; PChar(Application.Title),&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MB_OK&#160;&#160; or&#160;&#160; MB_IconError);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; msg&#160;&#160; :=&#160;&#160; &#8216;\u5c0e\u51fa\u5b8c\u6210&#8230;&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Application.MessageBox(PChar(msg),&#160;&#160; PChar(Application.Title),&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MB_OK&#160;&#160; or&#160;&#160; MB_IconInformation);&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.miPrintClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u5217\u5370<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.dxComponentPrinter.Preview(True,&#160;&#160; Self.dxComponentPrinterLink1);&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.cxGridPopupMenuPopup(ASenderMenu:&#160;&#160; TComponent;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AHitTest:&#160;&#160; TcxCustomGridHitTest;&#160;&#160; X,&#160;&#160; Y:&#160;&#160; Integer;&#160;&#160; var&#160;&#160; AllowPopup:&#160;&#160; Boolean);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; GetHitTypeByHitCode(AHitTest.HitTestCode)&#160;&#160; =&#160;&#160; gvhtColumnHeader&#160;&#160; then \/\/\u53f3\u64ca\u5217\u6a19\u984c\u6642<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/if&#160;&#160; tvResult.DataController.Groups.GroupingItemCount&#160;&#160; &gt;&#160;&#160; 0&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; tvResult.GroupedColumnCount&#160;&#160; &gt;&#160;&#160; 0&#160;&#160; then \/\/\u6709\u5206\u7d44\u6642\u986f\u793a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TMenuItem(Self.FindComponent(&#8216;miLineForGroup&#8217;)).Visible&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TMenuItem(Self.FindComponent(&#8216;miExpandAllGroup&#8217;)).Visible&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TMenuItem(Self.FindComponent(&#8216;miCollapseAllGroup&#8217;)).Visible&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TMenuItem(Self.FindComponent(&#8216;miLineForGroup&#8217;)).Visible&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TMenuItem(Self.FindComponent(&#8216;miExpandAllGroup&#8217;)).Visible&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TMenuItem(Self.FindComponent(&#8216;miCollapseAllGroup&#8217;)).Visible&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.miFilterBuilderClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u904e\u6ffe\u7ba1\u7406\u5668<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u5f48\u51faFilter&#160;&#160; Builder&#160;&#160; Dialog\u5c0d\u8a71\u65b9\u584a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; tvResult.Filtering.RunCustomizeDialog;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.miCustomFilterClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AHitTest:&#160;&#160; TcxCustomGridHitTest;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u81ea\u5b9a\u7fa9\u904e\u6ffe<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u5f48\u51faCustom&#160;&#160; Filter&#160;&#160; Dialog\u5c0d\u8a71\u65b9\u584a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AHitTest&#160;&#160; :=&#160;&#160; cxGridPopupMenu.HitTest;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; GetHitTypeByHitCode(AHitTest.HitTestCode)&#160;&#160; =&#160;&#160; gvhtColumnHeader&#160;&#160; then \/\/\u7372\u5f97\u53f3\u64ca\u7684\u5217<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tvResult.Filtering.RunCustomizeDialog(TcxGridColumnHeaderHitTest(AHitTest).Column);&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.miFilterPanelClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; mi:&#160;&#160; TMenuItem;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u96b1\u85cf\/\u986f\u793a\u904e\u6ffe\u9762\u677f<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; mi&#160;&#160; :=&#160;&#160; TMenuItem(Sender);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; mi.Checked&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; mi.Name&#160;&#160; =&#160;&#160; &#8216;miFilterPanelAlways&#8217;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tvResult.Filtering.Visible&#160;&#160; :=&#160;&#160; fvAlways&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; else&#160;&#160; if&#160;&#160; mi.Name&#160;&#160; =&#160;&#160; &#8216;miFilterPanelNerver&#8217;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tvResult.Filtering.Visible&#160;&#160; :=&#160;&#160; fvNever&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; else&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tvResult.Filtering.Visible&#160;&#160; :=&#160;&#160; fvNonEmpty;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.miExpandAllGroupClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u5c55\u958b\u6240\u6709\u7d44<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; tvResult.DataController.Groups.FullExpand;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormItemList.miCollapseAllGroupClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u6536\u7e2e\u6240\u6709\u7d44<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; tvResult.DataController.Groups.FullCollapse;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u5728\u7528\uff0c\u7559\u540d<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<h5>\u6280\u5de7\u4e09 \u6309\u689d\u4ef6\u8a08\u7b97\u5408\u8a08\u503c<\/h5>\n<p>\u5728Footer\u7684\u7b2c\u4e00\u5217\u986f\u793a[\u5408\u8a08:]&#160; <\/p>\n<p>\u52a0\u4e00\u500bSummary\u9805,Column\u8a2d\u70baGrid\u7684\u7b2c\u4e00\u5217,Kind\u8a2d\u70baskNone&#160; <\/p>\n<p>\u5728\u8a72Summary\u9805\u7684OnGetText\u4e8b\u4ef6\u4e2d,\u8f38\u5165:&#160; <\/p>\n<blockquote>\n<p>&#160; procedure&#160;&#160; TFormExpense.tvExpenseTcxGridDBDataControllerTcxDataSummaryFooterSummaryItems2GetText(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Sender:&#160;&#160; TcxDataSummaryItem;&#160;&#160; const&#160;&#160; AValue:&#160;&#160; Variant;&#160;&#160; AIsFooter:&#160;&#160; Boolean;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; var&#160;&#160; AText:&#160;&#160; String);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AText&#160;&#160; :=&#160;&#160; &#8216;\u5408\u8a08:&#8217;;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>\u6309\u689d\u4ef6\u532f\u7e3d:&#160; <\/p>\n<p>\u5728TableView\u7684DataController-&gt;Summary-&gt;FooterSummary-&gt;OnSummary\u4e8b\u4ef6\u4e2d,\u8f38\u5165:&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TFormExpense.tvExpenseDataControllerSummaryFooterSummaryItemsSummary(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ASender:&#160;&#160; TcxDataSummaryItems;&#160;&#160; Arguments:&#160;&#160; TcxSummaryEventArguments;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; var&#160;&#160; OutArguments:&#160;&#160; TcxSummaryEventOutArguments);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u5f97\u5230\u6b04\u4f4d\u540d&#160;&#160; TcxDBDataSummaryItem(Arguments.SummaryItem).FieldName;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; (ASender.DataController.Values[Arguments.RecordIndex,&#160;&#160; tvExpenseLevel.Index]&#160;&#160; &gt;&#160;&#160; 1)&#160;&#160;&#160;&#160;&#160;&#160; \/\/\u53ea\u7d71\u8a08Level\u5217=1\u7684\u503c<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; and&#160;&#160; (TcxDBDataSummaryItem(Arguments.SummaryItem).Kind&#160;&#160; =&#160;&#160; skSum)&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; OutArguments.Value&#160;&#160; :=&#160;&#160; 0; \/\/Level&#160;&#160; &gt;&#160;&#160; 1\u7684\u7d71\u8a08\u503c\u8a2d\u70ba0&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u501f\u8cb4\u5730\u4e00\u7528,\u554f\u500bCXGrid\u554f\u984c,\u5728cxgrid\u4e2d\u5982\u4f55\u4f7f\u4e00\u4e9b\u884c\u4e0d\u80fd\u7de8\u8f2f,\u5982:\u6b04\u4f4disenable&#160;&#160; =&#160;&#160; false\u7684\u884c<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u6a13\u4e0a\u7684\u554f\u984c<\/p>\n<p>\u8acb\u53c3\u8003\u4e0b\u9762\u7684\u6280\u5de7<\/p>\n<h5>\u6280\u5de7\u56db:\u6839\u64da\u67d0\u5217\u7684\u503c\u8a2d\u5b9a\u5176\u4ed6\u5217\u7684\u53ef\u7de8\u8f2f\u6027<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; TFormUser.tvUserEditing(Sender:&#160;&#160; TcxCustomGridTableView;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AItem:&#160;&#160; TcxCustomGridTableItem;&#160;&#160; var&#160;&#160; AAllow:&#160;&#160; Boolean);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u5982\u679c\u7b2c\u4e09\u5217\u503c\u70baTrue,\u5247\u7b2c4\u5217\u4e0d\u80fd\u4fee\u6539<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; (tvUser.Controller.FocusedRecord.Values[2]&#160;&#160; =&#160;&#160; True)&#160;&#160; and&#160;&#160; (AItem.Index&#160;&#160; =&#160;&#160; 4)&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AAllow&#160;&#160; :=&#160;&#160; False&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; else&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AAllow&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<h5>\u6280\u5de7\u4e94:\u4fdd\u5b58\/\u6062\u5fa9Grid\u4f48\u5c40<\/h5>\n<p>&#160; \/\/\u6062\u5fa9\u4f48\u5c40<\/p>\n<blockquote>\n<p>&#160; IniFileName&#160;&#160; :=&#160;&#160; ExtractFilePath(Application.ExeName)&#160;&#160; +&#160;&#160; &#8216;Layout\\&#8217;&#160;&#160; +&#160;&#160; Self.Name&#160;&#160; +&#160;&#160; &#8216;.ini&#8217;;&#160; <\/p>\n<p>&#160; if&#160;&#160; FileExists(IniFileName)&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.tvResult.RestoreFromIniFile(IniFileName) \/\/\u5f9e\u4f48\u5c40\u6a94\u4e2d\u6062\u5fa9<\/p>\n<p>&#160; else&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.tvResult.BeginUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; for&#160;&#160; i&#160;&#160; :=&#160;&#160; 0&#160;&#160; to&#160;&#160; Self.tvResult.ItemCount&#160;&#160; -&#160;&#160; 1&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Self.tvResult.Items[i].ApplyBestFit; \/\/\u8abf\u6574\u70ba\u6700\u4f73\u5bec\u5ea6<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Self.tvResult.EndUpdate;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; \/\/\u4fdd\u5b58\u4f48\u5c40<\/p>\n<blockquote>\n<p>&#160; IniFileName&#160;&#160; :=&#160;&#160; ExtractFilePath(Application.ExeName)&#160;&#160; +&#160;&#160; &#8216;Layout\\&#8217;&#160;&#160; +&#160;&#160; Self.Name&#160;&#160; +&#160;&#160; &#8216;.ini&#8217;;&#160; <\/p>\n<p>&#160; if&#160;&#160; not&#160;&#160; DirectoryExists(ExtractFileDir(IniFileName))&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; CreateDir(ExtractFileDir(IniFileName));&#160; <\/p>\n<p>&#160; Self.tvResult.StoreToIniFile(IniFileName); \/\/\u4fdd\u5b58\u70ba\u4f48\u5c40\u6a94<\/p>\n<\/blockquote>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u501f\u7528\u5730\u554f\u4e00\u4e0b\uff1a\u5728&#160;&#160; cxgrid\u4e2d\uff0c\u5982\u679c\u6211\u540c\u6642\u9078\u4e2d\u4e3b\u8868\u8207\u5b50\u8868\u4e2d\u7684\u8a18\u9304\uff0c\u600e\u4e48\u6a23\u80fd\u540c\u6642\u9032\u884c\u5c0d\u5176\u6240\u9078\u8a18\u9304\u9032\u884c\u8655\u7406\u5462\u3002<\/p>\n<p>\u6211\u73fe\u5728\u53ea\u80fd\u5224\u65b7 \u7126\u9ede\u662f\u5728\u4e3b\u8868\u9084\u662f\u5f9e\u8868\u4e2d\uff0c\u7136\u5f8c\u53ea\u80fd\u5c0d\u4e3b\u8868\u6216\u5b50\u8868\u4e2d\u7684\u8cc7\u6599\u9032\u884c\u8655\u7406\u3002<\/p>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>\u770b\u4f86\u7528cxGrid\u4eba\u4e0d\u591a\u554a<\/p>\n<p>\u518d\u591a\u8cbc\u4e00\u4e9b\u6280\u5de7,\u9700\u8981\u7684\u670b\u53cb\u9802\u4e00\u4e0b<\/p>\n<p>&#160; ==========================================================================&#160; <\/p>\n<h5>\u5728\u4e3b\u5f9eTableView\u4e2d\u6839\u64da\u4e3bTableView\u5f97\u5230\u5c0d\u61c9\u7684\u5f9eTableView&#160; <\/h5>\n<blockquote>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ADetailDC:&#160;&#160; TcxGridDataController;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AView:&#160;&#160; TcxCustomGridTableView;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with&#160;&#160; cxGrid1DBTableView1.DataController&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ADetailDC&#160;&#160; :=&#160;&#160; TcxGridDataController(GetDetailDataController(FocusedRecordIndex,&#160;&#160; 0));&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AView&#160;&#160; :=&#160;&#160; ADetailDC.GridView;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ==============================================================================&#160; <\/p>\n<h5>\u5b9a\u4f4d\u5728\u7b2c\u4e00\u884c\u4e26\u986f\u793a\u5167\u7f6e\u7de8\u8f2f\u5668<\/h5>\n<blockquote>\n<p>&#160; cxDBVerticalGrid1.FocusedRow&#160;&#160; :=&#160;&#160; cxDBVerticalGrid1.Rows[0];&#160; <\/p>\n<p>&#160; cxDBVerticalGrid1.ShowEdit;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ==============================================================================&#160; <\/p>\n<p>\u96b1\u85cf&#160;&#160; &quot;&lt;No&#160;&#160; data&#160;&#160; to&#160;&#160; display&gt;&quot;&#160;&#160; \u5b57\u4e32<\/p>\n<p>\u8a72\u6587\u672c\u5b58\u5132\u5728scxGridNoDataInfoText\u8cc7\u6e90\u5b57\u4e32,\u53ef\u4ee5\u5c07\u8a72\u8cc7\u6e90\u5b57\u4e32\u7684\u5167\u5bb9\u8a2d\u70ba\u7a7a<\/p>\n<p>\u4f86\u96b1\u85cf\u8a72\u6587\u672c\u3002<\/p>\n<blockquote>\n<p>&#160; uses&#160;&#160; cxClasses,&#160;&#160; cxGridStrs;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; &#8230;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; cxSetResourceString(@scxGridNoDataInfoText,&#160;&#160; &#8221;);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/\u5982\u679c&quot;&lt;No&#160;&#160; data&#160;&#160; to&#160;&#160; display&gt;&quot;&#160;&#160; \u5b57\u4e32\u5df2\u7d93\u986f\u793a\uff0c\u9700\u8981\u8abf\u7528\uff1a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; &lt;View&gt;.LayoutChanged;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ============================================================&#160; <\/p>\n<h5>\u522a\u9664\u61c9\u7528\u904e\u6ffe\u5f8c\u7684\u884c<\/h5>\n<blockquote>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; I:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with&#160;&#160; &lt;GridView&gt;&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for&#160;&#160; I&#160;&#160; :=&#160;&#160; 0&#160;&#160; to&#160;&#160; ViewData.RecordCount&#160;&#160; -&#160;&#160; 1&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ViewData.Records[0].Focused&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DataController.DataSet.Delete;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; =============================================================&#160; <\/p>\n<h5>\u6839\u64da\u55ae\u5143\u7684\u503c\u8a2d\u7f6e\u6a23\u5f0f<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; &lt;aForm&gt;.&lt;aColumn&gt;StylesGetContentStyle(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Sender:&#160;&#160; TcxCustomGridTableView;&#160;&#160; ARecord:&#160;&#160; TcxCustomGridRecord;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AItem:&#160;&#160; TcxCustomGridTableItem;&#160;&#160; out&#160;&#160; AStyle:&#160;&#160; TcxStyle);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; ARecord.Values[AItem.Index]&#160;&#160; =&#160;&#160; aSomeValue&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AStyle&#160;&#160; :=&#160;&#160; &lt;aSomeStyle&gt;;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; &lt;aForm&gt;.&lt;aView&gt;StylesGetContentStyle(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Sender:&#160;&#160; TcxCustomGridTableView;&#160;&#160; ARecord:&#160;&#160; TcxCustomGridRecord;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AItem:&#160;&#160; TcxCustomGridTableItem;&#160;&#160; out&#160;&#160; AStyle:&#160;&#160; TcxStyle);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AColumn:&#160;&#160; TcxCustomGridTableItem;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AColumn&#160;&#160; :=&#160;&#160; (Sender&#160;&#160; as&#160;&#160; TcxGridDBTableView).GetColumnByFieldName(&#8216;Email&#8217;);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; VarToStr(ARecord.Values[AColumn.Index])&#160;&#160; =&#160;&#160; &#8221;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AStyle&#160;&#160; :=&#160;&#160; cxStyleNullEmail;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; ==============================================================================&#160; <\/p>\n<p>&#160; TcxCustomGridTableView.FindItemByName,&#160;&#160; TcxGridDBTableView.GetColumnByFieldName&#160;&#160; or&#160; <\/p>\n<p>&#160; TcxGridDBDataController.GetItemByFieldName&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with&#160;&#160; cxGrid1DBBandedTableView1.DataController&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AValue&#160;&#160; :=&#160;&#160; Values[FocusedRecordIndex,&#160;&#160; GetItemByFieldName(&#8216;SomeFieldName&#8217;).Index];&#160; <\/p>\n<\/blockquote>\n<p>&#160; ===================================================================&#160; <\/p>\n<h5>\u52d5\u614b\u751f\u6210BandedView&#160; <\/h5>\n<blockquote>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AView:&#160;&#160; TcxCustomGridView;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AView&#160;&#160; :=&#160;&#160; &lt;cxGrid&gt;.CreateView(TcxGridDBBandedTableView);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TcxGridDBBandedTableView(AView).DataController.DataSource&#160;&#160; :=&#160;&#160; &lt;DataSource&gt;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TcxGridDBBandedTableView(AView).Bands.Add;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with&#160;&#160; TcxGridDBBandedTableView(AView).Bands.Add&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Visible&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FixedKind&#160;&#160; :=&#160;&#160; fkLeft;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TcxGridDBBandedTableView(AView).DataController.CreateAllItems;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; &lt;cxGridLevel&gt;.GridView&#160;&#160; :=&#160;&#160; AView;&#160; <\/p>\n<\/blockquote>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>======================================================================&#160; <\/p>\n<h5>\u7576\u5e95\u5c64\u8cc7\u6599\u96c6\u70ba\u7a7a\u6642\u986f\u793a\u4e00\u689d\u7a7a\u8a18\u9304<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; &lt;Form&gt;.&lt;cxGrid&gt;Enter(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View:&#160;&#160; TcxGridDBTableView;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View&#160;&#160; :=&#160;&#160; TcxGridDBTableView((Sender&#160;&#160; as&#160;&#160; TcxGrid).FocusedView);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; View.DataController.DataSet.IsEmpty&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; View.DataController.DataSet.Append;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; View.Controller.EditingController.ShowEdit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; =======================================================================&#160; <\/p>\n<h5>\u5728\u7576\u524dView\u63d2\u5165\u8a18\u9304<\/h5>\n<p>\u4f7f\u7528FocusedView\u5c6c\u6027\u5f97\u5230\u7576\u524d\u7126\u9edeView\uff0c\u7528View.DataController\u5f97\u5230\u5c0d\u61c9\u7684Data&#160;&#160; Controller\uff0c<\/p>\n<p>\u4e4b\u5f8c\u4f7f\u7528Data&#160;&#160; Controller\u7684\u65b9\u6cd5\u4f86\u904b\u7b97\u5143\u64da\uff1a<\/p>\n<p>&#160; -&#160;&#160; Append&#160; <\/p>\n<p>&#160; -&#160;&#160; Insert&#160; <\/p>\n<p>&#160; -&#160;&#160; Post&#160; <\/p>\n<p>&#160; -&#160;&#160; Cancel&#160; <\/p>\n<p>&#160; -&#160;&#160; DeleteFocused&#160; <\/p>\n<p>&#160; -&#160;&#160; DeleteSelection&#160; <\/p>\n<p>\u793a\u4f8b\uff1a<\/p>\n<blockquote>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ARecIndex:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160; \u2026&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.DataController.Append;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ARecIndex&#160;&#160; :=&#160;&#160; View.DataController.FocusedRecordIndex;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.DataController.Values[ARecIndex,&#160;&#160; SomeItemIndex]&#160;&#160; :=&#160;&#160; SomeValue;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.DataController.Post;&#160; <\/p>\n<\/blockquote>\n<p>\u53e6\u5916\u4e00\u7a2e\u65b9\u6cd5\u662f\u4f7f\u7528View.DataController.DataSource.DataSet\u5f97\u5230\u5e95\u5c64\u8cc7\u6599\u96c6\u5f8c\uff0c\u518d\u7528\u8cc7\u6599\u96c6\u7684<\/p>\n<p>\u65b9\u6cd5\u4f86\u904b\u7b97\u5143\u64da\u3002<\/p>\n<p>&#160; ========================================================================&#160; <\/p>\n<h5>\u555f\u52d5\u5167\u7f6e\u7de8\u8f2f\u63a7\u5236\u9805<\/h5>\n<blockquote>\n<p>&#160;&#160;&#160; 1)&#160;&#160; &lt;aView&gt;.Controller.EditingController.ShowEdit(&lt;aColumn&gt;);&#160; <\/p>\n<p>&#160;&#160;&#160; 2)&#160;&#160; &lt;aView&gt;.Controller.EditingController.StartEditShowingTimer(&lt;aColumn&gt;);&#160; <\/p>\n<p>&#160;&#160;&#160; 3)&#160;&#160; &lt;aView&gt;.Controller.EditingItem&#160;&#160; :=&#160;&#160; &lt;aColumn&gt;;&#160; <\/p>\n<p>&#160;&#160;&#160; 4)&#160;&#160; &lt;aColumn&gt;.Editing&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<\/blockquote>\n<h5>\u96b1\u85cf\u5167\u7f6e\u7de8\u8f2f\u63a7\u5236\u9805<\/h5>\n<blockquote>\n<p>&#160;&#160;&#160;&#160;&#160; &lt;aView&gt;.Controller.EditingController.HideEdit(True);&#160; <\/p>\n<\/blockquote>\n<p>&#160; ===========================================================================&#160; <\/p>\n<h5>\u79fb\u9664\u4e00\u500b\u5206\u7d44\u5217<\/h5>\n<blockquote>\n<p>&#160;&#160;&#160;&#160;&#160; &lt;aColumn&gt;.GroupIndex&#160;&#160; :=&#160;&#160; -1;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; &lt;aColumn&gt;.Visible&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ===========================================================================&#160; <\/p>\n<h5>\u4fdd\u5b58\u4fee\u6539\u5230\u8cc7\u6599\u5eab<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; &lt;aForm&gt;.FormClose(Sender:&#160;&#160; TObject;&#160;&#160; var&#160;&#160; Action:&#160;&#160; TCloseAction);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; (&lt;aGrid&gt;.FocusedView&#160;&#160; &lt;&gt;&#160;&#160; nil)&#160;&#160; and&#160;&#160; (&lt;aGrid&gt;.FocusedView.DataController.EditState&#160;&#160; &lt;&gt;&#160;&#160; [])&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;aGrid&gt;.FocusedView.DataController.Post;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ============================================================================&#160; <\/p>\n<h5>\u8a2d\u7f6e\u5167\u7f6e\u53f3\u9375\u83dc\u55ae<\/h5>\n<p>\u5167\u7f6e\u53f3\u9375\u529f\u80fd\u8868\u5305\u62ec\u4e8c\u500b\u529f\u80fd\u8868:cxGridStdHeaderMenu,&#160;&#160; TcxGridStdFooterMenu&#160; <\/p>\n<blockquote>\n<p>&#160; uses&#160;&#160; cxGridStdPopupMenu;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.cxGridPopupMenu1Popup(ASenderMenu:&#160;&#160; TComponent;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AHitTest:&#160;&#160; TcxCustomGridHitTest;&#160;&#160; X,&#160;&#160; Y:&#160;&#160; Integer;&#160;&#160; var&#160;&#160; AllowPopup:&#160;&#160; Boolean);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; ASenderMenu&#160;&#160; is&#160;&#160; TcxGridStdHeaderMenu&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TcxGridStdHeaderMenu(ASenderMenu).OnPopup&#160;&#160; :=&#160;&#160; StdHeaderMenuPopup;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.StdHeaderMenuPopup(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; I:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with&#160;&#160; TcxGridStdHeaderMenu(Sender).Items&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for&#160;&#160; I&#160;&#160; :=&#160;&#160; 0&#160;&#160; to&#160;&#160; Count&#160;&#160; -&#160;&#160; 1&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; Items[I].Caption&#160;&#160; =&#160;&#160; &#8216;Group&#160;&#160; By&#160;&#160; Box&#8217;&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Items[I].Enabled&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Break;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ===========================================================================&#160; <\/p>\n<h5>\u5f97\u5230\u9078\u4e2d\u8a18\u9304\u7684\u503c(MultiSelect)&#160; <\/h5>\n<blockquote>\n<p>&#160; 1)&#160;&#160; View.DataController.DataModeController.GridMode&#160;&#160; =&#160;&#160; False\u6642<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; RecIdx&#160;&#160; :=&#160;&#160; View.Controller.SelectedRecords[i].RecordIndex;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ColIdx&#160;&#160; :=&#160;&#160; View.DataController.GetItemByFieldName(AFieldName).Index;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; OutputVal&#160;&#160; :=&#160;&#160; View.DataController.Values[RecIdx,&#160;&#160; ColIdx];&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/RecID&#160;&#160; :=&#160;&#160; View.DataController.GetRecordId(RecIdx);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/OutputVal&#160;&#160; :=&#160;&#160; ADataSet.Lookup(View.DataController.KeyFieldNames,&#160;&#160; RecID,&#160;&#160; AFieldName);&#160; <\/p>\n<p>&#160; 2)&#160;&#160; Bkm: string;&#160; <\/p>\n<p>View.DataController.DataModeController.GridMode&#160;&#160; =&#160;&#160; True\u6642<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Bkm&#160;&#160; :=&#160;&#160; View.DataController.GetSelectedBookmark(ASelectedRecordIndex);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; ADataSet.BookmarkValid(TBookmark(Bkm))&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ADataSet.Bookmark&#160;&#160; :=&#160;&#160; Bkm;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; OutputVal&#160;&#160; :=&#160;&#160; ADataSet.FieldByName(AFieldName).Value;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.BeginUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.DataController.BeginLocate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; try&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; make&#160;&#160; changes&#160;&#160; here\u2026&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; finally&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; View.DataController.EndLocate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; View.EndUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160;&#160;&#160; \/\/\u76f4\u63a5\u8b80\u53d6\u9078\u64c7\u7684\u55ae\u683c\u5167\u5bb9<\/p>\n<blockquote>\n<p>var<\/p>\n<p>I, J: Integer;<\/p>\n<p>val: Variant;<\/p>\n<p>begin<\/p>\n<p>Result := 0;<\/p>\n<p>for I := 0 to TableView.Controller. SelectedRowCount &#8211; 1 do<\/p>\n<p>for J := 0 to TableView.Controller. SelectedColumnCount &#8211; 1 do<\/p>\n<p>begin<\/p>\n<p>val := TableView.DataController.GetValue(<\/p>\n<p>TableView.Controller.SelectedRows[I].RecordIndex,<\/p>\n<p>TableView.Controller.SelectedColumns[J].Index);<\/p>\n<p>Showmessage(val);<\/p>\n<p>end;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>&#160; =============================================================&#160; <\/p>\n<h5>\u5728GridMode\u7981\u7528\u5167\u7f6e\u7684\u53f3\u9375Footer\u83dc\u55ae<\/h5>\n<blockquote>\n<p>&#160; uses&#160;&#160; cxGridStdPopupMenu;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; cxGridPopupMenuOnPopup(&#8230;)&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; (ASenderMenu&#160;&#160; is&#160;&#160; TcxGridStdFooterMenu)&#160;&#160; and&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;GridView&gt;.DataController.DataModeController.GridMode&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AllowPopup&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ==============================================================&#160; <\/p>\n<h5>\u4e3b\u5f9e\u8868\u4efb\u4f55\u6642\u5019\u53ea\u80fd\u5c55\u958b\u4e00\u500b\u7d44<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; TForm1.ADetailDataControllerCollapsing(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ADataController:&#160;&#160; TcxCustomDataController;&#160;&#160; ARecordIndex:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; var&#160;&#160; AAllow:&#160;&#160; Boolean);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; I:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; C:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AAllow&#160;&#160; :=&#160;&#160; False;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; C&#160;&#160; :=&#160;&#160; 0;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; for&#160;&#160; I&#160;&#160; :=&#160;&#160; 0&#160;&#160; to&#160;&#160; ADataController.RecordCount&#160;&#160; -&#160;&#160; 1&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; ADataController.GetDetailExpanding(I)&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Inc(C);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; C&#160;&#160; &gt;&#160;&#160; 1&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AAllow&#160;&#160; :=&#160;&#160; True;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.ADetailDataControllerExpanding(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ADataController:&#160;&#160; TcxCustomDataController;&#160;&#160; ARecordIndex:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; var&#160;&#160; AAllow:&#160;&#160; Boolean);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ADataController.CollapseDetails;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.FormCreate(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1.DataController.OnDetailExpanding&#160;&#160; :=&#160;&#160; ADetailDataControllerExpanding;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1.DataController.OnDetailCollapsing&#160;&#160; :=&#160;&#160; ADetailDataControllerCollapsing;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; =================================================================&#160; <\/p>\n<\/blockquote>\n<h5>\u52d5\u614b\u5275\u5efa\u5c64\u6b21(Level)\u548c\u8996\u5716(View)&#160; <\/h5>\n<blockquote>\n<p>&#160; var&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Grid:&#160;&#160; TcxGrid;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Level:&#160;&#160; TcxGridLevel;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View:&#160;&#160; TcxGridDBTableView;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Creates&#160;&#160; a&#160;&#160; Grid&#160;&#160; instance&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Grid&#160;&#160; :=&#160;&#160; TcxGrid.Create(SomeOwner);&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Grid.Parent&#160;&#160; :=&#160;&#160; SomeParent;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Creates&#160;&#160; a&#160;&#160; Level&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Level&#160;&#160; :=&#160;&#160; Grid.Levels.Add;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Level.Name&#160;&#160; :=&#160;&#160; &#8216;SomeLevelName&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Creates&#160;&#160; a&#160;&#160; View&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View&#160;&#160; :=&#160;&#160; Grid.CreateView(TcxGridDBTableView)&#160;&#160; as&#160;&#160; TcxGridDBTableView;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.Name&#160;&#160; :=&#160;&#160; &#8216;SomeViewName&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; \u2026&#160;&#160; and&#160;&#160; binds&#160;&#160; it&#160;&#160; to&#160;&#160; the&#160;&#160; Level&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Level.GridView&#160;&#160; :=&#160;&#160; View;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Hooks&#160;&#160; up&#160;&#160; the&#160;&#160; View&#160;&#160; to&#160;&#160; the&#160;&#160; data&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.DataController.DataSource&#160;&#160; :=&#160;&#160; SomeDataSource;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; \u2026&#160;&#160; and&#160;&#160; creates&#160;&#160; all&#160;&#160; columns&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.DataController.CreateAllItems;&#160;&#160;&#160;&#160;&#160; <\/p>\n<p>&#160; end;&#160;&#160;&#160; <\/p>\n<\/blockquote>\n<p>\u6b64\u6a13\u56de\u5fa9Re\uff1a<\/p>\n<hr align=\"center\" size=\"2\" width=\"100%\" \/>\n<p>======================================================================&#160; <\/p>\n<h5>\u7372\u5f97Group&#160;&#160; Footer\u5408\u8a08\u884c\u5c0d\u61c9\u7684\u8a18\u9304<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; TForm1.cxGrid1DBTableView1CustomDrawFooterCell(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Sender:&#160;&#160; TcxGridTableView;&#160;&#160; ACanvas:&#160;&#160; TcxCanvas;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AViewInfo:&#160;&#160; TcxGridColumnHeaderViewInfo;&#160;&#160; var&#160;&#160; ADone:&#160;&#160; Boolean);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ALevel,&#160;&#160; ADataGroupIndex:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AGridRecord,&#160;&#160; AGroupRecord:&#160;&#160; TcxCustomGridRecord;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if&#160;&#160; AViewInfo&#160;&#160; is&#160;&#160; TcxGridRowFooterCellViewInfo&#160;&#160; and&#160;&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Row&#160;&#160; footer&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (TcxGridDBColumn(AViewInfo.Column).DataBinding.FieldName&#160;&#160; =&#160;&#160; &#8216;Area&#8217;)&#160;&#160; then&#160;&#160;&#160;&#160; \/\/&#160;&#160; Area&#160;&#160; column&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AGridRecord&#160;&#160; :=&#160;&#160; TcxGridRowFooterCellViewInfo(AViewInfo).GridRecord;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ALevel&#160;&#160; :=&#160;&#160; TcxGridRowFooterCellViewInfo(AViewInfo).Container.GroupLevel;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ADataGroupIndex&#160;&#160; :=&#160;&#160; Sender.DataController.Groups.DataGroupIndexByRowIndex[AGridRecord.Index];&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; ADataGroupIndex&#160;&#160; &lt;&gt;&#160;&#160; -1&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AGroupRecord&#160;&#160; :=&#160;&#160; AGridRecord;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while&#160;&#160; AGroupRecord.Level&#160;&#160; &lt;&gt;&#160;&#160; ALevel&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AGroupRecord&#160;&#160; :=&#160;&#160; AGroupRecord.ParentRecord;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AViewInfo.Text&#160;&#160; :=&#160;&#160; AGroupRecord.DisplayTexts[0];&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ===========================================================================&#160; <\/p>\n<h5>\u8a2a\u554f\u904e\u6ffe\u4e4b\u5f8c\u7684\u8a18\u9304<\/h5>\n<blockquote>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; I:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Memo1.Lines.Clear;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with&#160;&#160; cxGrid1DBTableView1.DataController&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for&#160;&#160; I&#160;&#160; :=&#160;&#160; 0&#160;&#160; to&#160;&#160; FilteredRecordCount&#160;&#160; -&#160;&#160; 1&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Memo1.Lines.Add(DisplayTexts[FilteredRecordIndex[I],&#160;&#160; 0]);&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ============================================================================&#160; <\/p>\n<h5>\u7372\u5f97\u55ae\u5143\u7684Font&#160; <\/h5>\n<blockquote>\n<p>&#160; cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items[1].GetCellViewInfoByItem(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1Company).EditViewInfo.Font;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ============================================================================&#160; <\/p>\n<h5>\u6839\u64daLevel\u540d\u7a31\u627e\u5230Level\u7269\u4ef6<\/h5>\n<blockquote>\n<p>&#160; function&#160;&#160; GetLevelByName(AGrid:&#160;&#160; TcxGrid;&#160;&#160; ALevelName:&#160;&#160; string):&#160;&#160; TcxGridLevel;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; function&#160;&#160; LoopThroughLevels(ALevel:&#160;&#160; TcxGridLevel;&#160;&#160; ALevelName:&#160;&#160; string):&#160;&#160; TcxGridLevel;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; I:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Result&#160;&#160; :=&#160;&#160; nil;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for&#160;&#160; I&#160;&#160; :=&#160;&#160; 0&#160;&#160; to&#160;&#160; ALevel.Count&#160;&#160; -&#160;&#160; 1&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; ALevel[I].Name&#160;&#160; =&#160;&#160; ALevelName&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Result&#160;&#160; :=&#160;&#160; ALevel[I];&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; ALevel[I].Count&#160;&#160; &gt;&#160;&#160; 0&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Result&#160;&#160; :=&#160;&#160; LoopThroughLevels(ALevel[I],&#160;&#160; ALevelName);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; Result&#160;&#160; &lt;&gt;&#160;&#160; nil&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; I:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Result&#160;&#160; :=&#160;&#160; nil;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; for&#160;&#160; I&#160;&#160; :=&#160;&#160; 0&#160;&#160; to&#160;&#160; AGrid.Levels.Count&#160;&#160; -&#160;&#160; 1&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; AGrid.Levels[I].Name&#160;&#160; =&#160;&#160; ALevelName&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Result&#160;&#160; :=&#160;&#160; AGrid.Levels[I];&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; AGrid.Levels[I].Count&#160;&#160; &gt;&#160;&#160; 0&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Result&#160;&#160; :=&#160;&#160; LoopThroughLevels(AGrid.Levels[I],&#160;&#160; ALevelName);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; Result&#160;&#160; &lt;&gt;&#160;&#160; nil&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ============================================================================&#160; <\/p>\n<h5>\u6307\u5b9aFilter&#160;&#160; Builder\u6253\u958b\/\u4fdd\u5b58\u904e\u6ffe\u6a94\u7684\u9ed8\u8a8d\u8def\u5f91<\/h5>\n<blockquote>\n<p>&#160; uses&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; &#8230;,&#160;&#160; cxFilterControlDialog;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm.GridView1FilterControlDialogShow(&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TfmFilterControlDialog(Sender).OpenDialog.InitialDir&#160;&#160; :=&#160;&#160; &#8216;D:\\&#8217;&#160; <\/p>\n<p>&#160; end;&#160;&#160;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ============================================================================&#160; <\/p>\n<h5>\u4fdd\u5b58\/\u6062\u5fa9\u5e36\u532f\u7e3d\u884c\u7684\u4f48\u5c40<\/h5>\n<blockquote>\n<p>&#160; &lt;TableView&gt;.StoreToIniFile(&#8216;c:\\Grid.ini&#8217;,&#160;&#160; True,&#160;&#160; [gsoUseSummary]);&#160;&#160;&#160; <\/p>\n<p>&#160; &lt;GridView&gt;.RestoreFromIniFile(&lt;inifilename&gt;,True,False&#160;&#160; {or&#160;&#160; True,&#160;&#160; optional},[gsoUseSummary]);&#160; <\/p>\n<\/blockquote>\n<p>&#160; ============================================================================&#160; <\/p>\n<h5>\u53d6\u6d88\u904e\u6ffe\u6642\u79fb\u5230\u7b2c\u4e00\u884c<\/h5>\n<blockquote>\n<p>&#160; uses&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; cxCustomData;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TYour_Form.AViewDataControllerFilterChanged(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Filter:&#160;&#160; TcxDataFilterCriteria;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with&#160;&#160; Sender&#160;&#160; as&#160;&#160; TcxDataFilterCriteria&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if&#160;&#160; IsEmpty&#160;&#160; then&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DataController.FocusedRowIndex&#160;&#160; :=&#160;&#160; 0;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; =============================================================================&#160; <\/p>\n<h5>\u6392\u5e8f\u5f8c\u79fb\u5230\u7b2c\u4e00\u884c<\/h5>\n<p>\u53ef\u4ee5\u8a2d\u7f6eDataController.Options.FocusTopRowAfterSorting&#160;&#160; :=&#160;&#160; True\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u7684\u4ee3\u78bc\uff1a<\/p>\n<blockquote>\n<p>&#160; uses&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; cxCustomData;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TYour_Form.Your_ViewDataControllerSortingChanged(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TcxCustomDataController(Sender).FocusedRowIndex&#160;&#160; :=&#160;&#160; 0;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>&#160; ==============================================================================&#160; <\/p>\n<h5>\u5224\u65b7\u7576\u524d\u884c\u662f\u5426\u7b2c\u4e00\u884c\u6216\u6700\u5f8c\u4e00\u884c<\/h5>\n<p>\u53ef\u4ee5\u4f7f\u7528DataController\u7684IsBOF,&#160;&#160; IsEOF\u65b9\u6cd5\uff0c\u6216\u8005\uff1a<\/p>\n<blockquote>\n<p>&#160; &lt;AView&gt;.Controller.Controller.FocusedRow.IsFirst&#160; <\/p>\n<p>&#160; &lt;AView&gt;.Controller.Controller.FocusedRow.IsLast&#160; <\/p>\n<\/blockquote>\n<p>&#160; ==============================================================================&#160; <\/p>\n<h5>\u6839\u64da\u6307\u5b9a\u503c\u67e5\u627e\u8a18\u9304<\/h5>\n<p>&#160; DataController\u63d0\u4f9b\u4e86\u597d\u5e7e\u500b\u65b9\u6cd5\u4f86\u5f97\u5230\u6307\u5b9a\u503c\u5c0d\u61c9\u7684RecordIndex&#160; <\/p>\n<p>\u5c0d\u65bcBound&#160;&#160; View\u53ef\u4ee5\u4f7f\u7528FindRecordIndexByKeyValue\u65b9\u6cd5<\/p>\n<p>&#160; ===============================================================================&#160; <\/p>\n<h5>\u7de8\u8f2f\u548c\u986f\u793aBlob\u6b04\u4f4d<\/h5>\n<p>\u8a72\u6b04\u4f4d\u7684Properties\u8a2d\u7f6e\u70baBlobEdit\uff0c\u4e26\u5c07BlobPaintStyle&#160;&#160; \u5c6c\u6027\u8a2d\u70ba&#160;&#160; bpsText&#160; <\/p>\n<p>&#160; ===============================================================================&#160; <\/p>\n<h5>\u5f97\u5230\u53ef\u898b\u884c\u6578<\/h5>\n<blockquote>\n<p>&#160; &lt;View&gt;.ViewInfo.VisibleRecordCount&#160; <\/p>\n<\/blockquote>\n<p>&#160; ===============================================================================&#160; <\/p>\n<h5>\u4fdd\u5b58\u5f8c\u7684\u884c\u8a2d\u7f6e\u70ba\u7576\u524d\u884c<\/h5>\n<blockquote>\n<p>&#160; const&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; CM_SETFOCUSEDRECORD&#160;&#160; =&#160;&#160; WM_USER&#160;&#160; +&#160;&#160; 1002;&#160; <\/p>\n<p>&#160; type&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TForm1&#160;&#160; =&#160;&#160; class(TForm)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1:&#160;&#160; TcxGridDBTableView;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1Level1:&#160;&#160; TcxGridLevel;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1:&#160;&#160; TcxGrid;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dxMemData1:&#160;&#160; TdxMemData;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dxMemData1Field1:&#160;&#160; TStringField;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dxMemData1Field2:&#160;&#160; TIntegerField;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DataSource1:&#160;&#160; TDataSource;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1RecId:&#160;&#160; TcxGridDBColumn;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1Field1:&#160;&#160; TcxGridDBColumn;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1Field2:&#160;&#160; TcxGridDBColumn;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Timer1:&#160;&#160; TTimer;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CheckBox1:&#160;&#160; TCheckBox;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; procedure&#160;&#160; Timer1Timer(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; procedure&#160;&#160; dxMemData1AfterPost(DataSet:&#160;&#160; TDataSet);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; procedure&#160;&#160; CheckBox1Click(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; private&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; procedure&#160;&#160; CMSetFocusedRecord(var&#160;&#160; Msg:&#160;&#160; TMessage);&#160;&#160; message&#160;&#160; CM_SETFOCUSEDRECORD;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; public&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&#160;&#160; Public&#160;&#160; declarations&#160;&#160; }&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Form1:&#160;&#160; TForm1;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; FocusedIdx:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160; implementation&#160; <\/p>\n<p>&#160; {$R&#160;&#160; *.dfm}&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.Timer1Timer(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; dxMemData1.AppendRecord([&#8221;,&#160;&#160; IntToStr(Random(1000)),&#160;&#160; Random(1000)]);&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.dxMemData1AfterPost(DataSet:&#160;&#160; TDataSet);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; PostMessage(Handle,&#160;&#160; CM_SETFOCUSEDRECORD,&#160;&#160; Integer(cxGrid1DBTableView1),&#160;&#160; MakeLParam(cxGrid1DBTableView1.Controller.FocusedRowIndex,&#160;&#160; cxGrid1DBTableView1.Controller.TopRowIndex));&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.CMSetFocusedRecord(var&#160;&#160; Msg:&#160;&#160; TMessage);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TcxGridDBTableView(msg.WParam).Controller.FocusedRowIndex&#160;&#160; :=&#160;&#160; Msg.LParamLo;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TcxGridDBTableView(msg.WParam).Controller.TopRowIndex&#160;&#160; :=&#160;&#160; Msg.LParamHi;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; procedure&#160;&#160; TForm1.CheckBox1Click(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Timer1.Enabled&#160;&#160; :=&#160;&#160; TCheckBox(Sender).Checked;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<p>&#160; end.&#160; <\/p>\n<\/blockquote>\n<p>&#160; =================================================================================&#160; <\/p>\n<h5>\u522a\u9664\u8a18\u9304\u4e26\u7372\u5f97\u7126\u9ede<\/h5>\n<blockquote>\n<p>&#160; procedure&#160;&#160; TForm1.BtnDeleteClick(Sender:&#160;&#160; TObject);&#160; <\/p>\n<p>&#160; var&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; FocusedRow,&#160;&#160; TopRow:&#160;&#160; Integer;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View:&#160;&#160; TcxGridTableView;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; DataController:&#160;&#160; TcxGridDataController;&#160; <\/p>\n<p>&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View&#160;&#160; :=&#160;&#160; cxGrid1.FocusedView&#160;&#160; as&#160;&#160; TcxGridTableView;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; DataController&#160;&#160; :=&#160;&#160; View.DataController;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Remember&#160;&#160; the&#160;&#160; top&#160;&#160; row&#160;&#160; (the&#160;&#160; vertical&#160;&#160; scrollbar&#160;&#160; position)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; TopRow&#160;&#160; :=&#160;&#160; View.Controller.TopRowIndex;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Remember&#160;&#160; the&#160;&#160; focused&#160;&#160; row(!)&#160;&#160; index&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; FocusedRow&#160;&#160; :=&#160;&#160; DataController.FocusedRowIndex;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; DataController.DeleteFocused;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; After&#160;&#160; deletion&#160;&#160; the&#160;&#160; same&#160;&#160; row&#160;&#160; must&#160;&#160; be&#160;&#160; focused,&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; although&#160;&#160; it&#160;&#160; will&#160;&#160; correspond&#160;&#160; to&#160;&#160; a&#160;&#160; different&#160;&#160; data&#160;&#160; record&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; DataController.FocusedRowIndex&#160;&#160; :=&#160;&#160; FocusedRow;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; \/\/&#160;&#160; Restore&#160;&#160; the&#160;&#160; top&#160;&#160; row&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; View.Controller.TopRowIndex&#160;&#160; :=&#160;&#160; TopRow;&#160; <\/p>\n<p>&#160; end;&#160; <\/p>\n<\/blockquote>\n<p>\/\/====================================================================================<\/p>\n<h5>\u5831\u8868\u532f\u7e3d\u7684\u8a2d\u7f6e<\/h5>\n<p>\u8cc7\u6599\u5eab\u4e2d\u7684\u8ca1\u52d9\u8868\u70ba\uff1a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ID&#160;&#160;&#160;&#160; \u6536\u652f\u985e\u578b \u91d1\u984d \u5176\u4ed6\u5c6c\u6027<\/p>\n<p>\u5176\u4e2d\u6536\u652f\u985e\u578b\u53ea\u6709\u5169\u7a2e\u503c\uff1a0&#160;&#160; \u8868\u793a\u6536\u5165\uff0c1&#160;&#160; \u8868\u793a\u652f\u51fa \uff1b\u91d1\u984d\u90fd\u662f\u6b63\u6578\u3002<\/p>\n<p>\u8a2d\u7f6ecxGrid\u7684Footer&#160;&#160; \u53ef\u4ee5\u4f7f\u5f97\u5728\u986f\u793a\u6642\uff0c\u5217\u8868\u7684\u4e0b\u65b9\u51fa\u73fe\u532f\u7e3d\u884c\uff1a\u201c\u91d1\u984d\u201d\u7684\u548c<\/p>\n<p>\u540c\u6a23\u8a2d\u7f6eDefault&#160;&#160; For&#160;&#160; Groups\u53ef\u4ee5\u4f7f\u5f97\u5728\u7528\u6236\u62d6\u52d5\u8868\u982d\u5c6c\u6027\u5be6\u73fe\u5206\u7d44\u6642\uff0c\u986f\u793a\u7d44\u5167\u7684\u532f\u7e3d\u884c\uff1a\u201c\u91d1\u984d\u201d\u7684\u548c\u3002<\/p>\n<p>\u4e0a\u9762\u8aaa\u7684\uff0c\u7528\u904ecxGrid\u61c9\u8a72\u90fd\u6703\uff0c\u4e0b\u9762\u5c31\u6709\u9019\u4e48\u4e00\u500b\u554f\u984c<\/p>\n<h5>\u5982\u679c\u6211\u60f3\u4f7f\u532f\u7e3d\u884c\u7684\u503c\u8b8a\u70ba\u5982\u4e0b\u7684\u503c\u61c9\u8a72\u600e\u6a23\u5be6\u73fe\uff1a<\/h5>\n<p>\u6536\u652f\u985e\u578b\u70ba0\u7684\u91d1\u984d\u7684\u548c&#160;&#160; -&#160;&#160; \u6536\u652f\u985e\u578b\u70ba1\u7684\u91d1\u984d\u7684\u548c<\/p>\n<p>\u5be6\u73feFooter\u7684\u529f\u80fd\u597d\u8fa6\uff0c\u56e0\u70ba\u5b83\u7684\u503c\u4e0d\u6703\u8b8a\uff0c\u81ea\u5df1\u7528\u8ff4\u5708\u5beb\u4e00\u500b\u5c31\u5b8c\u4e86\uff0c\u4f46\u662fDefault&#160;&#160; For&#160;&#160; Groups\u7684\u529f\u80fd\u5c31\u4e0d\u597d\u8aaa\u4e86\uff0c\u56e0\u70ba\u5b83\u7684\u503c\u662f\u6839\u64da\u7528\u6236\u62d6\u52d5\u7684\u5c6c\u6027\u8a08\u7b97\u7684\uff0c\u800c\u4e14\u9084\u6709\u53ef\u80fd\u662f\u591a\u5c64\u5206\u7d44\uff0c\u60f3\u4e0d\u51fa\u4f86\u4e86\uff0c\u6240\u6709\u5230\u9019\u4f86\u554f<\/p>\n<p>\u662f\u4e0d\u662f\u8981\u8a2d\u7f6e\u4ec0\u4e48\u5c6c\u6027\uff1f\u6216\u8005cxGrid\u6839\u672c\u5c31\u6c92\u9019\u500b\u529f\u80fd\uff0c\u90a3\u8a72\u7528\u4ec0\u4e48\u65b9\u6cd5\u89e3\u6c7a\uff1f\u5e0c\u671b\u54ea\u4f4d\u5e6b\u6211\u89e3\u6c7a\uff0c\u8b1d\u8b1d\u4e86\u5148\uff01<\/p>\n<p>\u7d66\u4f60\u4e00\u500b\u4f8b\u5b50,\u53ef\u80fd\u5c0d\u4f60\u6709\u5e6b\u52a9,&#160; <\/p>\n<blockquote>\n<p>&#160;&#160;&#160; with&#160;&#160; tvOrders.DataController.Summary&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; BeginUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SummaryGroups.Clear;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/The&#160;&#160; first&#160;&#160; summary&#160;&#160; group&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; with&#160;&#160; SummaryGroups.Add&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/Add&#160;&#160; proposed&#160;&#160; grouping&#160;&#160; column(s)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TcxGridTableSummaryGroupItemLink(Links.Add).Column&#160;&#160; :=&#160;&#160; tvOrdersCustomerID;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/Add&#160;&#160; summary&#160;&#160; items&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; with&#160;&#160; SummaryItems.Add&#160;&#160; as&#160;&#160; TcxGridDBTableSummaryItem&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Column&#160;&#160; :=&#160;&#160; tvOrdersPaymentAmount;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Kind&#160;&#160; :=&#160;&#160; skSum;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Format&#160;&#160; :=&#160;&#160; &#8216;Amount&#160;&#160; Paid:&#160;&#160; $,0&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; with&#160;&#160; SummaryItems.Add&#160;&#160; as&#160;&#160; TcxGridDBTableSummaryItem&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Column&#160;&#160; :=&#160;&#160; tvOrdersPaymentAmount;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Kind&#160;&#160; :=&#160;&#160; skCount;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Format&#160;&#160; :=&#160;&#160; &#8216;Records:&#160;&#160; 0&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/The&#160;&#160; second&#160;&#160; summary&#160;&#160; group&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; with&#160;&#160; SummaryGroups.Add&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/Add&#160;&#160; proposed&#160;&#160; grouping&#160;&#160; column(s)&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TcxGridTableSummaryGroupItemLink(Links.Add).Column&#160;&#160; :=&#160;&#160; tvOrdersProductID;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/Add&#160;&#160; summary&#160;&#160; items&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; with&#160;&#160; SummaryItems.Add&#160;&#160; as&#160;&#160; TcxGridDBTableSummaryItem&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Column&#160;&#160; :=&#160;&#160; tvOrdersQuantity;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Kind&#160;&#160; :=&#160;&#160; skSum;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Position&#160;&#160; :=&#160;&#160; spFooter;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Format&#160;&#160; :=&#160;&#160; &#8216;TOTAL&#160;&#160; =&#160;&#160; 0&#8217;;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; with&#160;&#160; SummaryItems.Add&#160;&#160; as&#160;&#160; TcxGridDBTableSummaryItem&#160;&#160; do&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Column&#160;&#160; :=&#160;&#160; tvOrdersPurchaseDate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Kind&#160;&#160; :=&#160;&#160; skMin;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Position&#160;&#160; :=&#160;&#160; spFooter;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; finally&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; EndUpdate;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;&#160; <\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;&#160;&#160;&#160; <\/p>\n<\/blockquote>\n<p> 2007-7-19 12:56:41&#160;&#160;&#160; go on<\/p>\n<p>\u8a02\u55ae\u865f \u5546\u54c1\u540d \u55ae\u50f9 \u6578\u91cf \u91d1\u984d<\/p>\n<p>001 aa 11.00 2 22.00<\/p>\n<p>001 bb 2.00 2 4.00<\/p>\n<p>001 cc 3.00 3 9.00<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\u5408\u8a08 7 35.00<\/p>\n<p>002 ee 11.00 2 22.00<\/p>\n<p>002 bb 3.00 2 6.00<\/p>\n<p>002 cc 3.00 3 9.00<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\u5408\u8a08 7 37.00<\/p>\n<p>\u7e3d\u8a0814 72.00<\/p>\n<h5>\u6bcf\u500b\u55ae\u865f\u5206\u4e00\u500b\u5c0f\u7d50\uff0c\u80fd\u5be6\u73fe\u55ce\uff1f\u6700\u5f8c\u5728\u5e95\u4e0b\u5be6\u73fe\u7e3d\u7684\u5408\u8a08<\/h5>\n<p>\u53ef\u4ee5\u7684\uff0ccxGrid\u7684\u529f\u80fd\u6bd4\u4f60\u60f3\u50cf\u7684\u9084\u8981\u5f37\u5927\u3002<\/p>\n<p>1.\u4f60\u5148\u653e\u4e00\u500bcxGrid\uff0c\u8a2d\u7f6e\u597dView\uff0c\u8a2d\u7f6eView.DataController\u9023\u63a5\u7684DataSource<\/p>\n<p>2.\u555f\u52d5DataSource\u9023\u63a5\u7684DataSet\uff0c\u96d9\u64cacxGrid\uff0c\u9ede\u64caRetrieve Fields\uff0c\u53d6\u5f97\u6240\u6709\u7684Column<\/p>\n<p>3.\u8a2d\u7f6eView\u7684OptionsView.Footer=True\uff0cOptionsView.GroupFooters=True\uff0c\u9019\u662f\u70ba\u4e86\u628a\u5206\u7d44\u5c0f\u8a08\u548c\u7e3d\u8a08\u9762\u677f\u986f\u793a\u51fa\u4f86<\/p>\n<p>4.\u5c07\u201c\u8a02\u55ae\u865f\u201d\u6b04\u4f4d\u62d6\u5230cxGrid\u4e0a\u65b9\u7684\u5206\u7d44\u9762\u677f(GroupbyBox)\uff0c\u5c07\u8cc7\u6599\u6309\u201c\u8a02\u55ae\u865f\u201d\u5206\u7d44\u3002\u9019\u6642\u4f60\u6703\u767c\u73fe\u55ae\u8eab\u6240\u6709\u7684\u8cc7\u6599\u90fd\u7e2e\u8d77\u4f86\u4e86\uff0c\u5982\u679c\u60f3\u4f7f\u6240\u6709\u7684\u8cc7\u6599\u90fd\u5c55\u958b\uff0c\u53ef\u4ee5\u8a2d\u7f6eView.DataController.Options.dcoGroupsAlwaysExpanded=True<\/p>\n<p>5.\u8a2d\u7f6e\u5206\u7d44\u5c0f\u8a08\uff1a\u628aView.DataController.Summary.DefaultGroupSummaryItems\u9ede\u958b\uff0c\u65b0\u589e\u4e00\u500bItem\uff0cColumn\u5c6c\u6027\u5728\u4e0b\u62c9\u88cf\u9078\u64c7\u201c\u6578\u91cf\u201d\u6b04\u4f4d\uff0cFieldName\u5c6c\u6027\u70ba\u7a7a\uff0cFormat\u5c6c\u6027\u53ef\u4ee5\u8a2d\u7f6e\u6578\u503c\u7684\u986f\u793a\u683c\u5f0f\uff0cKind\u5c6c\u6027\u4e0b\u62c9skSum\u52a0\u7e3d\uff0cPosition\u5c6c\u6027\u4e00\u5b9a\u8981\u9078\u64c7spFooter\u3002<\/p>\n<p>6.\u8a2d\u7f6e\u7e3d\u8a08\uff1a\u628aView.DataController.Summary.FooterSummaryItems\u9ede\u958b\uff0c\u65b0\u589e\u4e00\u500bItem\uff0cColumn\u5c6c\u6027\u5728\u4e0b\u62c9\u88cf\u9078\u64c7\u201c\u6578\u91cf\u201d\u6b04\u4f4d\uff0cFieldName\u5c6c\u6027\u70ba\u7a7a\uff0cFormat\u5c6c\u6027\u53ef\u4ee5\u8a2d\u7f6e\u6578\u503c\u7684\u986f\u793a\u683c\u5f0f\uff0cKind\u5c6c\u6027\u4e0b\u62c9skSum\u52a0\u7e3d\uff0cPosition\u5c6c\u6027\u4e00\u5b9a\u8981\u9078\u64c7spFooter\u3002<\/p>\n<p>\u5927\u529f\u544a\u6210\uff0c\u6309F9\u770b\u4e00\u4e0b\u52dd\u5229\u679c\u5be6\u5427\u3002<\/p>\n<p>\u518d\u5949\u9001\u4e00\u500b\u6280\u5de7\uff0c\u5728Form1\u518d\u653e\u4e00\u500bTcxGridPopupMenu\u63a7\u5236\u9805\uff0c\u5c31\u5728cxGrid\u63a7\u5236\u9805\u65c1\u908a\u7684\u90a3\u500b\uff0c\u628aTcxGridPopupMenu\u7684Grid\u5c6c\u6027\u8a2d\u7f6e\u6210\u4f60\u7684cxGrid\u3002<\/p>\n<p>\u7136\u5f8c\u904b\u884c\u7a0b\u5f0f\uff0c\u5728\u904b\u884c\u72c0\u614b\uff0c\u9ede\u64caGrid\u4e0a\u7684\u6240\u6709\u5730\u65b9\uff0c\u5de6\u9375\u6216\u53f3\u9375\uff0c\u4f60\u90fd\u6703\u6709\u610f\u5916\u6536\u7a6b\u3002<\/p>\n<p>ExpressQuantumGrid\u63a7\u5236\u9805\u5be6\u5728\u662f\u592a\u8907\u96dc\uff0c\u592a\u9f90\u5927\uff0c\u6700\u597d\u7684\u77ad\u89e3\u5b83\u7684\u65b9\u6cd5\u5c31\u662f\u67e5\u5e6b\u52a9\u3002<\/p>\n<h5>cxGrid\u7684\u591a\u9078\u6211\u4e00\u822c\u90fd\u662f\u7528\u9019\u500b\u65b9\u6cd5\uff1a<\/h5>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212; .Pas\u6587\u4ef6<\/p>\n<blockquote>\n<p>unit Unit1;<\/p>\n<p>interface<\/p>\n<p>uses<\/p>\n<p><a href=\"http:\/\/www.newasp.cn\/\">Windows<\/a>, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<\/p>\n<p>Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxEdit,<\/p>\n<p>DB, cxDBData, DBTables, cxGridLevel, cxGridCustomTableView,<\/p>\n<p>cxGridTableView, cxGridDBTableView, cxClasses, cxControls,<\/p>\n<p>cxGridCustomView, cxGrid, cxLookAndFeelPainters, cxGridRows, cxContainer,<\/p>\n<p>cxCheckBox, cxDataStorage;<\/p>\n<p>type<\/p>\n<p>TForm1 = class(TForm)<\/p>\n<p>cxGrid1: TcxGrid;<\/p>\n<p>cxGrid1DBTableView1: TcxGridDBTableView;<\/p>\n<p>cxGrid1DBTableView1CustNo: TcxGridDBColumn;<\/p>\n<p>cxGrid1DBTableView1Company: TcxGridDBColumn;<\/p>\n<p>cxGrid1DBTableView1Addr1: TcxGridDBColumn;<\/p>\n<p>cxGrid1DBTableView1City: TcxGridDBColumn;<\/p>\n<p>cxGrid1DBTableView1State: TcxGridDBColumn;<\/p>\n<p>cxGrid1DBTableView1Country: TcxGridDBColumn;<\/p>\n<p>cxGrid1Level1: TcxGridLevel;<\/p>\n<p>Table1: TTable;<\/p>\n<p>DataSource1: TDataSource;<\/p>\n<p>cxGrid1DBTableView1DBColumn1: TcxGridDBColumn;<\/p>\n<p>procedure FormCreate(Sender: TObject);<\/p>\n<p>procedure cxGrid1DBTableView1MouseDown(Sender: TObject;<\/p>\n<p>Button: TMouseButton; Shift: TShiftState; X, Y: Integer);<\/p>\n<p>procedure cxGrid1DBTableView1DBColumn1CustomDrawCell(<\/p>\n<p>Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;<\/p>\n<p>AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);<\/p>\n<p>procedure FormClose(Sender: TObject; var Action: TCloseAction);<\/p>\n<p>procedure cxGrid1DBTableView1CustomDrawCell(<\/p>\n<p>Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;<\/p>\n<p>AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);<\/p>\n<p>private<\/p>\n<p>AList: TList;<\/p>\n<p>function CheckList(ARecord: TcxCustomGridRecord): Boolean;<\/p>\n<p>{ Private declarations }<\/p>\n<p>public<\/p>\n<p>{ Public declarations }<\/p>\n<p>end;<\/p>\n<p>var<\/p>\n<p>Form1: TForm1;<\/p>\n<p>implementation<\/p>\n<p>{$R *.dfm}<\/p>\n<p>procedure TForm1.FormCreate(Sender: TObject);<\/p>\n<p>begin<\/p>\n<p>AList := TList.Create;<\/p>\n<p>end;<\/p>\n<p>function TForm1.CheckList(ARecord: TcxCustomGridRecord): Boolean;<\/p>\n<p>begin<\/p>\n<p>Result := AList.IndexOf(Pointer(ARecord.RecordIndex)) &lt;&gt; &#8211; 1;<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.cxGrid1DBTableView1MouseDown(Sender: TObject;<\/p>\n<p>Button: TMouseButton; Shift: TShiftState; X, Y: Integer);<\/p>\n<p>var<\/p>\n<p>AHitTest: TcxCustomGridHitTest;<\/p>\n<p>AGridRecord: TcxCustomGridRecord;<\/p>\n<p>begin<\/p>\n<p>if Sender is TcxGridSite then<\/p>\n<p>begin<\/p>\n<p>with TcxGridSite(Sender).GridView do<\/p>\n<p>AHitTest := ViewInfo.GetHitTest(X, Y);<\/p>\n<p>if (AHitTest.HitTestCode = htCell) and (TcxGridDBColumn(TcxGridRecordCellHitTest (AhitTest). Item ). DataBinding . FieldName = ) then<\/p>\n<p>AGridRecord := TcxGridRecordCellHitTest(AHitTest).GridRecord<\/p>\n<p>else<\/p>\n<p>Exit;<\/p>\n<p>end;<\/p>\n<p>if (AGridRecord &lt;&gt; nil) then<\/p>\n<p>if CheckList(AGridRecord) then<\/p>\n<p>AList.Remove(Pointer(AGridRecord.RecordIndex))<\/p>\n<p>else<\/p>\n<p>AList.Add(Pointer(AGridRecord.RecordIndex));<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.cxGrid1DBTableView1DBColumn1CustomDrawCell(<\/p>\n<p>Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;<\/p>\n<p>AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);<\/p>\n<p>begin<\/p>\n<p>if AViewInfo.EditViewInfo is TcxCustomCheckBoxViewInfo then<\/p>\n<p>TcxCustomCheckBoxViewInfo(AViewInfo.EditViewInfo).State:= TcxCheckBoxState(CheckList(AViewInfo.GridRecord));<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);<\/p>\n<p>begin<\/p>\n<p>AList.Free;<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.cxGrid1DBTableView1CustomDrawCell(<\/p>\n<p>Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;<\/p>\n<p>AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);<\/p>\n<p>begin<\/p>\n<p>with AViewInfo do<\/p>\n<p>if CheckList(GridRecord) then<\/p>\n<p>ACanvas.Brush.Color := clHighlight<\/p>\n<p>else<\/p>\n<p>ACanvas.Brush.Color := clWindow;<\/p>\n<p>ACanvas.Font.Color := clBlack;<\/p>\n<p>end;<\/p>\n<p>end.<\/p>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;cxGrid\u7684Dfm\u5c6c\u6027<\/p>\n<p>object cxGrid1: TcxGrid<\/p>\n<p>Left = 0<\/p>\n<p>Top = 0<\/p>\n<p>Width = 688<\/p>\n<p>Height = 446<\/p>\n<p>Align = alClient<\/p>\n<p>TabOrder = 0<\/p>\n<p>object cxGrid1DBTableView1: TcxGridDBTableView<\/p>\n<p>OnMouseDown = cxGrid1DBTableView1MouseDown<\/p>\n<p>NavigatorButtons.ConfirmDelete = False<\/p>\n<p>OnCustomDrawCell = cxGrid1DBTableView1CustomDrawCell<\/p>\n<p>DataController.DataSource = DataSource1<\/p>\n<p>DataController.DetailKeyFieldNames = CustNo<\/p>\n<p>DataController.KeyFieldNames = CustNo<\/p>\n<p>DataController.Summary.DefaultGroupSummaryItems = &lt;&gt;<\/p>\n<p>DataController.Summary.FooterSummaryItems = &lt;&gt;<\/p>\n<p>DataController.Summary.SummaryGroups = &lt;&gt;<\/p>\n<p>OptionsSelection.MultiSelect = True<\/p>\n<p>object cxGrid1DBTableView1CustNo: TcxGridDBColumn<\/p>\n<p>DataBinding.FieldName = CustNo<\/p>\n<p>end<\/p>\n<p>object cxGrid1DBTableView1DBColumn1: TcxGridDBColumn<\/p>\n<p>Caption = CheckColumn<\/p>\n<p>PropertiesClassName = TcxCheckBoxProperties<\/p>\n<p>Properties.DisplayUnchecked = False<\/p>\n<p>OnCustomDrawCell = cxGrid1DBTableView1DBColumn1CustomDrawCell<\/p>\n<p>Options.Editing = False<\/p>\n<p>Options.Filtering = False<\/p>\n<p>Options.IncSearch = False<\/p>\n<p>Options.ShowEditButtons = isebNever<\/p>\n<p>Options.Grouping = False<\/p>\n<p>Options.Sorting = False<\/p>\n<p>Width = 123<\/p>\n<p>end<\/p>\n<p>object cxGrid1DBTableView1Company: TcxGridDBColumn<\/p>\n<p>DataBinding.FieldName = Company<\/p>\n<p>end<\/p>\n<p>object cxGrid1DBTableView1Addr1: TcxGridDBColumn<\/p>\n<p>DataBinding.FieldName = Addr1<\/p>\n<p>end<\/p>\n<p>object cxGrid1DBTableView1City: TcxGridDBColumn<\/p>\n<p>DataBinding.FieldName = City<\/p>\n<p>end<\/p>\n<p>object cxGrid1DBTableView1State: TcxGridDBColumn<\/p>\n<p>DataBinding.FieldName = State<\/p>\n<p>end<\/p>\n<p>object cxGrid1DBTableView1Country: TcxGridDBColumn<\/p>\n<p>DataBinding.FieldName = Country<\/p>\n<p>end<\/p>\n<p>end<\/p>\n<p>object cxGrid1Level1: TcxGridLevel<\/p>\n<p>GridView = cxGrid1DBTableView1<\/p>\n<p>end<\/p>\n<p>end<\/p>\n<\/blockquote>\n<p>cyblueboy83 \u767c\u8868\u65bc 2005-12-9 11:30:45<\/p>\n<p>\u5b78\u7fd2<\/p>\n<p>hanlin2004 \u767c\u8868\u65bc 2005-12-9 13:14:52<\/p>\n<h5>\u6211\u4e00\u822c\u662f\u9019\u6a23\u53d6cxGrid\u9078\u4e2d\u7684\u7d00\u9304\u7684\u503c\u7684\uff1a<\/h5>\n<blockquote>\n<p>function TFrameAccount.GetSelectedID:variant;<\/p>\n<p>var<\/p>\n<p>AccID: array of string;<\/p>\n<p>i, n: Integer;<\/p>\n<p>Index: Integer;<\/p>\n<p>begin<\/p>\n<p>n := cxGrid1DBTableView1.DataController.GetSelectedCount;<\/p>\n<p>for i:=0 to n &#8211; 1 do<\/p>\n<p>begin<\/p>\n<p>Index := cxGrid1DBTableView1.DataController.GetSelectedRowIndex(i);<\/p>\n<p>setlength(AccID, length(AccID) + 1);<\/p>\n<p>AccID[High(AccID)] :=cxGrid1DBTableView1.DataController.GetRowValue(cxGrid1DBTableView1.DataController.GetRowInfo(Index),0); \/\/\u9019\u88cf\u76840\u662fGrid\u4e2d\u5217\u7684\u7d22\u5f15\uff0c0\u8868\u793a\u7b2c\u4e00\u500b\u5217\u7d81\u5b9a\u7684\u6b04\u4f4d<\/p>\n<p>end;<\/p>\n<p>result := AccID;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>DevExpress cxGrid\u7684\u61c9\u7528<\/p>\n<p>\u5728cxGrid\u4e0b\u5efa\u7acbview\uff0c\u53d6\u540dmyView<\/p>\n<h5>1. \u5141\u8a31\u9078\u64c7\u591a\u689d\u8a18\u9304(MultiSelect)\uff1a<\/h5>\n<blockquote>\n<p>&#160;&#160; myView&#8211;OptionsSelection&#8211;MultiSelect \u8a2d\u6210true<\/p>\n<\/blockquote>\n<h5>2. \u53d6\u5f97\u9078\u5b9a\u884c\u7684\u503c\uff1a<\/h5>\n<blockquote>\n<p>&#160;&#160; myView-&gt;DataController-&gt;FocusedRowIndex \u7372\u5f97\u9078\u64c7\u884c\u7684\u884c\u865f<\/p>\n<p>&#160;&#160; myView-&gt;DataController-&gt;Values[myView-&gt;DataController-&gt;FocusedRowIndex+1][0] \u9078\u64c7\u7684\u884c\u7684\u7b2c\u4e00\u5217\u7684\u503c<\/p>\n<p>&#160;&#160; myView-&gt;DataController-&gt;GetSelectedCount() \u9078\u64c7\u591a\u884c\u7684\u884c\u6578<\/p>\n<p>&#160;&#160; myView-&gt;DataController-&gt;GetSelectedRowIndex(\u884c\u865fn) \u6240\u9078\u591a\u884c\u88cf\u7684\u7b2cn\u884c<\/p>\n<\/blockquote>\n<h5>3. VerticalGrid\u7684\u55ae\u5143\u503c<\/h5>\n<blockquote>\n<p>\u63a7\u5236\u9805-&gt;Properties-&gt;Value \u7372\u5f97\u55ae\u5143\u7684\u503c\uff0c\u6b64\u503c\u70bavariant\u985e\u578b\uff0c\u9700\u8981\u5f37\u5236\u8f49\u63db\u6210AnsiString<\/p>\n<\/blockquote>\n<h5>4. VerticalGrid\u88cf\u7684CheckGroup\u7684\u4f7f\u7528<\/h5>\n<p>\u5f97\u5230\u7684\u503c\u70ba: (;1,3,8)\u6b64\u70ba\u9078\u64c7\u4e86\u9078\u9805\u88cf\u7684\u7b2c1\u30013\u30018\u9805<\/p>\n<p>5. VerticalGrid\u88cf\u9a57\u8b49<\/p>\n<p>&#160;&#160; TcxEditorRow\u7684properties-&gt;EditorProperties\u9078MaskEdit\uff0c\u7136\u5f8c\u518d\u9078\u4e0b\u9762\u7684MaskEdit\u548cMaskKind\uff0c\u53ef\u4ee5\u9650\u5b9a\u8f38\u5165\u7684\u6771\u897f<\/p>\n<h5>6. TcxPopupEdit\u63a7\u5236\u9805\u7684\u61c9\u7528\uff0cForm1\u52a0\u4e00\u500b\u63a7\u5236\u9805cxPopupEdit1<\/h5>\n<p>\u5c6c\u6027\u88cfPopupControl\u6307\u5411\u4f60\u8981\u5f48\u51fa\u7684\u8868\u55aeForm2\uff0cForm2\u88cf\u6dfb\u52a0\u4e00\u500b\u6309\u9215\uff0c\u8aaa\u660e\u6587\u4ef6\u88cf\u6dfb\u52a0<\/p>\n<p><a href=\"http:\/\/cache.baidu.com\/c?word=multiselect%2Ccxgrid&amp;url=http%3A\/\/forum%2Enetec%2Ecom\/###\">[Copy to clipboard]<\/a> <a href=\"http:\/\/cache.baidu.com\/c?word=multiselect%2Ccxgrid&amp;url=http%3A\/\/forum%2Enetec%2Ecom\/###\">[ &#8211; ]<\/a><\/p>\n<p>CODE:<\/p>\n<blockquote>\n<p>private:&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/ User declarations<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; AnsiString FEditValue;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; TcxPopupEdit *FPopupEdit;<\/p>\n<p>\u3002\u3002\u3002<\/p>\n<p>public:<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; __property AnsiString EditValue = {read=FEditValue,write=FEditValue};<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; __property TcxPopupEdit *PopupEdit = {read=FPopupEdit, write=FPopupEdit};<\/p>\n<\/blockquote>\n<p>\u5728Form1\u7684cxPopupEdit1\u63a7\u5236\u9805\u7684\u4e8b\u4ef6\u88cf\u6dfb\u52a0\u4e0b\u9762\u7684\u4ee3\u78bc<\/p>\n<p><a href=\"http:\/\/cache.baidu.com\/c?word=multiselect%2Ccxgrid&amp;url=http%3A\/\/forum%2Enetec%2Ecom\/###\">[Copy to clipboard]<\/a> <a href=\"http:\/\/cache.baidu.com\/c?word=multiselect%2Ccxgrid&amp;url=http%3A\/\/forum%2Enetec%2Ecom\/###\">[ &#8211; ]<\/a><\/p>\n<p>CODE:<\/p>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>void __fastcall TForm1::cxPopupEdit1PropertiesInitPopup(TObject *Sender)<\/p>\n<p>{<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Form2-&gt;PopupEdit = (TcxPopupEdit*)Sender;<\/p>\n<p>}<\/p>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>void __fastcall TForm1::cxPopupEdit1PropertiesCloseUp(TObject *Sender)<\/p>\n<p>{<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxPopupEdit1-&gt;EditValue = Form2-&gt;EditValue;<\/p>\n<p>}<\/p>\n<p>\u5728Form1\u7684\u6309\u9215\u4e8b\u4ef6\u88cf\u53ef\u4ee5\u52a0\u5165<\/p>\n<p><a href=\"http:\/\/cache.baidu.com\/c?word=multiselect%2Ccxgrid&amp;url=http%3A\/\/forum%2Enetec%2Ecom\/###\">[Copy to clipboard]<\/a> <a href=\"http:\/\/cache.baidu.com\/c?word=multiselect%2Ccxgrid&amp;url=http%3A\/\/forum%2Enetec%2Ecom\/###\">[ &#8211; ]<\/a><\/p>\n<p>CODE:<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; FEditValue = &quot;\u563b\u563b\u54c8\u54c8&quot;;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; FAccepted = AAccepted;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; FPopupEdit-&gt;DroppedDown = false;&#160; <\/p>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>7. TcxGrid\u63a7\u5236\u9805\u53bb\u6389\u4e0a\u9762\u7684&quot;Drag a column header here to group by that column&quot;\u6b04<\/p>\n<p>\u5728\u63a7\u5236\u9805\u7684view\u7684OptionsView\u5c6c\u6027\u88cf\u6709\u4e00\u500bGroupByBox\uff0c\u8a2d\u70bafalse\u5373\u53ef<\/p>\n<p>\u5475\u5475\uff0c\u5beb\u7684\u6709\u4e9b\u4e82\uff0c\u81ea\u5df1\u8a66\u8457\u505a\u5427<\/p>\n<h5>\u9078\u64c7\u4e86\u82e5\u5e72\u689d\u8a18\u9304(MultiSelect)<\/h5>\n<p>\u9078\u64c7\u4e86\u82e5\u5e72\u689d\u8a18\u9304(MultiSelect),\u73fe\u5728\u8981\u628a\u9019\u4e9b\u9078\u4e2d\u7684\u8a18\u9304\u5f9e\u8a72\u8cc7\u6599\u5eab\u8907\u88fd\u5230\u53e6\u4e00\u5eab\u4e2d\uff0c\u8a72\u5982\u4f55\u505a\uff1f<\/p>\n<p>\u53ef\u4ee5\u53c3\u8003\u3002\u6211\u7684\u7a0b\u5f0f\u662f\u5217\u5370\u9078\u64c7\u7684\u8a18\u9304 \uff0c<\/p>\n<p>\u4f60\u53ef\u4ee5\u4fdd\u5b58\u5230\u5176\u4ed6\u8868\u5c31\u597d\u3002<\/p>\n<blockquote>\n<p>var i:integer;<\/p>\n<p>begin<\/p>\n<p>&#160; if cxview1.DataController.Controller.SelectedRecordCount&gt;0 then<\/p>\n<p>&#160;&#160;&#160; with cxview1.DataController.DataSource.DataSet do<\/p>\n<p>&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; global.BQ_ppp(&#8221;,3); \/\/\u53ea\u9032\u884c\u8cc7\u6599\u6e05\u9664<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; for i:=0 to cxview1.DataController.Controller.SelectedRecordCount-1 do<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; GotoBookmark(Pointer(cxview1.DataController.GetSelectedBookmark(i)));<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if Pos(&#8216;\u8a08&#8217;,fields[0].AsString)=0 then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if CheckBox2.Checked then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; global.BQ_ppp(fields[0].AsString,0)\/\/\u7acb\u5373\u9032\u884c\u6a19\u7c64\u5217\u5370\uff0c\u4e0d\u628a\u8cc7\u6599\u52a0\u5230\u81e8\u6642\u8cc7\u6599\u5eab\u3002<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; global.BQ_ppp(fields[0].AsString,1); \/\/\u52a0\u5165\u8cc7\u6599\u5230\u81e8\u6642\u8cc7\u6599\u5eab\u3002<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if CheckBox2.Checked=false then \/\/\u5217\u5370\u4e2d\u7684\u8cc7\u6599\u53ea\u662f\u5305\u542b\u4e00\u7a2e\u6a19\u7c64\u3002 \u4e0d\u662f\u591a\u7a2e\u6a19\u7c64\u5217\u5370\uff0c\u96c6\u4e2d\u5217\u5370\u81e8\u6642\u8cc7\u6599\u5eab\u4e2d\u7684\u8cc7\u6599\u3002<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; global.BQ_ppp(&#8221;,2); \/\/\u53ea\u9032\u884c\u6a19\u7c64\u5217\u5370<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Log_save(&#8216;\u6a19\u7c64\u88dc\u6253&#8217;,&#8217;\u6a19\u7c64\u5217\u5370&#8217;);<\/p>\n<p>&#160;&#160;&#160; end;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>\u4f86\u81ea\uff1a<a href=\"http:\/\/www.delphibbs.com\/delphibbs\/dispu.asp?username=lihoulong\">lihoulong<\/a>, \u6642\u9593\uff1a2006-7-8 23:59:31, ID\uff1a3500034<\/p>\n<blockquote>\n<p>function CopyRecord(var recData: TArrayVariant): boolean;<\/p>\n<p>var<\/p>\n<p>&#160; i: integer;<\/p>\n<p>begin<\/p>\n<p>&#160; with FDataset do<\/p>\n<p>&#160; begin<\/p>\n<p>&#160;&#160;&#160; SetLength(recData, Fields.Count);<\/p>\n<p>&#160;&#160;&#160; for i := 0 to Fields.Count &#8211; 1 do<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; recData[i] := Fields[i].Value;<\/p>\n<p>&#160; end;<\/p>\n<p>&#160; Result := true;<\/p>\n<p>end;<\/p>\n<p>function TwpQDTable.PasteRecord(<\/p>\n<p>&#160; const RecData: array of Variant): boolean;<\/p>\n<p>var<\/p>\n<p>&#160; fcnt,<\/p>\n<p>&#160;&#160;&#160; i: integer;<\/p>\n<p>begin<\/p>\n<p>&#160; with FDataset do<\/p>\n<p>&#160; try<\/p>\n<p>&#160;&#160;&#160; fcnt :=&#160; Length(RecData) &#8211; 1;<\/p>\n<p>&#160;&#160;&#160; for i := 0 to fcnt do<\/p>\n<p>&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if FDataset.State in [dsBrowse] then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Edit;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Fields[i].Value := RecData[i];<\/p>\n<p>&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160;&#160; Result := true;<\/p>\n<p>&#160; except<\/p>\n<p>&#160;&#160;&#160; Result := false;<\/p>\n<p>&#160; end;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>\u5b9a\u7fa9\u4e00\u500b\u8a18\u9304\u9663\u5217<\/p>\n<blockquote>\n<p>for i := 0 to cxgrid.SelectedCount-1 do&#160; begin<\/p>\n<p>\u4f9d\u64da\u95dc\u9375\u5b57\u5b9a\u4f4d\u8cc7\u6599\u96c6,\u518d\u57f7\u884cCopyRecord<\/p>\n<p>end;<\/p>\n<p>\u5728\u7c98\u8cbc\u7684\u5730\u65b9\u7528pasteRecord<\/p>\n<\/blockquote>\n<h5>cxGrid\u7684\u4f7f\u7528\u65b9\u6cd5<\/h5>\n<p>1.&#160; \u53bb\u6389cxgrid\u4e2d\u53f0\u982d\u7684box ,\u5728tableview1\u7684ptionsview\u7684groupbybox=false;<\/p>\n<p>2.&#160; \u5728GRID footer \u4e2d\u52a0\u5165sum(\u5217), tableview1\u7684optionsview\u00e0footer=ture<\/p>\n<p>\u7136\u5f8c\u5728cxGRid1\u7684customize..\u4e2d\u7684summary \u7684footer.add\u9700\u8981\u5408\u8a08\u7684\u5217kind= skSum<\/p>\n<p>3.&#160; \u53bb\u6389cxgrid \u4e2d\u7684\u904e\u6ffe\u4e0b\u62c9\u7bad\u982d \u9078\u64c7tableview1.optionscustomize.columnfiltering=fasle;<\/p>\n<p>4.&#160;&#160; cxGrid1DBTableView1 \u7684 OptionView\u4e2d\u5c6c\u6027GroupFooters\u8a2d\u70bagfAlwaysVisible\u4e26\u8a2d\u7f6e\u9700\u8981\u6c42\u548c\u7684\u5217,\u5728summary.default for Groups \u4e0badd\u52a0\u5165\u9700\u8981\u5408\u8a08\u7684\u6b04\u4f4d,column\u4e0b\u986f\u793afieldname \u70ba\u7d71\u8a08\u6b04\u4f4d,format\u70ba\u683c\u5f0f,kind\u70ba\u7d71\u8a08\u65b9\u6cd5,position \u70ba\u4f4d\u5b50 spfooter \u5728\u5206\u7d44\u7684\u4e0b\u9762,spgroup \u5728\u5206\u7d44\u7684\u4e0a\u9762<\/p>\n<p>\u6216\u7528cxGridPopupMenu1,\u5728\u904b\u884c\u6642\u53ef\u5c0d\u4efb\u610f\u6578\u5b57\u985e\u578b\u5217\u6c42\u548c,\u65b9\u6cd5\u662f\u53ea\u9700\u8a2d\u7f6ecxGridPopupMenu1\u7684\u5c6c\u6027Grid\u70bacxGrid1DBTableView1\u7684cxGrid,<\/p>\n<p>\u5373\u53ef\u5be6\u73fe\u60a8\u6240\u9700\u529f\u80fd<\/p>\n<p>5.&#160; DEV Express\u88cf\u7684cxGrid\u9ed8\u8a8d\u7684\u6578\u503c\u683c\u5f0f\u5e36\uffe5\uff0c\u600e\u4e48\u53bb\u6389\u554a\uff01<\/p>\n<p>6.&#160; \u96d9\u64caCxgrid\uff0c\u9078\u64c7colmnum\u6539\u8b8a\u985e\u578b options.properties.Memo<\/p>\n<p>7.&#160; \u5728displayformat\u4e2d\u9032\u884c\u8a2d\u7f6e<\/p>\n<p>\u4f86\u6e90\u65bc\u5927\u5bcc\u7fc1\u8ad6\u58c7<\/p>\n<p>\u4f7f\u7528cxGrid\u6709\u4e00\u4e9b\u6642\u9593\u4e86\uff0c\u5728\u9019\u88cf\u7e3d\u7d50\u4e00\u4e0b\u4f7f\u7528cxGrid\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u5e0c\u671b\u7d66\u525b\u958b\u59cb\u63a5\u89f8cxGrid\u7684\u4eba\u4e00\u4e9b\u5e6b\u52a9\u3002<\/p>\n<p>1.\u7c21\u55ae\u4ecb\u7d39\uff1acxGrid\u53f3\u4e0b\u65b9\u7684cxGrid1Level1\u662f\u8868\u793aGrid\u8868\u7684\u5c64\uff0ccxGrid\u53ef\u4ee5\u6709\u591a\u5c64\uff0c\u9019\u76f8\u7576\u65bc\u96c6\u5408\u4e86PageControl\u7684<\/p>\n<p>\u529f\u80fd,\u800ccxGrid1Level1\u53f3\u908a\u7684cxGrid1DBTableView1\u76f8\u7576\u65bcDBGrid\u4e00\u6a23\u3002\u53f3\u64cacxGrid1\u53ef\u4ee5\u6dfb\u52a0cxGrid1Level2\uff0c\u53f3\u64ca<\/p>\n<p>cxGrid1Level2\uff0c\u53ef\u4ee5\u9078\u64c7Create View , Add level \u6216\u8005Delete Level\u3002Add level\u53ef\u4ee5\u589e\u52a0\u5b50Level\uff0cCreate View<\/p>\n<p>\u88cf\u9762\u53ef\u4ee5\u9078\u64c7\u5f88\u591a\u4e0d\u540c\u7e3d\u985e\u7684View\u3002\u5176\u4e2d<\/p>\n<p>&#160; 1)DB Table\u53ef\u4ee5\u548c\u8cc7\u6599\u5eab\u9023\u63a5\u7684View\uff0c\u66f4\u4e00\u822c\u7684DBGrid\u985e\u4f3c\uff0c\u5b83\u6bd4DBGrid\u591a\u4e86\u6bd4\u5982\u6ed1\u9f20\u4e2d\u9375\u53ef\u4ee5\u7528\uff0c\u53ef\u4ee5\u7d71\u8a08\uff0c<\/p>\n<p>\u67e5\u8a62\uff0c\u7b49\u7b49\u529f\u80fd\uff1b<\/p>\n<p>&#160; 2)DB Banded Table \u5247\u53ef\u4ee5\u5be6\u73fe\u6bd4\u5982\uff1a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u8aaa\u660e1&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u8aaa\u660e2&#160;&#160;&#160;&#160; |<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | \u6b04\u4f4d1 | \u6b04\u4f4d2 | \u6b04\u4f4d3 | \u6b04\u4f4d4 |<\/p>\n<p>\u7b49\u985e\u4f3c\u7684\u529f\u80fd\uff1b<\/p>\n<p>&#160; 3)DB Card View \u5247\u63d0\u4f9b\u4e86\u5361\u7247\u65b9\u5f0f\u7684\u986f\u793a\u8cc7\u6599\u7684\u529f\u80fd\uff0c\u9019\u500b\u7528\u5728\u6bd4\u5982\u4eba\u4e8b\u6a94\u6848\u7ba1\u7406\u6bd4\u8f03\u4e0d\u932f\uff1b<\/p>\n<p>&#160; 4)\u5176\u4ed6\u4e0d\u4e00\u4e00\u8d05\u8ff0\u3002<\/p>\n<p>2.\u4e00\u4e9b\u4f7f\u7528\u65b9\u6cd5\uff1a<\/p>\n<p>&#160; 1)\u6709\u5716\u7247\u548cMEMO\u7684\u4f8b\u5b50\uff1a<\/p>\n<p>\u62d6\u5165\u4e00\u500bcxGrid1\uff0cTable1\uff0cDataSource1\u3002 Table1\u7684DatabaseName\u8a2d\u70baDBDEMOS\uff0cTableName\u8a2d\u70babiolife.db\uff0c<\/p>\n<p>&#160;&#160; Active\u8a2d\u70baTrue;DataSource1\u7684DataSet\u8a2d\u70baTable1\uff1bcxGrid1DBTableView1\u7684DataController\u4e2d\u7684DataSource&#160; <\/p>\n<p>\u8a2d\u70baDataSource1;\u53f3\u64cacxGrid1DBTableView1\u9078\u64c7Create All Columns\uff1b\u96d9\u64cacxGrid1\uff0c\u5728\u5f48\u51fa\u7684\u7a97\u53e3\u4e2d\u627e\u5230<\/p>\n<p>&#160; cxGrid1DBTableView1Notes\u548ccxGrid1DBTableView1Graphic\uff0c\u5c07\u5b83\u5011\u7684Properties\u5c6c\u6027\u8a2d\u70baBlobEdit\uff1b\u904b\u884c\u770b\u770b<\/p>\n<p>\u7d50\u679c\u3002\u518d\u5c07cxGrid1DBTableView1Graphic\u7684Properties\u5c6c\u6027\u8a2d\u70baImage\uff0c\u518d\u5c07Properties\u4e0b\u7684Stretch\u8a2d\u70baTrue\uff0c<\/p>\n<p>\u5c07cxGrid1DBTableView1-&gt;optionsview-&gt;CellAutoHeight \u8a2d\u70baTrue\uff0c\u770b\u770b\u7d50\u679c\u3002<\/p>\n<p>&#160; 2)\u5982\u4f55\u8b93\u201cDrag a column here to group by that column\u201d\u4e0d\u986f\u793a<\/p>\n<p>\u89e3\u6c7a\uff1a\u9ede\u64cacxGrid1\u4e0a\u7684cxGrid1DBTableView1<\/p>\n<p>\u5728cxGrid1DBTableView1-&gt;optionsview-&gt;groupbybox:=false\u5373\u53ef<\/p>\n<p>\u6ce8\uff1aOptionsView\u88cf\u9762\u6709\u5f88\u591a\u5c6c\u6027\u53ef\u80fd\u7d93\u5e38\u8981\u7528\uff0c\u6bd4\u5982\uff1aColumnAutoWith,Navigator\u7b49\u7b49\uff0c\u6162\u6162\u7422\u78e8\u5427:)<\/p>\n<p>&#160; 3)GroupPanel\u4e0a\u9762\u7684\u82f1\u6587[Drag a column header to group by that column]\u600e\u4e48\u53ef\u4ee5\u6539\u6210\u4e2d\u6587\uff1f<\/p>\n<p>\u89e3\u6c7a\uff1a\u6700\u7c21\u55ae\u7684\u65b9\u6cd5\u662f TcxGridTableView.OnCustomDrawPartBackground \uff0c\u4e5f\u53ef\u7528 OnCustomDrawGroupCell\uff1a<\/p>\n<p>&#160;&#160;&#160; procedure TForm1.cxGrid1DBTableView1CustomDrawPartBackground(<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Sender: TcxGridTableView; ACanvas: TcxCanvas;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);<\/p>\n<p>&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; AViewInfo.Text:=&#8217;\u52d5\u614b\u8a2d\u7f6e GroupBox \u7684\u986f\u793a\u5167\u5bb9&#8217;;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; ACanvas.FillRect(AViewInfo.Bounds);<\/p>\n<p>&#160;&#160;&#160; end;<\/p>\n<p>&#160; 4)\u5982\u4f55\u5be6\u73fe\u5982\u4e0b\u529f\u80fd\uff1a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; +\u8ca1\u52d9\u90e8<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; +\u539f\u6750\u6599\u5009\u5eab<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; +\u6210\u54c1\u5eab<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; +\u885d\u58d3\u8eca\u9593<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; +\u8edf\u9ad4\u767c\u5c55\u90e8<\/p>\n<p>\u9019\u500b\u662f\u90e8\u9580\u7684\u540d\u7a31,\u9ede\u64ca\u52a0\u865f\u5c31\u53ef\u4ee5\u5c07\u672c\u90e8\u9580\u7684\u4eba\u54e1\u60c5\u6cc1\u986f\u793a\u51fa\u4f86\u3002<\/p>\n<p>\u89e3\u6c7a\uff1a\u5176\u5be6\u9019\u662f\u4e00\u500b\u4e3b\u5f9e\u8868\u95dc\u4fc2\uff0c1\uff1a\u586b\u597d\u4e3b\u8868\u7684keyfieldnames<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2\uff1a\u586b\u597d\u5f9e\u8868\u7684keyfieldnames<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3\uff1a\u586b\u597d\u5f9e\u8868\u7684 detaikeyfieldNames\u8207masterkeyfieldnames<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4: \u5f9e\u8868\u7684\u8cc7\u6599\u6e90\u4e00\u5b9a\u8981\u6309\u8207\u4e3b\u8868\u95dc\u806f\u7684\u6b04\u4f4d\u6392\u5e8f<\/p>\n<p>\u6ce8\uff1a\u5176\u4ed6\u5730\u65b9\u8a2d\u7f6e\u4e86\u4e3b\u5f9e\u8868\u7d50\u69cb\u90a3\u6a23\u5c31\u986f\u793a\u4e0d\u51fa\u4f86\uff0c\u6bd4\u5982\u8a2d\u7f6e\u4e86\u5f9e\u8868\u7684Table\u6216\u8005Query\u7684mastersource\u548c<\/p>\n<p>&#160;&#160; asterfield\u5c31\u6703\u4e0d\u80fd\u986f\u793a\u8cc7\u6599\uff01\u5982\u679c\u662f\u5169\u500bcxGrid\u7684\u4e3b\u5f9e\u95dc\u4fc2\uff0c\u9019\u6a23\u8a2d\u7f6e\u5c31\u5f88OK\u4e86\u3002<\/p>\n<p> 5)\u7d71\u8a08\u529f\u80fd<\/p>\n<p>\u89e3\u6c7a\uff1acxGrid1DBTableView1-&gt;optionsview-&gt;Footer \u8a2d\u70baTrue<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1-&gt;DataController-&gt;Summary\u8a2d\u7f6eFooterSummaryItems\u5373\u53ef<\/p>\n<p> 6)\u985e\u4f3cPageControl\u986f\u793a<\/p>\n<p>\u89e3\u6c7a\uff1a\u589e\u52a0\u4e00\u500bLevel,\u5c07cxGrid1-&gt;RootLevelOptions-&gt;DetailTabsPosition\u8a2d\u70badtpTop\uff0c\u7136\u5f8c\u76f8\u61c9\u7684\u8a2d\u7f6ecxGrid1Level1,\u548ccxGrid1Level2\u7684Caption\u503c\u3002<\/p>\n<p>\u672a\u5b8c\u5f85\u7e8c\u3002\u3002\u3002\u3002\u3002\u3002\u3002\u3002\u3002<\/p>\n<p>7)\u5982\u4f55\u8a2d\u5b9a\u5de6\u908a\u5e7e\u5217\uff0c\u4e0d\u80fd\u6efe\u52d5?<\/p>\n<p>\u89e3\u6c7a\uff1a\u4f7f\u7528DB Banded Table\u624d\u53ef\u4ee5\u5be6\u73fe\uff0c<\/p>\n<p>\u5728cxGrid1DBBandedTableView\u88cf\u5efa\u7acbBand0,Band1<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Band0\u7684Fixed=tfLeft<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Band1\u7684Fixed=tfnone<\/p>\n<p>\u8a2d\u7f6e\u8981\u9396\u5b9a\u7684\u6b04\u4f4d\u7684BandIndex=0,\u5176\u4ed6\u70ba1\uff0c\u5c31OK\u4e86\u3002<\/p>\n<p> 8)\u600e\u6a23\u5be6\u73fe\u5982EXCEL\u4e00\u6a23\u7684\uff0c\u7576\u524d\u683c=G14+G15+G16 \u9019\u6a23\u7684\u529f\u80fd<\/p>\n<p>\u89e3\u6c7a\uff1a\u8209\u4e00\u500b\u7c21\u55ae\u7684\u4f8b\u5b50\uff1alabel1.Caption := cxGrid1DBTableView1.DataController.Values[2,<\/p>\n<p>3]+cxGrid1DBTableView2.DataController.Values[1, 1]+cxGrid1DBTableView3.DataController.Values[1, 1];<\/p>\n<p>\u6240\u4ee5\u4e0d\u540ccxGrid1DBTableView\u4e2d\u7684\u8cc7\u6599\u90fd\u53ef\u4ee5\u7d66\u7576\u524d\u683c\uff0c\u9019\u6a23\u5c31\u505a\u5230\u4e86EXCEL\u4e2d\u7684\u7576\u524d\u683c=G14+G15+G16 \u985e\u4f3c\u7684\u529f\u80fd\u3002<\/p>\n<p> 9)\u6ed1\u9f20\u53f3\u64cacxGrid1DBBandedTableView1\u529f\u80fd\u8868\u88cf\u7684Edit Layout\u4ec0\u4e48\u7528\uff0c\u600e\u4e48\u4f7f\u7528\uff1f<\/p>\n<p>\u89e3\u6c7a\uff1a\u53ef\u4ee5\u62d6\u52d5\u6b04\u4f4d\uff0c\u4e26\u5217\u7684\u53ef\u4ee5\u62d6\u6210\u6709\u5c64\u6b21\u611f\uff08\u4e00\u5c64\u5c64\uff09\uff0c \u62d6\u52d5\u6642\u6703\u986f\u793a\u7bad\u982d\u7684\uff0c\u5c31\u662f\u8aaa\u53ef\u4ee5\u62d6\u4e00\u500b\u6b04\u4f4d\u653e<\/p>\n<p>\u5230\u6700\u4e0a\u9762\uff0c\u5c31\u53ef\u4ee5\u4f7f\u8a18\u9304\u6309\u6b64\u6b04\u4f4d\u9032\u884c\u5206\u7d44\u3002\u9ede\u64ca\u5176\u4e2d\u4e00\u500b\u6b04\u4f4d\uff0c\u4e0a\u9762\u9084\u6703\u51fa\u73fe\u4e00\u500b\u4e0a\u5347\u6216\u8005\u4e0b\u964d\u7684\u5c0f\u4e09\u89d2\u5f62\uff0c\u9019\u500b<\/p>\n<p>\u5c0f\u4e09\u89d2\u5f62\u7684\u4f5c\u7528\u662f\u5728\u904b\u884c\u968e\u6bb5\uff0c\u8cc7\u6599\u5c31\u6703\u6309\u7167\u9019\u500b\u6b04\u4f4d\u4e0a\u5347\u6216\u8005\u4e0b\u964d\u6392\u5e8f\u3002<\/p>\n<p>\u9084\u6709\u4e00\u500bSet as Default\u7684\u4f5c\u7528\u662f\u4fdd\u6301\u7576\u524dTableView\u7684\u53c3\u6578\uff0c\u4e0b\u6b64\u7522\u751f\u65b0\u7684TableView\u7684\u6642\u5019\u5c31\u6703\u53ef\u4ee5\u548c\u4e0a\u6b21\u4fdd\u6301\u7684\u53c3\u6578\u4e00\u6a23\u3002\u9019\u500b\u9084\u6c92\u6709\u505a\u904e\u8a66\u9a57\u3002<\/p>\n<p>10\uff09\u600e\u6a23\u5c07cxGrid\u88cf\u7684\u6578\u64da\u5c0e\u5165\u5230EXCEL\uff0cHTML\uff0cXML\u548cTEXT<\/p>\n<p>\u89e3\u6c7a\uff1a\u9019\u500b\u554f\u984c\u5728\u7528\u4e86cxGrid\u4ee5\u5f8c\u8b8a\u5f97\u7570\u5e38\u7c21\u55ae\uff0c<\/p>\n<blockquote>\n<p>uses<\/p>\n<p> cxExportGrid4Link;<\/p>\n<p>procedure TForm1.Button1Click(Sender: TObject);<\/p>\n<p>begin<\/p>\n<p> ExportGrid4ToEXCEL(&#8216;d:\\wang.xsl&#8217;,cxGrid1,True,True);<\/p>\n<p> ExportGrid4ToTEXT(&#8216;d:\\wang.txt&#8217;,cxGrid1,True,True);<\/p>\n<p> ExportGrid4ToXML(&#8216;d:\\wang.xml&#8217;,cxGrid1,True,True);<\/p>\n<p> ExportGrid4ToHTML(&#8216;d:\\wang.html&#8217;,cxGrid1,True,True);<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>11)\u5982\u4f55\u4f7f\u6eff\u8db3\u689d\u4ef6\u7684\u8cc7\u6599\u986f\u793a\u4e0d\u540c\u7684\u984f\u8272\uff1f<\/p>\n<p>\u89e3\u6c7a\uff1a<\/p>\n<blockquote>\n<p>var<\/p>\n<p>AYellowStyle: TcxStyle;<\/p>\n<p>procedure TForm1.FormCreate(Sender: TObject);<\/p>\n<p>begin<\/p>\n<p> \/\/\u884c\u984f\u8272<\/p>\n<p>AYellowStyle := TcxStyle.Create(Self);<\/p>\n<p>AYellowStyle.Color := $0080FFFF;<\/p>\n<p>AYellowStyle.TextColor := clMaroon;<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.cxGrid1DBBandedTableView1StylesGetContentStyle(<\/p>\n<p>Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;<\/p>\n<p>AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);<\/p>\n<p>begin<\/p>\n<p>if ARecord.Values[cxGrid1DBBandedTableView1Lengthcm.Index] &lt; 81 then<\/p>\n<p>&#160; AStyle := AYellowStyle;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>\u9019\u88cfcxGrid1DBBandedTableView1Lengthcm.Index\u5c0f\u65bc81\u6642\u5c31\u986f\u793a\u9ec3\u8272<\/p>\n<p>12\uff09\u5982\u4f55\u5f9e\u5916\u908a\u7684TXT\u6587\u4ef6\u5c0e\u5165\u5230cxGrid\uff1f<\/p>\n<blockquote>\n<p>\u89e3\u6c7a\uff1a&#160;&#160;&#160; procedure CustomizeColumns;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; procedure LoadData;<\/p>\n<p>procedure TForm1.CustomizeColumns;<\/p>\n<p>const<\/p>\n<p> cDistance = 1;<\/p>\n<p> cRadius = 5;<\/p>\n<p> cPeriod = 4;<\/p>\n<p> cPstring = 0;<\/p>\n<p>var<\/p>\n<p> I: Integer;<\/p>\n<p>begin<\/p>\n<p> DecimalSeparator := &#8216;.&#8217;;<\/p>\n<p> with cxGrid1TableView2 do<\/p>\n<p> for I := 0 to ColumnCount &#8211; 1 do<\/p>\n<p>&#160;&#160; if I in [cDistance, cRadius] then<\/p>\n<p>&#160;&#160;&#160;&#160; Columns[I].DataBinding.ValueTypeClass := TcxIntegerValueType\/\/1\uff0c5\u5217\u70baInteger<\/p>\n<p>&#160;&#160; else<\/p>\n<p>&#160;&#160;&#160;&#160; if I in [cPstring,cPeriod] then<\/p>\n<p>&#160;&#160;&#160;&#160; Columns[I].DataBinding.ValueTypeClass := TcxStringValueType\/\/0\uff0c4\u5217\u70baString<\/p>\n<p>&#160;&#160;&#160;&#160; else<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; Columns[I].DataBinding.ValueTypeClass := TcxFloatValueType;\/\/\u5176\u4ed6\u70baFloat<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.LoadData;<\/p>\n<p>const<\/p>\n<p> AFileName = &#8216;\u8cc7\u7522\u8ca0\u50b5\u8868.txt&#8217;;<\/p>\n<p> AHeaderLineCount = 2;<\/p>\n<p>var<\/p>\n<p> ARecords, AValues: TStringList;<\/p>\n<p> I: Integer;<\/p>\n<p> procedure InitRecord(const Str: string);<\/p>\n<p> var<\/p>\n<p>&#160;&#160; J: Integer;<\/p>\n<p>&#160;&#160; V: Variant;<\/p>\n<p> begin<\/p>\n<p>&#160;&#160; AValues.CommaText := Str;<\/p>\n<p>&#160;&#160; for J := 0 to AValues.Count &#8211; 1 do<\/p>\n<p>&#160;&#160;&#160; if AValues.Strings[J] &lt;&gt; &#8216;-&#8216; then<\/p>\n<p>&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160; V := AValues.Strings[J];<\/p>\n<p>&#160;&#160;&#160;&#160; if not VarIsNull(V) then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1TableView2.DataController.Values[I, J] := V;<\/p>\n<p>&#160;&#160;&#160; end;<\/p>\n<p> end;<\/p>\n<p>begin<\/p>\n<p> if not FileExists(AFileName) then<\/p>\n<p>&#160;&#160; raise Exception.Create(&#8216;Data file not found&#8217;);<\/p>\n<p> ARecords := TStringList.Create;<\/p>\n<p> AValues := TStringList.Create;<\/p>\n<p> with ARecords do<\/p>\n<p> try<\/p>\n<p>&#160;&#160; LoadFromFile(AFileName);<\/p>\n<p>&#160;&#160; cxGrid1TableView2.BeginUpdate;<\/p>\n<p>&#160;&#160; cxGrid1TableView2.DataController.RecordCount := Count &#8211; AHeaderLineCount;<\/p>\n<p>&#160;&#160; for I := 0 to Count &#8211; (AHeaderLineCount + 1) do<\/p>\n<p>&#160;&#160;&#160;&#160; InitRecord(Strings[I + AHeaderLineCount]);<\/p>\n<p> finally<\/p>\n<p>&#160;&#160; cxGrid1TableView2.EndUpdate;<\/p>\n<p>&#160;&#160; ARecords.Free;<\/p>\n<p>&#160;&#160; AValues.Free;<\/p>\n<p> end;<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.FormCreate(Sender: TObject);<\/p>\n<p>begin<\/p>\n<p> CustomizeColumns;<\/p>\n<p> LoadData_Zcfz;<\/p>\n<p>end;<\/p>\n<p>13\uff09\u5982\u4f55\u6539\u8b8a\u5217\u7684\u984f\u8272\uff1f<\/p>\n<p>var<\/p>\n<p> AFirstColumnStyle: TcxStyle;<\/p>\n<p>procedure TForm1.FormCreate(Sender: TObject);<\/p>\n<p>begin<\/p>\n<p> \/\/\u5217\u984f\u8272<\/p>\n<p> AFirstColumnStyle := TcxStyle.Create(Self);<\/p>\n<p> AFirstColumnStyle.Color := clAqua;<\/p>\n<p> AFirstColumnStyle.TextColor := clBlue;<\/p>\n<p> cxGrid1TableView1.Columns[1].Styles.Content := AFirstColumnStyle;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>14\uff09Set as default\u7684\u7528\u6cd5\uff1f<\/p>\n<p>\u89e3\u6c7a\uff1aSet as default\u7684\u7528\u6cd5\u662f\u70ba\u4e86\u89e3\u6c7a\u8a2d\u7f6e\u53c3\u6578\u7684\u65b9\u4fbf\u800c\u505a\u7684\uff0c\u6bd4\u5982\uff1a<\/p>\n<p>\u9023\u597d\u8cc7\u6599\u5eab\u4ee5\u5f8c\uff0c\u66f4\u6539cxGrid1DBBandedTableView1-&gt;OptionsCustomize-&gt;ColumnFiltering \u8a2d\u70baFalse\u3002\uff08\u9019\u500b\u8a2d\u7f6e\u53ef\u4ee5\u5c07\u6b04\u4f4d\u540d\u7684\u4e0b\u62c9\u55ae\u7d66\u53bb\u6389\uff09\u66f4\u6539cxGrid1DBBandedTableView1-&gt;OptionsView-&gt;Navigator \u8a2d\u7f6e\u70baTrue\u3002\u7136\u5f8c\u53f3\u64cacxGrid1DBBandedTableView1\uff0c\u5728\u5f48\u51fa\u7684\u83dc\u55ae\u6b04\u88cf\u9eb5\u9ede\u64caSet as default\u3002<\/p>\n<p>&#160; OK\uff0c\u4e0b\u6b21\u4f60\u518d\u7522\u751f\u4e00\u500b\u65b0\u7684cxGrid1DBBandedTableView1\u6642\u9019\u4e9b\u8a2d\u7f6e\u548c\u525b\u624d\u7684\u4e00\u6a23\u4e86\u3002\u5982\u679c\u9700\u8981\u8a2d\u7f6e\u7684\u53c3\u6578\u5f88\u591a\u7684\u6642\u5019\uff0c\u9019\u500bSet as default\u5f88\u6709\u7528\uff01<\/p>\n<p>15\uff09\u600e\u6a23\u4f7f\u6ed1\u9f20\u79fb\u52d5\u6642\uff0c\u76f8\u61c9\u7684\u55ae\u5143\u88cf\u7684\u6587\u5b57\u8b8a\u8272\uff1f<\/p>\n<p>\u89e3\u6c7a\uff1a<\/p>\n<blockquote>\n<p>var<\/p>\n<p> FTrackItem: TcxCustomGridTableItem;<\/p>\n<p> FTrackRec: TcxCustomGridRecord;<\/p>\n<p>procedure TForm1.cxGrid1DBTableView1CustomDrawCell(<\/p>\n<p> Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;<\/p>\n<p> AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);<\/p>\n<p>begin<\/p>\n<p> if (AViewInfo.GridRecord = FTrackRec) and (AViewInfo.Item = FTrackItem) then<\/p>\n<p> begin<\/p>\n<p>&#160;&#160; ACanvas.Font.Color := clred;&#160;&#160; \/\/\u7d05\u8272\u5b57\u9ad4<\/p>\n<p>&#160;&#160; ACanvas.Font.Style := [fsUnderline];\/\/\u5e36\u4e0b\u5283\u7dda<\/p>\n<p> end;<\/p>\n<p>end;<\/p>\n<p>procedure TForm1.cxGrid1DBTableView1MouseMove(Sender: TObject;<\/p>\n<p> Shift: TShiftState; X, Y: Integer);<\/p>\n<p>var<\/p>\n<p> AHitTest: TcxCustomGridHitTest;<\/p>\n<p> ATrackItem: TcxCustomGridTableItem;<\/p>\n<p> ATrackRec: TcxCustomGridRecord;<\/p>\n<p>begin<\/p>\n<p> ATrackItem := FTrackItem;<\/p>\n<p> ATrackRec := FTrackRec;<\/p>\n<p> AHitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);<\/p>\n<p> if AHitTest is TcxGridRecordCellHitTest then<\/p>\n<p> begin<\/p>\n<p>&#160;&#160; FTrackItem := TcxGridRecordCellHitTest(AHitTest).Item;<\/p>\n<p>&#160;&#160; FTrackRec := TcxGridRecordCellHitTest(AHitTest).GridRecord;<\/p>\n<p> end<\/p>\n<p> else<\/p>\n<p> begin<\/p>\n<p>&#160;&#160; FTrackItem := nil;<\/p>\n<p>&#160;&#160; FTrackRec := nil;<\/p>\n<p> end;<\/p>\n<p> if (ATrackItem &lt;&gt; FTrackItem) or (ATrackRec &lt;&gt; FTrackRec) then<\/p>\n<p> begin<\/p>\n<p>&#160;&#160; \/\/ Invalidate old cell<\/p>\n<p>&#160;&#160; if ATrackRec &lt;&gt; nil then<\/p>\n<p>&#160;&#160;&#160;&#160; ATrackRec.Invalidate(ATrackItem);<\/p>\n<p>&#160;&#160; \/\/ Invalidate new cell<\/p>\n<p>&#160;&#160; if FTrackRec &lt;&gt; nil then<\/p>\n<p>&#160;&#160;&#160;&#160; FTrackRec.Invalidate(FTrackItem);<\/p>\n<p> end;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>16)ExpressQuantumGrid 3.2.2\u4e2d\u7684dxdbgrid\u548c4.2\u7248\u672c\u4e2d\u7684cxgrid\u6709\u4ec0\u4e48\u5340\u5225?<\/p>\n<p>\u6709\u5f88\u5927\u7684\u5340\u5225\uff0c\u57fa\u672c\u4e0a\u76f8\u7576\u65bc\u662f\u5169\u500b\u63a7\u5236\u9805\u4e00\u6a23\u3002<\/p>\n<p>cxgrid\u662f\u5728dxdbgrid\u57fa\u790e\u4e0a\u5b8c\u5168\u91cd\u5beb\u7684\uff0c\u6240\u4ee5cxgrid\u4e0d\u652f\u6301dxdbgrid<\/p>\n<p>\u6240\u4ee5cxgrid\u88cf\u9762\u7279\u610f\u63d0\u4f9b\u4e86\u4e00\u500b\u5c07dxdbgrid\u5c0e\u5165\u5230cxgrid\u7684\u529f\u80fd\u3002<\/p>\n<p>17\uff09\u600e\u6a23\u8a2d\u8a08\u591a\u8868\u982d\u7684cxGrid\uff1f<\/p>\n<p>\u89e3\u6c7a\uff1acxGrid\u53ef\u4ee5\u89e3\u6c7a\u5982\u4e0b\u7684\u8868\u982d\uff1a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u8aaa\u660e1&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u8aaa\u660e2&#160;&#160;&#160;&#160; |<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | \u6b04\u4f4d1 | \u6b04\u4f4d2 | \u6b04\u4f4d3 | \u6b04\u4f4d4 |<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; \u6b04\u4f4d5&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u6b04\u4f4d6&#160;&#160;&#160;&#160; |<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; \u6b04\u4f4d7&#160;&#160;&#160; | \u6b04\u4f4d8 | \u6b04\u4f4d9 |<\/p>\n<p>\u5be6\u73fe\u9019\u500b\u5f88\u7c21\u55ae\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u4e0a\u9762\u62d6\u52d5\u6b04\u4f4d\u540d\uff0c\u62d6\u52d5\u6642\u6703\u986f\u793a\u7bad\u982d\u7684\uff0c\u653e\u5165\u4f60\u60f3\u986f\u793a\u7684\u4f4d\u7f6e\u5c31OK\u4e86\u3002\u6216\u8005\u5728\u6ed1\u9f20\u53f3\u64cacxGrid1DBBandedTableView1\u529f\u80fd\u8868\u88cf\u7684Edit Layout\u88cf\u4e5f\u53ef\u4ee5\u62d6\u653e\u3002<\/p>\n<p>\u4f46\u662fcxGrid\u4e0d\u80fd\u5be6\u73fe\u5982\u4e0b\u7684\u591a\u8868\u982d\u5f62\u5f0f\uff1a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u8aaa\u660e1&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u8aaa\u660e2&#160;&#160;&#160;&#160; |<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | \u8aaa\u660e3 | \u8aaa\u660e4 | \u8aaa\u660e5 | \u8aaa\u660e6 |<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; \u6b04\u4f4d1&#160;&#160;&#160; |&#160;&#160;&#160;&#160; \u6b04\u4f4d2&#160;&#160;&#160;&#160; |<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; \u6b04\u4f4d3&#160;&#160;&#160; | \u6b04\u4f4d4 | \u6b04\u4f4d5 |<\/p>\n<p>\u4e0d\u77e5\u9053\u6709\u8ab0\u80fd\u5be6\u73fe\u9019\u6a23\u7684\u591a\u8868\u982d\uff1f<\/p>\n<p>18\uff09\u5728\u4e3b\u5f9e\u8868\u7d50\u69cb\u6642\uff0c\u7576\u9ede\u958b\u201c+\u201d\u6642\u600e\u6a23\u5c07\u7126\u9ede\u805a\u5728\u76f8\u61c9\u4e3b\u8868\u7684\u8a18\u9304\u4e0a\uff1f<\/p>\n<p>\u89e3\u6c7a\uff1a<\/p>\n<blockquote>\n<p>var<\/p>\n<p> HitTest: TcxCustomGridHitTest;<\/p>\n<p>procedure TColumnsShareDemoMainForm.tvProjectsMouseDown(Sender: TObject;<\/p>\n<p> Button: TMouseButton; Shift: TShiftState; X, Y: Integer);<\/p>\n<p>begin<\/p>\n<p> \/\/ Note that the Sender parameter is a Site<\/p>\n<p> HitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);<\/p>\n<p> \/\/ The point belongs to the [+]\/[-] button area<\/p>\n<p> if HitTest is TcxGridExpandButtonHitTest then<\/p>\n<p>&#160;&#160; \/\/ Move focus to the record<\/p>\n<p>&#160;&#160; TcxGridExpandButtonHitTest(HitTest).GridRecord.Focused := True;<\/p>\n<p>end;<\/p>\n<\/blockquote>\n<p>19)CXGrid4\u5982\u4f55\u5c55\u958b\u5168\u90e8\u7bc0\u9ede<\/p>\n<blockquote>\n<p>\u89e3\u6c7a\uff1aGridDBTableView1.DataController.Groups.FullExpand;<\/p>\n<\/blockquote>\n<p> 2003-12-12 17:07:30&#160;&#160;&#160; \u554f\u984c20<\/p>\n<p>20\uff09cxGrid\u5982\u4f55\u52d5\u614b\u5275\u5efaItems\u7684Editor\u7684\u9805?<\/p>\n<p>&#160;&#160; cxGrid\u7684\u5217\u6709\u4e00\u500b\u5c6c\u6027,\u5b83\u7684\u7de8\u8f2f\u6846\u53ef\u4ee5\u6307\u5b9acombobox,spinedit\u7b49.\u5728\u8a2d\u8a08\u6642,\u53ef\u4ee5\u70ba<\/p>\n<p>&#160;&#160; combobox\u7684items\u6dfb\u52a0\u9805\u76ee.\u8acb\u554f\u662f\u5426\u53ef\u4ee5\u52d5\u614b\u5275\u5efa?(run-time\u6642\u7531\u7a0b\u5f0f\u52a0\u5165)<\/p>\n<p>\u89e3\u6c7a\uff1a<\/p>\n<blockquote>\n<p>var<\/p>\n<p>&#160; A:TDataSource:<\/p>\n<p>&#160; B:TcxlookupcomboboxProperties;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160; A:=TDataSource.create(self);<\/p>\n<p>&#160; B:=tcxlookupcomboboxproperties.create(self);<\/p>\n<p>&#160; A.Dataset:=Dic_ry_xb;\/\/\u6b64\u8655\u6307\u5b9a\u6578\u64da\u6e90\u3002<\/p>\n<p>&#160; b.listdource:=a;\/\/\u6b64\u8655\u6307\u660e\u6b04\u4f4d\u7684listsource\u5c6c\u6027\u3002<\/p>\n<p>&#160; b.keyfieldnames:=&#8217;a&#8217;;&#160;&#160;&#160; \/\/\u6b64\u8655\u6307\u660e\u6b04\u4f4d\u7684\u95dc\u9375\u5b57\u6bb5<\/p>\n<p>&#160; b.listfieldnames:=&#8217;b&#8217;;&#160;&#160; \/\/\u6b64\u8655\u6307\u660e\u6b04\u4f4d\u7684\u8fd4\u56de\u503c\u3002<\/p>\n<p>&#160; b.listcolumns.items[0].caption:=&#8217;x;&#160; \/\/\u6b64\u8655\u9ed8\u8a8d\u662f\u6703\u5efa\u7acb\u4e00\u500b\u6b04\u4f4d\uff0c\u4f46\u662f\u986f\u793a\u7684\u8868\u982d\u662fname\uff0c\u6240\u4ee5\u6b64\u8655\u8b93\u5b83\u986f\u793a\u70ba\u81ea\u5df1\u60f3\u8981\u7684\u4e2d\u5348\u986f\u793a\u3002<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; cxGrid1DBTableView1c1_sex_code.Properties:=b;&#160; \/\/\u6b64\u8655\u6307\u660e\u662f\u90a3\u500b\u6b04\u4f4d\u3002<\/p>\n<p>end;&#160; \/\/\u9019\u500b\u662f\u521d\u59cb\u5316\u7684\u4ee3\u78bc\uff0c<\/p>\n<\/blockquote>\n<p> 2004-1-7 14:05:14&#160;&#160;&#160; \u554f\u984c21<\/p>\n<p>21\uff09ExpressQuantumGrid4.5\u7684\u6f22\u5316\u5305<\/p>\n<p>\u5728\u9019\u88cf\u53ef\u4ee5\u4e0b\u8f09ExpressQuantumGrid4.5\u7684\u6f22\u5316\u5305\uff0c\u5c07\u6a94\u76f4\u63a5\u8986\u84cb\u5230\u539f\u59cb\u6a94\u6848\u5c31\u53ef\u4ee5\u4e86\u3002<\/p>\n<h5>\u5982\u4f55\u5728dxMemData1\u6216cxGrid1\u4e2d\u52d5\u614b\u6dfb\u52a0\u6b04\u4f4d\uff1f<\/h5>\n<blockquote>\n<p>Procedure TcxGridDBTableView.CreateDefaultColumn;&#160;&#160;&#160;&#160;&#160; \/\/\u5efa\u7acb\u9ed8\u8a8d\u7684\u5217&#160; \/\/Add By Pgt<\/p>\n<p>Var<\/p>\n<p>&#160; CxColumn:TcxGridDBColumn;<\/p>\n<p>&#160; FootItem:TcxDataSummaryItem;<\/p>\n<p>&#160; i:Integer;<\/p>\n<p>&#160; OldAutoWidth:Boolean;<\/p>\n<p>Begin<\/p>\n<p>&#160; If Assigned(DataController.DataSource) And<\/p>\n<p>&#160;&#160;&#160;&#160; Assigned(DataController.DataSource.DataSet) And<\/p>\n<p>&#160;&#160;&#160;&#160; DataController.DataSource.DataSet.Active Then Begin<\/p>\n<p>&#160;&#160;&#160;&#160; With DataController.DataSource.DataSet Do Begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; While ColumnCount&gt;0 Do<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Columns[0].Free ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; For i:=0 to FieldCount -1 Do Begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; If (Fields[i].DataType&lt;&gt;ftAutoInc) And (UpperCase(Fields[i].FullName)&lt;&gt;&#8217;ID&#8217;) Then Begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CxColumn:=Self.CreateColumn ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CxColumn.DataBinding.FieldName := Fields[i].FullName ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CxColumn.HeaderAlignmentHorz := taCenter ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CxColumn.HeaderAlignmentVert := VaCenter ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; If CxColumn.Width &gt;150 Then CxColumn.Width := 150 ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; If i=0 Then Begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem := DataController.Summary.FooterSummaryItems.Add ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.ItemLink :=CxColumn ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.Format := &#8216;\u51710\u689d&#8217;;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.Kind := skCount ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; End Else Begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; If (Fields[i].DataType = ftFloat) And (Pos(&#8216;\u50f9&#8217;,Fields[i].FullName)=0) Then Begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem := DataController.Summary.FooterSummaryItems.Add ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.ItemLink :=CxColumn ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; If Pos(&#8216;\u6578\u91cf&#8217;,Fields[i].FullName)&lt;&gt;0 Then<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.Format := &#8216;,0;-,0&#8217;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Else Begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.Format := &#8216;,0.00;-,0.00&#8217; ; \/\/ &#8216;\uffe5,0.00;-\uffe5,0.00&#8217;;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; If CxColumn.Width&lt;80 Then CxColumn.Width := 80 ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; End;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.DisplayName := Fields[i].FullName ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FootItem.Kind := skSum ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; End;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; End;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; End;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; End;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; OldAutoWidth := Self.OptionsView.ColumnAutoWidth ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; Self.OptionsView.ColumnAutoWidth := True ;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; Self.OptionsView.ColumnAutoWidth := OldAutoWidth ;<\/p>\n<p>&#160;&#160;&#160;&#160; End;<\/p>\n<p>&#160; End;<\/p>\n<p>End;<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\u670b\u53cb\u8cbc\u7d66\u6211\u7684\uff0c\u53ea\u77e5\u9053\u662f\u5927\u9678\u7db2\u7ad9\u4e0a\u5206\u4eab\u7684\u8cc7\u6599\uff0c\u53ef\u5728cxGrid\u5167\u4f7f\u7528CheckBox\u5594!!!\u53ea\u662f\u7528\u4e86\u4e4b\u5f8c\u4ee5\u524d\u53ef\u4f7f\u7528 Shift \u9078\u5340\u6bb5\u7684\u529f\u80fd\u4f3c\u4e4e\u4e0d\u80fd\u7528\u4e86\u3002<\/p>\n<p>======================================================================<\/p>\n<p>cxGrid\u7684\u4f7f\u7528\u65b9\u6cd5<\/p>\n<p>cxGrid\u529f\u80fd\u5f37\u5927\uff0c\u9069\u5408\u505a\u4f01\u696d\u7d1a\u7684\u8907\u96dc\u67e5\u8a62\u3002\u975e\u5e38\u65b9\u4fbf\u3002<\/p>\n<p>\u4f46\u662f\u5c0d\u5176\u7528\u6cd5\u4ecb\u7d39\u7684\u4e26\u4e0d\u591a\uff0c\u5728\u6b64\u7e3d\u7d50\u4ed6\u4eba\u7684\u4f7f\u7528\u7d93\u9a57\u548c\u81ea\u5df1\u7684\u4e00\u9ede\u5c0f\u7d93\u9a57\uff0c\u4f9b\u5927\u5bb6\u53c3\u8003\u3002<\/p>\n<p>\uff08\uff11\uff09\u52d5\u614b\u8a2d\u7f6e\u986f\u793a\u683c\u5f0f<\/p>\n<p>procedure SetDisplayFormat(ACtrlData: TClientDataSet;<\/p>\n<p>&#160; TbView: TcxGridDBTableView);<\/p>\n<p>var<\/p>\n<p>&#160; i: integer;<\/p>\n<p>begin<\/p>\n<p>&#160; if ACtrlData.RecordCount &lt;= 0 then Exit;<\/p>\n<p>&#160; try<\/p>\n<p>&#160;&#160;&#160; TbView.ClearItems;<\/p>\n<p>&#160;&#160;&#160; ACtrlData.First;<\/p>\n<p>&#160;&#160;&#160; for i := 0 to ACtrlData.RecordCount &#8211; 1 do<\/p>\n<p>&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; if ACtrlData.FieldByName(&#8216;SQBF_DisplayInGrid&#8217;).AsString = &#8216;1&#8217; then \/\/\u5728\u8868\u683c\u4e2d\u986f\u793a<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; with TbView.CreateColumn do<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; begin<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; DataBinding.FieldName := ACtrlData.FieldByName(&#8216;SQBF_FieldName&#8217;).AsString;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Caption := ACtrlData.FieldByName(&#8216;SQBF_Caption&#8217;).AsString; \/\/\u6b04\u4f4d\u4e2d\u6587\u6a19\u984c<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Hint := ACtrlData.FieldByName(&#8216;SQBF_Hint&#8217;).AsString;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Width := ACtrlData.FieldByName(&#8216;SQBF_Width&#8217;).AsInteger;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; HeaderAlignmentHorz := taCenter;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; end;<\/p>\n<p>&#160;&#160;&#160;&#160;&#160; [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[378,3],"tags":[379],"_links":{"self":[{"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/586"}],"collection":[{"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=586"}],"version-history":[{"count":0,"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/586\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=586"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.infinity.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}