unit U_cxGridCustomSet;

interface

uses
  Windows, SysUtils, Messages, Classes, Controls, StdCtrls, ComCtrls, Forms,
  ExtCtrls, ComObj, DXCORE, ActiveX, cxMemo, cxButtons, Graphics, IniFiles,
  Variants, DBClient,
  Dialogs, Menus, DB, ADODB, cxLabel, BtnEdit, RTComboBox, cxTextEdit,
  cxMRUEdit,
  cxDBData, cxGridLevel, cxButtonEdit, cxCurrencyEdit, cxGridTableView, cxGrid,
  cxGridCustomTableView, cxGraphics, cxCalendar, cxCheckBox, cxGridDBTableView,
  cxGridDBBandedTableView, cxStyles, cxPc, cxGroupBox, U_cxGridCustomCss,
  dxLayoutContainer,
  cxCustomData, cxClasses, cxTimeEdit, cxEdit, cxLookAndFeels, dxLayoutControl,
  cxLookAndFeelPainters, cxGridCustomView, Buttons, cxDropDownEdit;

// procedure createFindLayout(dxLayoutControl1: TdxLayoutControl; ADOTmp: TADOQuery; mdesignCode: string);
procedure CreateCxGridColumn(tv1: TcxGridDBTableView;
  ADOQueryTmp: TADOQuery; pdesignCode: PWideChar);
// stdcall;external 'rtCommon.dll' Name 'CreateCxGridColumn_A';
//procedure CreateCxGridColumn_A(application: TApplication;
//  tv1: TcxGridDBTableView; ADOQueryTmp: TADOQuery; mdesignCode: string);
//  stdcall; external 'rtCommon.dll';
procedure ShowCxGridDesign(application: TApplication;
  mCxGridView: TcxGridDBTableView; client1: TClientDataSet; ADOCmd: TADOQuery;
  mFormName: string; mGridName: string; mDllName: string;mFormId: integer; mGridType: integer = 0;mProcedureName: string='');
//function SaveGridSetInfoToBase(mCxGridView: TcxGridDBTableView;
//  ADOCmd: TADOQuery; designCode: PWideChar): Boolean; stdcall;
//  external 'rtCommon.dll' Name 'SaveGridSetInfoToBase_A';
//
function checkColumnMustIn(app: TApplication; tv1: TcxGridDBTableView;
  mFlag: integer): Boolean;
// stdcall;external 'rtCommon.dll' Name 'checkColumnMustIn_A';
function checkColumnMustIn_A(app: TApplication; tv1: TcxGridDBTableView;
  client1: TClientDataSet; mFlag: integer): Boolean;
procedure getColumnRelation(tv1: TcxGridDBTableView; client1: TClientDataSet);
function SaveGridSetInfoToBase(mCxGridView: TcxGridDBTableView; client1:TClientDataSet;
  ADOCmd: TADOQuery; designCode: string): Boolean;
implementation

 uses
 U_globalVar;

