Delphi CxGrid 요약(2)

22017 단어 Delphicxgrid
17. 다중 헤더의 cxGrid를 어떻게 설계합니까?해결: cxGrid는 다음과 같은 헤더를 해결할 수 있습니다. ------------------------------------------------------------------------|필드 1 | 필드 2 | 필드 3 | 필드 4 | 필드 5 | 필드 6 | 필드 7 | 필드 8 | 필드 9 | 이것을 간단하게 실현할 수 있습니다. 위에서 필드 이름을 드래그할 때 화살표를 표시할 수 있습니다. 표시하고 싶은 위치에 넣으면 OK입니다.또는 cxGrid1DBBandedTableView1 메뉴의 Edit Layout을 우클릭하면 드래그할 수 있습니다.
그러나 cxGrid는 다음과 같은 다중 헤더 형식을 실현할 수 없다. ----------------------------------------------------------------------------------------------|설명3 |설명5 |설명6 | 필드1 | 필드2 | 필드3 | 필드4 | 필드5 | 누가 이런 다중 헤더를 실현할 수 있는지 모르겠다.
**************************************************************************** 18. 주종표 구조에서'+'를 눌렀을 때 어떻게 상응하는 주표의 기록에 초점을 맞춥니까?해결: var HitTest: TcxCustomGridHitTest,
procedure TColumnsShareDemoMainForm.tvProjectsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin//Note that the Sender parameter is a Site   HitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);//The point belongs to the [+]/[-] button area   if HitTest is TcxGridExpandButtonHitTest then//Move focus to the record   TcxGridExpandButtonHitTest(HitTest).GridRecord.Focused := True; end;
******************************************************************************** 19 CXGrid4 모든 노드 해결 방법: GridDBTableView1.DataController.Groups.FullExpand;
**************************************************************************** 20. cxGrid 는 Items 의 Editor 항목을 동적으로 생성하는 방법해결: cxGrid의 열에는 속성이 있습니다. 편집 상자는combobox,spinedit 등을 지정할 수 있습니다.디자인할 때combobox의items에 항목을 추가할 수 있습니다.동적 생성이 가능합니까?(run-time 시 프로그램에 가입)
var
A:TDataSource:
B:TcxlookupcomboboxProperties;
begin
A:=TDataSource.create(self);
B:=tcxlookupcomboboxproperties.create(self);
A.Dataset:=Dic_ry_xb;//       。
b.listdource:=a;//       listsource  。
b.keyfieldnames:='a'; //           
b.listfieldnames:='b'; //          。
b.listcolumns.items[0].caption:='x; //            ,        name,                  。
cxGrid1DBTableView1c1_sex_code.Properties:=b; //         。
end; //         

**************************************************************************** 21. 파일 복사 시 진행 상태 해결:
procedure TForm1.mycopyfile(sourcef,targetf:string);
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
n:integer;
begin
   AssignFile(FromF, sourcef);
   Reset(FromF, 1); { Record size = 1 }
   AssignFile(ToF,targetf); { Open output file }
   Rewrite(ToF, 1); { Record size = 1 }
   n:=0;
   repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
        form1.label1.caption:=IntToStr(sizeof(buf)*n*100 div FileSize(FromF))+'100%';
        application.ProcessMessages;
        //    
        BlockWrite(ToF, Buf, NumRead, NumWritten);
        inc(n);
    until (NumRead = 0) or (NumWritten <> NumRead);
    form1.Label1.Caption:='100%';
    CloseFile(FromF);
    CloseFile(ToF);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
mycopyfile('e:/components/tv2k-w2k.zip','c:/a.zip');
end;