/// ////////////////////////////////////////////////////////////////
// ��ʾ������ƴ���
// 0: mGridType ��ѯ; 1:����
/// /////////////////////////////////////////////////////////////////
// procedure ShowCxGridDesign(mCxGridView: TcxGridDBTableView; ADOCmd: TADOQuery;
// mFormName: string; mGridName: string; mDllName: string; mFormId: integer;
// mGridType: integer = 0);
// type
// TMyFunc = function(App: Tapplication; FormH: hwnd; FormID: integer;
// UID: String; UName: String; dataBase: string; Title: string; Def1: string;
// Def2: string): hwnd; stdcall;
// var
// Tf: TMyFunc;
// Tp: TFarProc;
// Th: Thandle;
// newh: hwnd;
// mdesignCode: string;
// begin
//
// /// ////////////////////////////////////
// // Ȩ�޿���
// with ADOCmd do
// begin
// close;
// sql.Clear;
// filtered := false;
// sql.Add('select count(*) as cnt');
// sql.Add('from sy_user A');
// sql.Add('where userid=' + quotedStr(gUserId));
// sql.Add('and valid=''Y''');
// sql.Add('and candesign=1');
// open;
// if fieldByName('cnt').AsInteger <= 0 then
// begin
// close;
// // exit;
// end;
// close;
//
// mdesignCode := mDllName +mFormName+ '|' + intTostr(mFormId) + '|' + mGridName;
//
// /// ////////////////////////////////////////
// // ���浱ǰ�ؼ���Ϣ
// if not SaveGridSetInfoToBase(mCxGridView, ADOCmd, mdesignCode) then
// begin
// exit;
// end;
// end;
//
// /// ////////////////////////////////////////
// //
// Th := LoadLibrary('rtDesign.dll');
// if Th > 0 then
// begin
// try
// Tp := GetProcAddress(Th, 'GetDllForm');
// if Tp <> nil then
// begin
// Tf := TMyFunc(Tp);
// newh := Tf(Application, 0, 2, PChar(gUserId), PChar(gUserName),
// PChar(DConString), PChar('�������'), PChar(mdesignCode), PChar(''));
// end
// else
// begin
// ShowMessage('����rtDesign.dllʱ��������!');
// end;
// finally
// // FreeLibrary();
// end;
// end
// else
// begin
// ShowMessage('�Ҳ���rtDesign.dll');
// end;
// // CreateCxGridColumn(mCxGridView,ADOCmd,mwinCode,mFormName,mGridName);
//
// CreateCxGridColumn(mCxGridView, ADOCmd, mdesignCode);
//
// end;

/// ////////////////////////////////////////////////////////////////////
// �����������Ϣ
/// ///////////////////////////////////////////////////////////////////////
// function SaveGridSetInfoToBase(mCxGridView: TcxGridDBTableView;
// ADOCmd: TADOQuery; designCode: string): Boolean;
// var
// i: integer;
// mfieldName: string;
// begin
// result := false;
//
// try
// with ADOCmd do
// begin
// close;
// sql.Clear;
// sql.Add('select * from SD_FormGrid_Design');
// sql.Add('where designCode=' + quotedStr(designCode));
// open;
//
// for i := mCxGridView.ColumnCount - 1 downto 0 do
// begin
// mfieldName := TcxGridDBColumn(mCxGridView.Columns[i])
// .DataBinding.FieldName;
//
// if locate('fieldName', mfieldName, []) then
// begin
// // Edit  ;
// continue;
// end
// else
// begin
//
// Append;
// fieldByName('designCode').value := designCode;
//
// fieldByName('ColumnName').value := mCxGridView.Columns[i].Name;
// fieldByName('oldCaption').value := mCxGridView.Columns[i].Caption;
// fieldByName('ColumnLock').value := 0;
// fieldByName('ColumnHide').value := mCxGridView.Columns[i].Hidden;
// fieldByName('ColumnOrder').value := mCxGridView.Columns[i].SortOrder;
// fieldByName('Visible').value := mCxGridView.Columns[i].Visible;
//
// fieldByName('Valid').value := 1;
// end;
//
// fieldByName('FieldName').value :=
// trim(TcxGridDBColumn(mCxGridView.Columns[i]).DataBinding.FieldName);
// fieldByName('Caption').value := mCxGridView.Columns[i].Caption;
// fieldByName('ColumnType').value :=
// trim(TcxGridDBColumn(mCxGridView.Columns[i]).DataBinding.ValueType);
//
// if mCxGridView.Columns[i].FixedKind = fkLeftDynamic then
// begin
// fieldByName('fixColumn').value := True;
// end
// else
// begin
// fieldByName('fixColumn').value := false;
// end;
//
// fieldByName('Width').value := mCxGridView.Columns[i].Width;
//
// if mCxGridView.Columns[i].Tag=9 then
// begin
// fieldByName('mustIn').value := true;
// end
// else
// begin
// fieldByName('mustIn').value := false;
// end;
// fieldByName('IsOrder').value := 1;
//
// Post;
// end;
//
// end;
//
// /// /////////////////////////////////////////////
// //
// for i := 0 to mCxGridView.DataController.DataSet.FieldCount - 1 do
// begin
// mfieldName := trim(mCxGridView.DataController.DataSet.Fields[i]
// .FieldName);
// if mfieldName = '' then
// continue;
// with ADOCmd do
// begin
// close;
// sql.Clear;
// sql.Add('select * from SD_FormGrid_Design');
// sql.Add('where designcode=' + quotedStr(designCode));
// sql.Add('and fieldName=' + quotedStr(mfieldName));
// open;
// if RecordCount <= 0 then
// begin
// Append;
// fieldByName('designcode').value := designCode;
// fieldByName('fieldName').value := mfieldName;
// fieldByName('Caption').value := '���';
// fieldByName('ColumnName').value := mCxGridView.Name + mfieldName;
// fieldByName('Visible').value := false;
// fieldByName('AddFlag').value := True;
// fieldByName('Width').value := 60;
// fieldByName('ColumnOrder').value := 99;
//
// fieldByName('Valid').value := 0;
// Post;
//
// end;
// end;
// end;
// result := True;
// except
// Application.MessageBox('������Ϣʱ��������', '��ʾ��Ϣ', 0);
// end;
// end;