**************************************************************************** 22. cxGrid 설정 횡단보도 해결:TcxGrid DBBandedTable View.Styles 속성에 ContentEven(홀수 행 스타일)ContentOdd(짝수 행 스타일)가 있으니 스타일을 설정하면 됩니다. ***********************************************************************************************************************************23 기록 내용에 따라 글꼴 색상 변경 해결: 범례CustomDrawTableViewDemo를 참고하십시오. 주로 TcxGridDBBandedTableView에 있습니다.OnCustomDrawCell 이벤트에서 수행됩니다.다음 코드:
if(Pos('-', AViewInfo.GridRecord.DisplayTexts[colOrderProductCount.Index])>0) > 0) then begin//표지 음수 기록//ACanvas.Canvas.Brush.Color:= clMoneyGreen;     ACanvas.Canvas.Font.Color:= clRed;//clActiveCaption end;
여기서 colOrderProductCount는 제품 주문 열입니다.
한 걸음 더 가야 돼요. 디스플레이를 새로 고쳐야 돼요.
TcxGridDBBandedTableView.LayoutChanged();//tvCars.LayoutChanged(False); TcxGridDBBandedTableView.Painter.Invalidate;
********************************************************************************* 24 코드로 확장/축소 주종구조로 해결: Self.tvDepartment.ViewData.Expand(True);        Self.tvDepartment.ViewData.Collaspe(True);참고: tvDepartment 마스터 테이블에 해당하는 TableView
***************************************************************************25 내장 마우스 오른쪽 버튼 메뉴 뒤에 메뉴 항목 해결 추가: 우선 Form에 cxGridPopupupmMenu 컨트롤을 추가하여 오른쪽 버튼 메뉴 UseBuildInPopue를 True로 설정합니다.
   
procedure   TFormItemList.FormCreate(Sender:   TObject);  
var  
      AMenu:   TComponent;  
      FMenuItem,   FSubMenuItem:   TMenuItem;  
begin  
      AMenu   :=   nil;  
      if   cxGridPopupMenu.BuiltInPopupMenus.Count   =   0   then  
          Exit;  
      AMenu   :=   cxGridPopupMenu.BuiltInPopupMenus[0].PopupMenu; //         (    )  
      if   Assigned(AMenu)   and   AMenu.InheritsFrom(TPopupMenu)   then  
      begin  
          TPopupMenu(AMenu).AutoHotkeys   :=   maManual;         //      
   
          //-------------------------  
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Caption   :=   '-';  
          FMenuItem.Name   :=   'miLineForGroup';  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //       
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Name   :=   'miExpandAllGroup';  
          FMenuItem.Caption   :=   '     (&X)';  
          FMenuItem.OnClick   :=   miExpandAllGroupClick;  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //       
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Name   :=   'miCollapseAllGroup';  
          FMenuItem.Caption   :=   '     (&O)';  
          FMenuItem.OnClick   :=   miCollapseAllGroupClick;  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //-------------------------  
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Caption   :=   '-';  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //      
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Name   :=   'miFilterPanel';  
          FMenuItem.Caption   :=   '    (&P)';  
          //      
          FSubMenuItem   :=   TMenuItem.Create(Self);  
          FSubMenuItem.Name   :=   'miFilterPanelAuto';  
          FSubMenuItem.Caption   :=   '  (&A)';  
          FSubMenuItem.RadioItem   :=   True;  
          FSubMenuItem.GroupIndex   :=   5; //       
          FSubMenuItem.Checked   :=   True;  
          FSubMenuItem.OnClick   :=   miFilterPanelClick;  
          FMenuItem.Add(FSubMenuItem); //         
          //      
          FSubMenuItem   :=   TMenuItem.Create(Self);  
          FSubMenuItem.Name   :=   'miFilterPanelAlways';  
          FSubMenuItem.Caption   :=   '    (&W)';  
          FSubMenuItem.RadioItem   :=   True;  
          FSubMenuItem.GroupIndex   :=   5;  
          FSubMenuItem.OnClick   :=   miFilterPanelClick;  
          FMenuItem.Add(FSubMenuItem);  
          //      
          FSubMenuItem   :=   TMenuItem.Create(Self);  
          FSubMenuItem.Name   :=   'miFilterPanelNerver';  
          FSubMenuItem.Caption   :=   '    (&N)';  
          FSubMenuItem.RadioItem   :=   True;  
          FSubMenuItem.GroupIndex   :=   5;  
          FSubMenuItem.OnClick   :=   miFilterPanelClick;  
          FMenuItem.Add(FSubMenuItem);  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //       
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Name   :=   'miCustomFilter';  
          FMenuItem.Caption   :=   '     (&M)';  
          FMenuItem.OnClick   :=   miCustomFilterClick;  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //       
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Name   :=   'miFilterBuilder';  
          TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,   44); //        
          FMenuItem.ImageIndex   :=   TPopupMenu(AMenu).Images.Count   -   1; //        
          FMenuItem.Caption   :=   '     ';  
          FMenuItem.OnClick   :=   Self.miFilterBuilderClick;  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //---------------------  
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Caption   :=   '-';  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //    
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Name   :=   'miExport';  
          TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,   37);  
          FMenuItem.ImageIndex   :=   TPopupMenu(AMenu).Images.Count   -   1;  
          FMenuItem.Caption   :=   '  (&E)';  
          FMenuItem.OnClick   :=   Self.miExportClick;  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
   
          //    
          FMenuItem   :=   TMenuItem.Create(Self);  
          FMenuItem.Name   :=   'miPrint';  
          FMenuItem.Caption   :=   '  (&P)';  
          TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,   14);  
          FMenuItem.ImageIndex   :=   TPopupMenu(AMenu).Images.Count   -   1;  
          FMenuItem.OnClick   :=   Self.miPrintClick;  
          TPopupMenu(AMenu).Items.Add(FMenuItem);  
      end;  