//
/// ////////////////////////////////////////////////////////
// �������ܣ���̬����CxGrid��
/// ////////////////////////////////////////////////////////
procedure CreateCxGridColumn( tv1: TcxGridDBTableView;
  ADOQueryTmp: TADOQuery; pdesignCode: PWideChar);
var
  ADBColumn: TcxGridDBColumn;
  strField, strCaption: string;
  mColumnName: string;
  mCalcWidth: integer;
  mWidth: integer;
  mAvgWidth, mGridWidth: integer;
  HeaderStyle: TcxStyle;
  footsumitem:tcxdatasummaryitem;
  mdesignCode:string;
begin mWidth := 12;
  mGridWidth := TcxGrid(TcxGridLevel(tv1.level).Control).Width;
  mdesignCode:=pdesignCode ;
  with ADOQueryTmp do begin close;
      sql.Clear;
      sql.Add('select A.* ');
      sql.Add('from SD_FormGrid_Design A');
      sql.Add('where A.designCode=' + quotedStr(mdesignCode));
      open;
      if IsEmpty then
       exit;
  end;
  try

    HeaderStyle := TcxStyle.Create(nil);
   // HeaderStyle.Font := TcxGrid(TcxGridLevel(tv1.level).Control).Font;
    HeaderStyle.TextColor := clBlue;
    tv1.BeginUpdate;

    // CreateCxGridColumn_A(application,tv1,ADOQueryTmp,mdesignCode);

    with ADOQueryTmp do
    begin
      First;
      while not Eof do
      begin
         if trim(fieldByName('fieldName').AsString)='' then
          begin
             Next;
            continue;
          end;
//          if lowercase(trim(fieldByName('fieldName').AsString))='batchno' then
//          begin
//          end;
          ADBColumn := tv1.GetColumnByFieldName (trim(ADOQueryTmp.fieldByName('fieldName').AsString));
        if ADBColumn <> nil then begin
          if (ADBColumn.Styles.Header<>nil) and (ADBColumn.Styles.Header.Font.Size<>gFontSize) then
              ADBColumn.Styles.Header.Font.Size:= gFontSize ;
          // ���ϲ���ʾ
          if not fieldByName('valid').AsBoolean then
          begin
            ADBColumn.Visible := false;
            ADBColumn.Hidden := True;
            Next;
            continue;
          end;

          ADBColumn.Name := trim(tv1.Name) + trim(ADOQueryTmp.fieldByName('fieldName').AsString);

          if fieldByName('fixColumn').AsBoolean then
          begin
              ADBColumn.FixedKind := fkLeftDynamic;
          end
          else begin ADBColumn.FixedKind := fkNone;
          end;
          if fieldByName('mustIn').AsBoolean then
          begin
            ADBColumn.Tag := 9;
          end;
          if ADBColumn.Tag = 9 then
            ADBColumn.Styles.Header := HeaderStyle;
          ADBColumn.Hidden := fieldByName('ColumnHide').AsBoolean;
          if ADBColumn.Hidden and (not fieldByName('Visible').AsBoolean) then
          begin
            ADBColumn.Visible := false;
          end else
          begin
           ADBColumn.Visible := fieldByName('Visible').AsBoolean;
          end;
         /// ����������
         ///
          if (trim(ADOQueryTmp.fieldByName('FooterType').AsString)<>'') and (ADBColumn.Summary.FooterKind=skNone) then
          begin
            footsumitem:=tv1.DataController.Summary.FooterSummaryItems.Add;
            footsumitem.ItemLink:= ADBColumn ;
            if (trim(fieldByName('FooterType').AsString)='sum') or (trim(fieldByName('FooterType').AsString)='�ϼ�') then
            begin
              footsumitem.Kind:=skSum;
            end;
            if (trim(fieldByName('FooterType').AsString)='count')or (trim(fieldByName('FooterType').AsString)='��')  then
            begin
              footsumitem.Kind:=skCount;
            end;
           // footsumitem.Format:='#';
            footsumitem.Position:=spFooter;
          end
          else
          begin
          //  ADBColumn.Summary.FooterKind:=skNone  ;
          end;
          /////////////
          ADBColumn.Caption := trim(fieldByName('caption').AsString);
          // ADBColumn.Options.Editing := not fieldByName('ReadOnly').AsBoolean;
          //   ADBColumn.Options.Focusing := not fieldByName('ReadOnly').AsBoolean;
          Next;
          continue;
        end;
        //
        if not fieldByName('valid').AsBoolean then
        begin
          ADOQueryTmp.Next;
          continue;
        end;
        // �ж����Ƿ��Ѵ���
        mColumnName := trim(tv1.Name) + trim(fieldByName('fieldName').AsString);
        if tv1.FindItemByName(mColumnName) <> nil then
        begin
          ADOQueryTmp.Next;
          continue;
        end;
        ////////////////////////////�´���////////////////////////////////
        // �µ���
        ADBColumn := tv1.CreateColumn;
        ADBColumn.DataBinding.FieldName :=
          trim(fieldByName('fieldName').AsString);

        ADBColumn.Caption := trim(fieldByName('Caption').AsString);

        // ����

        ADBColumn.Width := fieldByName('width').AsInteger;
        if fieldByName('fixColumn').AsBoolean then
        begin
            ADBColumn.FixedKind := fkLeftDynamic;
        end;
        //
        if fieldByName('mustIn').AsBoolean then
        begin
          ADBColumn.Tag := 9;
        end;

        ADBColumn.Visible := fieldByName('visible').AsBoolean;
        // ADBColumn.Hidden := fieldByName('ColumnHide').AsBoolean;
        ADBColumn.HeaderAlignmentHorz := taCenter;
       // ADBColumn.MinWidth := 50;
        ADBColumn.Name := mColumnName;

        ADBColumn.Options.Editing := not fieldByName('ReadOnly').AsBoolean;
        ADBColumn.Options.Focusing := not fieldByName('ReadOnly').AsBoolean;
        /// /////////////
        /// ����������
        ///
        if (trim(ADOQueryTmp.fieldByName('FooterType').AsString)<>'') then
        begin
            footsumitem:=tv1.DataController.Summary.FooterSummaryItems.Add;
            footsumitem.ItemLink:= ADBColumn ;
            if (trim(fieldByName('FooterType').AsString)='sum') or (trim(fieldByName('FooterType').AsString)='�ϼ�') then
            begin
              footsumitem.Kind:=skSum;
            end;
            if (trim(fieldByName('FooterType').AsString)='count') or (trim(fieldByName('FooterType').AsString)='��')  then
            begin
              footsumitem.Kind:=skCount;
            end;
           // footsumitem.Format:='#';
            footsumitem.Position:=spFooter;

        end;


        ADOQueryTmp.Next;

      end;

      close;
    end;
  finally

    tv1.EndUpdate;
  end;
end;