end;  
   
procedure   TFormItemList.miExportClick(Sender:   TObject);  
var  
      FileName,   FileExt,   msg:   String;  
begin  
      if   Self.aqyQuery.IsEmpty   then  
      begin  
          msg   :=   '      ...';  
          Application.MessageBox(PChar(msg),   PChar(Application.Title),  
              MB_OK   or   MB_IconWarning);  
          Exit;  
      end;  
   
      Self.SaveDialogExport.Filter   :=   'Excel     (*.xls)|*.xls|XML     (*.xml)|*.xml'  
          +   '|       (*.txt)|*.txt|       (*.html)|*.html';  
      Self.SaveDialogExport.Title   :=   '   ';  
   
      if   not   Self.SaveDialogExport.Execute   then  
          Exit;  
   
      FileName   :=   Self.SaveDialogExport.FileName;  
      FileExt   :=   LowerCase(ExtractFileExt(FileName));  
      if   FileExt   =   '.xls'   then  
          ExportGrid4ToExcel(FileName,   Self.cxGrid1)  
      else   if   FileExt   =   '.xml'   then  
          ExportGrid4ToXML(FileName,   Self.cxGrid1)  
      else   if   FileExt   =   '.txt'   then  
          ExportGrid4ToText(FileName,   Self.cxGrid1)  
      else   if   FileExt   =   '.html'   then  
          ExportGrid4ToHTML(FileName,   Self.cxGrid1)  
      else  
      begin  
          msg   :=   '          ...';  
          Application.MessageBox(PChar(msg),   PChar(Application.Title),  
              MB_OK   or   MB_IconError);  
          Exit;  
      end;  
   
      msg   :=   '    ...';  
      Application.MessageBox(PChar(msg),   PChar(Application.Title),  
          MB_OK   or   MB_IconInformation);  
end;  
   
procedure   TFormItemList.miPrintClick(Sender:   TObject);  
begin  
      //    
      Self.dxComponentPrinter.Preview(True,   Self.dxComponentPrinterLink1);  
end;  
   
procedure   TFormItemList.cxGridPopupMenuPopup(ASenderMenu:   TComponent;  
      AHitTest:   TcxCustomGridHitTest;   X,   Y:   Integer;   var   AllowPopup:   Boolean);  
begin  
      if   GetHitTypeByHitCode(AHitTest.HitTestCode)   =   gvhtColumnHeader   then //        
      begin  
          //if   tvResult.DataController.Groups.GroupingItemCount   >   0   then  
          if   tvResult.GroupedColumnCount   >   0   then //        
          begin  
            TMenuItem(Self.FindComponent('miLineForGroup')).Visible   :=   True;  
            TMenuItem(Self.FindComponent('miExpandAllGroup')).Visible   :=   True;  
            TMenuItem(Self.FindComponent('miCollapseAllGroup')).Visible   :=   True;  
          end  
          else  
          begin  
            TMenuItem(Self.FindComponent('miLineForGroup')).Visible   :=   False;  
            TMenuItem(Self.FindComponent('miExpandAllGroup')).Visible   :=   False;  
            TMenuItem(Self.FindComponent('miCollapseAllGroup')).Visible   :=   False;  
          end;  
      end;  