// ������ѯloyout
// procedure createFindLayout(dxLayoutControl1: TdxLayoutControl;
// ADOTmp: TADOQuery; mdesignCode: string);
// var
// LayoutItem: TdxLayoutItem;
// cxTextEdit: TcxTextEdit;
// i: integer;
// begin
// with ADOTmp do
// begin
// close;
// sql.Clear;
// sql.Add('select A.* ');
// sql.Add('from SD_FormGrid_Design A');
// sql.Add('where A.designCode=' + quotedStr(mdesignCode));
// sql.Add('and (A.columnQuery=1 or A.ColumnFilter=1)');
// sql.Add('and A.valid=1');
// open;
//
// while not Eof do
// begin
// cxTextEdit := TcxTextEdit.Create(nil);
// cxTextEdit.Name := trim(fieldByName('fieldName').AsString);
// cxTextEdit.Text := '';
// cxTextEdit.Tag := 2;
//
// if (dxLayoutControl1.FindComponent('layitem' +
// trim(fieldByName('fieldName').AsString)) = nil) and
// (dxLayoutControl1.FindItem(cxTextEdit) = nil) then
// begin
// LayoutItem := dxLayoutControl1.CreateItemForControl(cxTextEdit, nil);
// LayoutItem.Name := 'layitem' + trim(fieldByName('fieldName').AsString);
// LayoutItem.CaptionOptions.Text := trim(fieldByName('caption').AsString);
// LayoutItem.Control := cxTextEdit;
//
// LayoutItem.SizeOptions.SizableHorz := True;
// LayoutItem.SizeOptions.SizableVert := True;
// end;
// Next;
// end;
//
// end;
// end;

//
function checkColumnMustIn(app: TApplication; tv1: TcxGridDBTableView;
  mFlag: integer): Boolean;
var
  i: integer;
  client1: TClientDataSet;
begin client1 := TClientDataSet.Create(nil);
  try
    client1.FieldDefs.Add('fieldName', ftString, 100);
    client1.FieldDefs.Add('caption', ftString, 100);
    client1.FieldDefs.Add('ValueType', ftString, 100);
    client1.FieldDefs.Add('fieldValue', ftString, 100);
    client1.CreateDataSet;
    getColumnRelation(tv1, client1);
    Result := checkColumnMustIn_A(app, tv1, client1, mFlag);

  finally
    client1.Free;
  end;

end;

/// //////////////////////////////////////////////////////////////
///
procedure getColumnRelation(tv1: TcxGridDBTableView; client1: TClientDataSet);
var
  i: integer;
begin

    client1.EmptyDataSet;

  for i := 0 to tv1.ColumnCount - 1 do begin client1.Append;
    client1.fieldByName('fieldName').Value := tv1.Columns[i]
      .DataBinding.FieldName;
    client1.fieldByName('caption').Value := tv1.Columns[i].Caption;
    client1.fieldByName('ValueType').Value := tv1.Columns[i]
      .DataBinding.ValueType;
  end;

end;
 //////////////////////////////////////////////////
 ///    //
  function checkColumnMustIn_A(app:TApplication;tv1: TcxGridDBTableView;client1:TClientDataSet; mFlag: integer): Boolean;
  var
    i: integer;
    mfieldName:string;
  begin
    result:=false;
    for i := 0 to tv1.ColumnCount-1 do
    begin
     // ADBColumn :=TcxGridDBColumn( tv1.Columns[i] );
      if tv1.Columns[i].Tag = mFlag then
      begin
        with tv1.DataController.DataSet do                //
        begin
          if not client1.Locate('caption',tv1.Columns[i].Caption,[]) then Continue;
          if tv1.Columns[i].DataBinding.Field.DataType<>ftString then Continue ;
          mfieldName :=trim( client1.FieldByName('fieldName').AsString);
          if locate( mfieldName, null, []) or locate( mfieldName, '', []) then
          begin
            Application.MessageBox(PChar(tv1.Columns[i].Caption + '����Ϊ��!'), '��ʾ', 0);
            exit;
          end;
        end;
      end;
    end;
    result:=true;
  end;

///////////////////////////////////



 //////////////////////////////////////////////////
 ///  /// ////////////////////////////////////////////////////////////////////
// �����������Ϣ
/// ///////////////////////////////////////////////////////////////////////
function SaveGridSetInfoToBase(mCxGridView: TcxGridDBTableView; client1:TClientDataSet;
  ADOCmd: TADOQuery; designCode: string): Boolean;
var
  i: integer;
  mfieldName: string;
begin
  result := false;

  try

    ADOCmd.close;
   // ADOCmd.LockType := ltBatchOptimistic;
    with ADOCmd do
    begin
      close;
      sql.Clear;
      sql.Add('select * from SD_FormGrid_Design');
      sql.Add('where designCode=' + quotedStr(designCode));
      open;

      for i := mCxGridView.ColumnCount - 1 downto 0 do
      begin
        if not client1.Locate('caption',mCxGridView.Columns[i].Caption,[]) then Continue;
        mfieldName :=trim( client1.FieldByName('fieldName').AsString);

        if locate('fieldName', mfieldName, []) then
        begin
          continue;
        end
        else
        begin

          Append;
          fieldByName('designCode').value := designCode;

          fieldByName('ColumnName').value := mCxGridView.Columns[i].Name;
          fieldByName('oldCaption').value := mCxGridView.Columns[i].Caption;
          fieldByName('ColumnLock').value := 0;
          fieldByName('ColumnHide').value := mCxGridView.Columns[i].Hidden;
          fieldByName('readonly').value := not mCxGridView.Columns[i].Options.Editing;
          fieldByName('ColumnOrder').value := mCxGridView.Columns[i].SortOrder;
          fieldByName('Visible').value := mCxGridView.Columns[i].Visible;

          fieldByName('Valid').value := 1;
        end;

        fieldByName('FieldName').value :=mfieldName;
        fieldByName('Caption').value := mCxGridView.Columns[i].Caption;
        fieldByName('ColumnType').value :=trim( client1.FieldByName('valueType').AsString);

        if mCxGridView.Columns[i].FixedKind = fkLeftDynamic then
        begin
          fieldByName('fixColumn').value := True;
        end
        else
        begin
          fieldByName('fixColumn').value := false;
        end;

        fieldByName('Width').value := mCxGridView.Columns[i].Width;

        if mCxGridView.Columns[i].Tag=9 then
        begin
           fieldByName('mustIn').value := true;
        end
        else
        begin
          fieldByName('mustIn').value := false;
        end;
        fieldByName('IsOrder').value := 1;


        Post;
      end;

    end;
     ADOCmd.UpdateBatch();
    /// /////////////////////////////////////////////
    //
    for i := 0 to mCxGridView.DataController.DataSet.FieldCount - 1 do
    begin
      mfieldName := trim(mCxGridView.DataController.DataSet.Fields[i].FieldName);
      if mfieldName = '' then
        continue;
      with ADOCmd do
      begin
        close;
        sql.Clear;
        sql.Add('select * from SD_FormGrid_Design');
        sql.Add('where designcode=' + quotedStr(designCode));
        sql.Add('and fieldName=' + quotedStr(mfieldName));
        open;
        if RecordCount <= 0 then
        begin
          Append;
          fieldByName('designcode').value := designCode;
          fieldByName('fieldName').value := mfieldName;
          fieldByName('Caption').value := '���';
          fieldByName('ColumnName').value := mCxGridView.Name + mfieldName;
          if (mCxGridView.DataController.DataSet.Fields[i].DataType=ftString) or (mCxGridView.DataController.DataSet.Fields[i].DataType=ftWideString) then
           fieldByName('ColumnType').value :='String'
          else if  (mCxGridView.DataController.DataSet.Fields[i].DataType=ftInteger) or (mCxGridView.DataController.DataSet.Fields[i].DataType=ftSmallInt) then
            fieldByName('ColumnType').value :='Integer'
          else if  (mCxGridView.DataController.DataSet.Fields[i].DataType=ftFloat) or (mCxGridView.DataController.DataSet.Fields[i].DataType=ftBcd) then
            fieldByName('ColumnType').value :='Float'
          else if  mCxGridView.DataController.DataSet.Fields[i].DataType=ftDateTime  then
            fieldByName('ColumnType').value :='DateTime'
          else if  mCxGridView.DataController.DataSet.Fields[i].DataType=ftBoolean  then
            fieldByName('ColumnType').value :='Boolean'
          else
            fieldByName('ColumnType').value :=TFieldType( mCxGridView.DataController.DataSet.Fields[i].DataType);

          if fields.FindField('fieldValue')<>nil then
            fieldByName('fieldValue').value :=mCxGridView.DataController.DataSet.Fields[i].Value;
          fieldByName('Visible').value := false;
          fieldByName('AddFlag').value := True;
          fieldByName('Width').value := 60;
          fieldByName('ColumnOrder').value := 99;
          fieldByName('Valid').value := 0;
          Post;

        end
        else
        begin
          edit;
          if fields.FindField('fieldValue')<>nil then
            fieldByName('fieldValue').value :=mCxGridView.DataController.DataSet.Fields[i].Value;
          post;
        end;
      end;
    end;
    ADOCmd.UpdateBatch();

    ////////////////////////////////////////////
    ///�����ֶ�ֵ

    ADOCmd.close;
    ADOCmd.LockType:=ltOptimistic ;
    result := True;
  except
     ADOCmd.close;
    ADOCmd.LockType:=ltOptimistic ;
    Application.MessageBox('������Ϣʱ��������', '��ʾ��Ϣ', 0);
  end;