end;  
   
procedure   TFormItemList.miFilterBuilderClick(Sender:   TObject);  
begin  
      //       
      //  Filter   Builder   Dialog     
      tvResult.Filtering.RunCustomizeDialog;  
end;  
   
procedure   TFormItemList.miCustomFilterClick(Sender:   TObject);  
var  
      AHitTest:   TcxCustomGridHitTest;  
begin  
      //       
      //  Custom   Filter   Dialog     
      AHitTest   :=   cxGridPopupMenu.HitTest;  
      if   GetHitTypeByHitCode(AHitTest.HitTestCode)   =   gvhtColumnHeader   then //        
          tvResult.Filtering.RunCustomizeDialog(TcxGridColumnHeaderHitTest(AHitTest).Column);  
end;  
   
procedure   TFormItemList.miFilterPanelClick(Sender:   TObject);  
var  
      mi:   TMenuItem;  
begin  
      //  /        
      mi   :=   TMenuItem(Sender);  
      mi.Checked   :=   True;  
      if   mi.Name   =   'miFilterPanelAlways'   then  
          tvResult.Filtering.Visible   :=   fvAlways  
      else   if   mi.Name   =   'miFilterPanelNerver'   then  
          tvResult.Filtering.Visible   :=   fvNever  
      else  
          tvResult.Filtering.Visible   :=   fvNonEmpty;  
end;  
   
procedure   TFormItemList.miExpandAllGroupClick(Sender:   TObject);  
begin  
      //       
      tvResult.DataController.Groups.FullExpand;  
end;  
   
procedure   TFormItemList.miCollapseAllGroupClick(Sender:   TObject);  
begin  
      //       
      tvResult.DataController.Groups.FullCollapse;  
end;

******************************************************************************26 열의 값에 따라 다른 열의 편집 가능한 해결을 설정합니다:procedure TFormUser.tvUserEditing(Sender:   TcxCustomGridTableView;        AItem:   TcxCustomGridTableItem;   var   AAllow:   Boolean);3열 값이 True이면 4열에서 if(tvUser.Controller.FocusedRecord.Value[2] = True) and(Aitem.Index = 4) then Aallow: = False else Aallow: = True;  end;
****************************************************************************** 27 Grid 레이아웃 해결 저장/복원: 메쉬 왼쪽 상단에 있는 사용자 정의 레이아웃 버튼: TableView-?OptionsCustiomize?ColumnsQuickCustomization true;
//      
IniFileName   :=   ExtractFilePath(Application.ExeName)   +   'Layout/'   +   Self.Name   +   '.ini';  
if   FileExists(IniFileName)   then  
      Self.tvResult.RestoreFromIniFile(IniFileName) //          
else  
begin  
      Self.tvResult.BeginUpdate;  
      for   i   :=   0   to   Self.tvResult.ItemCount   -   1   do  
          Self.tvResult.Items[i].ApplyBestFit; //         
      Self.tvResult.EndUpdate;  
end;  
   
//      
IniFileName   :=   ExtractFilePath(Application.ExeName)   +   'Layout/'   +   Self.Name   +   '.ini';  
if   not   DirectoryExists(ExtractFileDir(IniFileName))   then  
      CreateDir(ExtractFileDir(IniFileName));  
Self.tvResult.StoreToIniFile(IniFileName); //       


  :
IniFileName: string;

procedure TMainFM.FormCreate(Sender: TObject);     //         
var i: Integer;
begin
   qyHed.Open;
   IniFileName := ExtractFilePath(Application.ExeName) + '/Layout/' + cxGrd.Owner.ClassName + cxGrd.Name + '.ini';
   if FileExists(IniFileName) then
      Self.cxTbv.RestoreFromIniFile(IniFileName) //        
   else
   begin
      Self.cxTbv.BeginUpdate;
      for i := 0 to Self.cxTbv.ItemCount - 1 do
         Self.cxTbv.Items[i].ApplyBestFit; //       
      Self.cxTbv.EndUpdate;
   end;
end;

procedure TMainFM.NSaveGrdClick(Sender: TObject);      //      
begin
   try
      IniFileName := ExtractFilePath(Application.ExeName) + '/Layout/' + cxGrd.Owner.ClassName + cxGrd.Name + '.ini';
      if not DirectoryExists(ExtractFileDir(IniFileName)) then
         CreateDir(ExtractFileDir(IniFileName));
      Self.cxTbv.StoreToIniFile(IniFileName);
   except
   end;