end;

///////////////////////////

procedure ShowCxGridDesign(application: TApplication;
  mCxGridView: TcxGridDBTableView; client1: TClientDataSet; ADOCmd: TADOQuery;
  mFormName: string; mGridName: string; mDllName: string;mFormId: integer; mGridType: integer = 0;mProcedureName: string='');
type
  TMyFunc = function(App: Tapplication; FormH: hwnd; FormID: integer;
    UID: String; UName: String; dataBase: string; Title: string; Def1: string;
    Def2: string): hwnd; stdcall;
var
  Tf: TMyFunc;
  Tp: TFarProc;
  Th: Thandle;
  newh: hwnd;
  mdesignCode: string;
begin

    mdesignCode := mDllName +'|'+mFormName+ '|' + intTostr(mFormId) + '|' + mGridName;
       ///////////////////
    if mProcedureName<>'' then
    begin
      with  ADOCmd do
      begin
        close;
        sql.Clear ;
        sql.Add('select * from SD_FormGrid_Main A');
        sql.Add('where A.designCode='+quotedStr(mdesignCode));
        Open;
        if RecordCount<=0 then
        begin
          append;
          fieldByName('designCode').Value :=mdesignCode;
          fieldByName('gridName').Value :=mGridName;
          fieldByName('ProcedureParam').Value :='';
        end
        else
          edit;


        fieldByName('newProcedureName').Value :=trim(mProcedureName);
        post;

      end;
    end;
    /// ////////////////////////////////////////
    // ���浱ǰ�ؼ���Ϣ
    if not SaveGridSetInfoToBase(mCxGridView,client1, ADOCmd, mdesignCode) then
    begin
      exit;
    end;


  /// ////////////////////////////////////////
  //
  Th := LoadLibrary('rtDesign.dll');
  if Th > 0 then
  begin
    try
      Tp := GetProcAddress(Th, 'GetDllForm');
      if Tp <> nil then
      begin
        Tf := TMyFunc(Tp);
        newh := Tf(Application, 0, 2, PChar(gUserId), PChar(gUserName),
          PChar(ADOCmd.Connection.ConnectionString), PChar('�������'), PChar(mdesignCode), PChar(''));
      end
      else
      begin
        ShowMessage('����rtDesign.dllʱ��������!');
      end;
    finally
      // FreeLibrary();
    end;
  end
  else
  begin
    ShowMessage('�Ҳ���rtDesign.dll');
  end;

 end;
end.