end;

****************************************************************************
28 요약 행의 레이아웃 해결을 저장/복원: .StoreToIniFile('c:/Grid.ini',   True,   [gsoUseSummary]);    .RestoreFromIniFile(,True,False{or True,optional},[gsoUseSummary]);
zj: 이 조항과 50개 중복
****************************************************************************
28 마스터 종속 TableView에서 마스터 TableView에 따라 해당하는 종속 TableView 해결:
var        ADetailDC:   TcxGridDataController;        AView:   TcxCustomGridTableView;  begin        with   cxGrid1DBTableView1.DataController   do            ADetailDC   :=   TcxGridDataController(GetDetailDataController(FocusedRecordIndex,   0));        AView   :=   ADetailDC.GridView;  end;
 
==============================================================================
29 첫 줄에 위치하고 내장 편집기 보이기
cxDBVerticalGrid1.FocusedRow := cxDBVerticalGrid1.Rows[0]; cxDBVerticalGrid1.ShowEdit;
==============================================================================
30 " 문자열 숨기기
이 텍스트는 scxGridNoDataInfoText 자원 문자열에 저장되며, 이 자원 문자열의 내용을 비워 텍스트를 숨길 수 있습니다.
uses cxClasses, cxGridStrs; ... cxSetResourceString(@scxGridNoDataInfoText, '');
//""문자열이 이미 표시되면 다음과 같이 호출해야 합니다. .LayoutChanged;
============================================================
31 필터링된 행 제거
var I: Integer; begin with do for I := 0 to ViewData.RecordCount - 1 do begin ViewData.Records[0].Focused := True; DataController.DataSet.Delete; end;
=============================================================  
32 단원의 값 설정 스타일에 따라 해결: procedure .StylesGetContentStyle(        Sender:   TcxCustomGridTableView;   ARecord:   TcxCustomGridRecord;        AItem:   TcxCustomGridTableItem;   out   AStyle:   TcxStyle);  begin        if   ARecord.Values[AItem.Index]   =   aSomeValue   then            AStyle   :=   ;  end;     procedure   .StylesGetContentStyle(        Sender:   TcxCustomGridTableView;   ARecord:   TcxCustomGridRecord;        AItem:   TcxCustomGridTableItem;   out   AStyle:   TcxStyle);  var        AColumn:   TcxCustomGridTableItem;  begin        AColumn   :=   (Sender   as   TcxGridDBTableView).GetColumnByFieldName('Email');        if   VarToStr(ARecord.Values[AColumn.Index])   =   ''   then            AStyle   :=   cxStyleNullEmail;  end;     ======================================================================    TcxCustomGridTableView.FindItemByName,   TcxGridDBTableView.GetColumnByFieldName   or  TcxGridDBDataController.GetItemByFieldName           with   cxGrid1DBBandedTableView1.DataController   do            AValue   :=   Values[FocusedRecordIndex,   GetItemByFieldName('SomeFieldName').Index];******************************************************************************** 33 동적 생성 BandedView 해결: var AView: TcxCustom GridView;  begin        AView   :=   .CreateView(TcxGridDBBandedTableView);        TcxGridDBBandedTableView(AView).DataController.DataSource   :=   ;        TcxGridDBBandedTableView(AView).Bands.Add;        with   TcxGridDBBandedTableView(AView).Bands.Add   do        begin            Visible   :=   False;            FixedKind   :=   fkLeft;        end;        TcxGridDBBandedTableView(AView).DataController.CreateAllItems;        .GridView   :=   AView; end; **************************************************************************** 34 기본 데이터 집합이 비어 있을 때 빈 기록 해결을 표시합니다:procedure
.Enter(Sender:   TObject);  var        View:   TcxGridDBTableView;  begin        View   :=   TcxGridDBTableView((Sender   as   TcxGrid).FocusedView);        if   View.DataController.DataSet.IsEmpty   then        begin            View.DataController.DataSet.Append;            View.Controller.EditingController.ShowEdit;        end;  end; ****************************************************************************

좋은 웹페이지 즐겨찾기