DbGrid ou StringGrid - Alteração nas posição das linhas

Delphi

16/06/2016

Olá pessoal, estou desenvolvendo um sistema no Delphi e em um dos Form possui uma DbGrid na qual apresenta trabalhos que serão executado. A questão é, nessa Grid eu preciso que seja reordenado conforme a necessidade do cliente a posição de cada trabalho a ser executado. Ou seja, preciso clicar e arrastar uma linha do DbGrid para trocar de posição fazendo assim uma ordem de posição de trabalho. Se possível. não quero usar opção de por dois botão um pra cima e outro pra baixo pra poder mudar de posição, só se for em ultimo caso. Se no DbGrid isso não for possivel, então gostaria de usar o StringGrid, ela permite que possa ser feito a alteração das posição das linhas, mas como eu faria para apresentar os registros do banco de dado nessa StringGrid, sei que seria meio que na unha, mas qual seria o código exato pra fazer isso?
Ex.:
Tabela - Posição Inicial Tabela - Posição Final
N. OP.........Cliente ..............................................N.OP.........Cliente
1023..........cliente001..........................................1010..........cliente003
1203..........cliente002..........................................1203..........cliente002
1010..........cliente003..........................................1008..........cliente005
1003..........cliente004..........................................1023..........cliente001
1008..........cliente005..........................................1003..........cliente004

Notem q a posição da segunda tabela está reordenado conforme a necessidade que o cliente queira, preciso fazer essa alteração na Grid e por mais que eu pesquise, não consigo achar solução clara pra isso. Desde já agradeço a todos.
Valdenir Furlanetto

Valdenir Furlanetto

Curtidas 0

Melhor post

Valdenir Furlanetto

Valdenir Furlanetto

27/06/2016

Rafa, muito bom seu exemplo, apesar que vou levar um tempinho pra assimilar tudo isso, mas pelo pouco q estive analisando, está perfeito. Vc apenas não está só me ajundando mas como está tirando dúvida de muitas pessoas. Esse tipo de exemplo relacionado ao tópico que abri, por mais que procure e pesquise na web, vc não encontra nada, com tanta clareza. Vlw irmão, vou estudar ele aqui, qualquer coisa eu posto o resultado aqui.
GOSTEI 1

Mais Respostas

Valdenir Furlanetto

Valdenir Furlanetto

16/06/2016

Alguém? ninguém tem uma idéia?
GOSTEI 0
Rafael Santos

Rafael Santos

16/06/2016

Boa tarde.

Fiz uma função genérica recentemente para esse tipo de problema e por coincidência por Usuário :D
vou mandar a função com um overland para servir tanto para o TDBGrid quanto para o TXDBGrid.

Esse código serve para ordenar as colunas em tempo de execução, gravar a posição das colunas por usuários, gravar o index, a ordenação... etc
Gravo o um ini do usuário em uma tabela do banco para saber a ultima posição dele.. a procedure está comentada, creio que possa te ajudar bastante.

Segue o Código. Duvidas, estou a disposição.

declaração das Procedures
procedure GravaEOrdenaGridGenerico(pFuncao:Integer;                         // 1 =  GRAVAR / 2 = FORMSHOW / 3 = FORMACTIVE
                                   pTela:String;                            // Tela da Alteração Ex: CGSDocumentosDeServico
                                   pGrid:TXDBGrid;                          // Grid que será usado
                                   pDataSource : TDataSource;               // DataSource associado ao Grid.
                                   pPossuiCampoMarcar:Boolean = False;      // Se possui o campo Marcar no Grid.
                                   pIndexColunaDoCampoMarcar:Integer = 0;   // Index da columa marcar
                                   pExpanded:Boolean = False); overload;    // Grid com Expanded (Agrupamento de Colunas)

//Overload da função GravaEOrdenaGridGenerico de XDbGrid para funcionar tbm com DbGrid Comum
procedure GravaEOrdenaGridGenerico(pFuncao:Integer;                         // 1 =  GRAVAR / 2 = FORMSHOW / 3 = FORMACTIVE
                                   pTela:String;                            // Tela da Alteração Ex: CGSDocumentosDeServico
                                   pGrid:TDBGrid;                          // Grid que será usado
                                   pDataSource : TDataSource;               // DataSource associado ao Grid.
                                   pPossuiCampoMarcar:Boolean = False;      // Se possui o campo Marcar no Grid.
                                   pIndexColunaDoCampoMarcar:Integer = 0); overload;  // Index da columa marcar


Escopo do código:

procedure GravaEOrdenaGridGenerico(pFuncao:Integer;                         // 1 =  GRAVAR / 2 = FORMSHOW / 3 = FORMACTIVE
                                   pTela:String;                            // Tela da Alteração Ex: CGSDocumentosDeServico
                                   pGrid:TXDBGrid;                          // Grid que será usado
                                   pDataSource : TDataSource;               // DataSource associado ao Grid.
                                   pPossuiCampoMarcar:Boolean = False;      // Se possui o campo Marcar no Grid.
                                   pIndexColunaDoCampoMarcar:Integer = 0;   // Index da columa marcar
                                   pExpanded:Boolean = False);              // Grid com Expanded (Agrupamento de Colunas)
var RxConfiguraGridDefault : TRxMemoryData;
    RxConfiguraGrid        : TRxMemoryData;
    I                      : Integer;
    vTamanho               : Integer;
    vCont                  : Integer;

  Procedure AtribuiPropriedadesMarcar;
  var vCont        : Integer;
      vIndexMarcar : Integer;
  Begin
    vIndexMarcar := 0;
    For vCont:=0 To pGrid.Columns.Count -1 Do
    Begin
      If pGrid.Columns[vcont].FieldName = 'MARCAR' Then
      Begin
        vIndexMarcar := vCont;
        Break;
      End
    End;
    pGrid.Columns[vIndexMarcar].CharCase       := ecNormal;
    pGrid.Columns[vIndexMarcar].CheckBox       := True;
    pGrid.Columns[vIndexMarcar].CheckBoxKind   := ckCheck;
    pGrid.Columns[vIndexMarcar].CheckBoxStyle  := cbAuto;
    pGrid.Columns[vIndexMarcar].CheckBoxToggle := ctSelectClick;
    pGrid.Columns[vIndexMarcar].CheckBoxValues := 'S;N';
  End;

  procedure ConfiguraOrdenacao;
  var vcampo, vPosCampo, vTamanho : String;
      vPosicao, vCont : Integer;
      vQrAuxiliar : TQuery;
      vValidaPorPosicao : Boolean;
    Procedure PopulaExapanded;
    var vCont: Integer;
    Begin
      vCont :=0;
      If pExpanded Then
      Begin
        RxConfiguraGrid.First;
        While Not RxConfiguraGrid.Eof do
        Begin
          if (pGrid.Columns[vcont].Title.Caption = RxConfiguraGrid.FieldByName('TITULO').AsString) And
             (RxConfiguraGrid.FieldByName('EXPANDCOLS').asInteger > 0 ) Then
            pGrid.Columns[vcont].ExpandCols := RxConfiguraGrid.FieldByName('EXPANDCOLS').asInteger;
          inc(vCont);
          RxConfiguraGrid.Next
        end;
        RxConfiguraGrid.EmptyTable;
      End;
    end;
  Begin

    pGrid.DataSource := nil;

    RxConfiguraGrid.Close;
    RxConfiguraGrid.EmptyTable;
    RxConfiguraGrid.Open;

    RxConfiguraGrid.LoadFromDataSet(RxConfiguraGridDefault,0,lmCopy);

    vPosCampo := '';

    vQrAuxiliar := TQuery.Create(nil);
    vQrAuxiliar.DatabaseName := cDatabaseName;

    For vCont:= 0 To pGrid.Columns.Count-1 do
    begin
      vcampo := LeArqIni(vcUsuario+'/'+pTela+'Campo', FormatFloat('00',vCont));

      If (vCampo <>'') and RxConfiguraGrid.Locate('CAMPO',vcampo,[]) Then
      begin
        vPosCampo := vPosCampo + vCampo+'|';
        Try
          vTamanho := LeArqIni(vcUsuario+'/'+pTela+'Tamanho', FormatFloat('00',vCont));

          StrToInt(vTamanho);
        Except
          vTamanho := '0';
        End;

        If StrToInt(vTamanho) < 20 Then vTamanho := '20';

        If RxConfiguraGrid.Locate('CAMPO',vCampo,[]) Then
        Begin
          RxConfiguraGrid.Edit;
          RxConfiguraGrid.FieldByName('TAMANHO').asInteger := StrToInt(vTamanho);
          RxConfiguraGrid.FieldByName('COLUNA' ).asInteger := vCont;
          RxConfiguraGrid.Post;
        End;
      end;
    end;

    pGrid.Columns.clear;

    RxConfiguraGrid.SortOnFields('COLUNA');
    RxConfiguraGrid.First;

    vcont := -1;
    vValidaPorPosicao := False;
    While Not RxConfiguraGrid.Eof do
    Begin
      vPosicao := Pos(RxConfiguraGrid.FieldByName('CAMPO').asstring+'|', vPosCampo);

      If (vPosicao > 0) Then
      Begin
        pGrid.Columns.Add;
        Inc(vcont);
        pGrid.Columns[vcont].FieldName     := RxConfiguraGrid.FieldByName('CAMPO').asstring;
        pGrid.Columns[vcont].Title.Caption := RxConfiguraGrid.FieldByName('TITULO').asstring;
        pGrid.Columns[vcont].Width         := RxConfiguraGrid.FieldByName('TAMANHO').asInteger;
        //pGrid.Columns[vcont].ExpandCols    := RxConfiguraGrid.FieldByName('EXPANDCOLS').asInteger;
        Delete(vPosCampo,vPosicao,Length(RxConfiguraGrid.FieldByName('CAMPO').asstring)+1);
        If pExpanded Then
        Begin
          RxConfiguraGrid.Next;
          vValidaPorPosicao := True;
        End
        Else
          RxConfiguraGrid.Delete;
      End
      Else
        RxConfiguraGrid.Next;
    End;

    If vValidaPorPosicao Then
      PopulaExapanded;

    if pPossuiCampoMarcar Then
      AtribuiPropriedadesMarcar;

    { Caso alguma coluna seja adicionada mais tarde, irá para o final da coluna }
    RxConfiguraGrid.First;

    While Not RxConfiguraGrid.Eof do
    Begin
      Inc(vcont);
      pGrid.Columns.Add;
      pGrid.Columns[vcont].FieldName     := RxConfiguraGrid.FieldByName('CAMPO').AsString;
      pGrid.Columns[vcont].Title.Caption := RxConfiguraGrid.FieldByName('TITULO').AsString;
      pGrid.Columns[vcont].Width         := RxConfiguraGrid.FieldByName('TAMANHO').AsInteger;
      pGrid.Columns[vcont].ExpandCols    := RxConfiguraGrid.FieldByName('EXPANDCOLS').asInteger;
      If pExpanded Then
        RxConfiguraGrid.Next
      Else
        RxConfiguraGrid.Delete;
    end;

    If Not(RxConfiguraGrid.IsEmpty) Then
      PopulaExapanded;

    FreeAndNil(vQrAuxiliar);

    pGrid.DataSource := pDataSource;
    If pPossuiCampoMarcar Then
      AtribuiPropriedadesMarcar;
  end;

  Procedure AdicionaCamposNaRx;
  var vQry : TQuery;
  begin
    vQry := TQuery.Create(nil);
    vQry.DatabaseName := cDataBaseName;

    With vQry do
    begin
      Close;
      Sql.Clear;

      Sql.Add(' SELECT LPAD('' '', 50, '' '') CAMPO   ');
      Sql.Add('      , LPAD('' '', 50, '' '') TITULO  ');
      Sql.Add('      , 0    TAMANHO                   ');
      Sql.Add('      , 0    COLUNA                    ');
      Sql.Add('      , 0    EXPANDCOLS                ');
      Sql.Add('   FROM DUAL                           ');
      AbrirQuery(vQry);

      If RxConfiguraGridDefault.Fields.Count = 0 Then
        RxConfiguraGridDefault.CopyStructure(vQry);
      RxConfiguraGridDefault.Open;
      //RxConfiguraGridDefault.LoadFromDataSet(vQry,0,LmCopy);

      If RxConfiguraGrid.Fields.Count = 0 Then
        RxConfiguraGrid.CopyStructure(vQry);
      RxConfiguraGrid.Open;
      //RxConfiguraGrid.LoadFromDataSet(vQry,0,LmCopy);
    end;
    FreeAndNil(vQry);
  end;

  Function CarregandoDadosGrid(Rx: TRxMemoryData; Grid: TXDBGrid): TRxMemoryData;
  Var vcont : Integer;
  Begin
    Rx.close;
    Rx.Open;

    For vCont := 0 To Grid.Columns.Count -1 Do
    Begin
      Rx.Append;
      Rx.FieldByName('CAMPO'     ).asstring  := Grid.Columns[vcont].FieldName;
      Rx.FieldByName('TITULO'    ).asstring  := Grid.Columns[vcont].Title.Caption;
      Rx.FieldByName('TAMANHO'   ).asInteger := Grid.Columns[vcont].Width;
      Rx.FieldByName('EXPANDCOLS').asInteger := Grid.Columns[vcont].ExpandCols;
      Rx.FieldByName('COLUNA'    ).asInteger := vCont;
      Rx.Post;
    End;
    Result := Rx;
  End;

  Procedure ConfiguraOrdernacaoGenerica(RxOrigem, RxDestino: TRxMemoryData; Grid: TXDBGrid);
  Begin
    //Carregando as configurações(Default) do Grid.
    If Assigned(RxOrigem) then
      RxOrigem := CarregandoDadosGrid( RxOrigem, pGrid );

    //Carregando as configurações do grid.
    If Assigned(RxOrigem) and Assigned(RxDestino) then
    Begin
      RxDestino.close;
      RxDestino.EmptyTable;
      RxDestino.Open;

      RxDestino.LoadFromDataSet( RxOrigem, 0, lmCopy );
      RxDestino := CarregandoDadosGrid( RxDestino, grid );
    End;
  End;

  Function LendoDB(Rx: TRxMemoryData; Grid: TXDBGrid): TRxMemoryData;
  Var
    vcont     : Integer;
    vTamanho  : Integer;
    vcampo    : String;
    vPosCampo : String;
  Begin
    For vcont:= 0 To Grid.Columns.Count-1 do
    begin
      Try
        vcampo := LeArqIni(vcUsuario+'/'+pTela+'SelecCampo', FormatFloat('00',vcont));

        If (vcampo <> '') and Rx.Locate('CAMPO', vcampo,[]) then
        Begin
          Try
            vTamanho := StrToInt(LeArqIni(vcUsuario+'/'+pTela+'SelecTam', FormatFloat('00',vCont)));
          Except
            vTamanho := 20;
          End;

          Rx.Edit;
          Rx.FieldByName('TAMANHO').asInteger := vTamanho;
          Rx.FieldByName('COLUNA' ).asInteger := vcont;
          Rx.Post;
        End;

      Except
      End;
    end;
    Result := Rx;
  end;

  procedure AtualizaGrid(Rx: TRxMemoryData; Grid: TXDBGrid);
  Var vcont : Integer;
  begin
    Rx.First;
    While not rx.eof do
    Begin
      vcont := Rx.FieldByName('COLUNA').AsInteger;
      Grid.Columns[vcont].FieldName     := Rx.FieldByName('CAMPO'  ).AsString;
      Grid.Columns[vcont].Title.Caption := Rx.FieldByName('TITULO' ).AsString;
      Grid.Columns[vcont].Width         := Rx.FieldByName('TAMANHO').AsInteger;
      Grid.Columns[vcont].ExpandCols    := Rx.FieldByName('EXPANDCOLS').AsInteger;
      Grid.Columns[vcont].Expanded      := Rx.FieldByName('EXPANDCOLS').AsInteger <> 0;
      rx.Next;
    End;
  end;

  Procedure GravaOrdenacao;
  Var vcont : Integer;
  Begin
    If Not vcDatabase.InTransaction then
      vcDatabase.StartTransaction;

    For vcont:=0 to pGrid.Columns.count-1 do
    Begin
      GravaArqIni(vcUsuario+'/'+pTela+'Campo', FormatFloat('00',vcont),pGrid.Columns[vcont].FieldName);

      If pGrid.Columns[vcont].Width < 20 Then
        pGrid.Columns[vcont].Width := 20;

      GravaArqIni(vcUsuario+'/'+pTela+'Tamanho'   , FormatFloat('00',vcont),inttostr(pGrid.Columns[vcont].Width     ));
      GravaArqIni(vcUsuario+'/'+pTela+'SelecCampo', FormatFloat('00',vcont),         pGrid.Columns[vcont].FieldName  );
      GravaArqIni(vcUsuario+'/'+pTela+'SelecTam'  , FormatFloat('00',vcont),inttostr(pGrid.Columns[vcont].Width     ));
      GravaArqIni(vcUsuario+'/'+pTela+'Expandcols', FormatFloat('00',vcont),inttostr(pGrid.Columns[vcont].ExpandCols))
    End;
    If vcDatabase.InTransaction then
      vcDatabase.Commit;
  End;

  Function ValidaTituloParaCampo(pString : String) : String;
  var i : Integer; vAux : String;
  const vCaracteres : String = ' "‡ƒ!@#$%¨&*()-+=´[]~/;.,<>:?¿\|^`ºª°¹²³£¢¬§''';
  begin
    For i := 1 to Length(pString) do
    begin
      If Pos(pString[i],vCaracteres) = 0 then
        vAux := vAux + pString[i];
    end;
    Result := vAux;
  end;

  Procedure AtualizaCamposExpand;
  Begin
    RxConfiguraGridDefault.First;
    While Not(RxConfiguraGridDefault.Eof) Do
    Begin
      If (Trim(RxConfiguraGridDefault.FieldByName('CAMPO').asstring) = '') Then
      Begin
        RxConfiguraGridDefault.Edit;
        RxConfiguraGridDefault.FieldByName('CAMPO').asstring := RemoveAcentos(ValidaTituloParaCampo(RxConfiguraGridDefault.FieldByName('TITULO').asstring)) + '_Grid';
        RxConfiguraGridDefault.Post;
      End;
      RxConfiguraGridDefault.Next;
    End;
  End;

Begin

  ///////////////////
  // Rafael.Santos //
  ///////////////////

  RxConfiguraGridDefault := TRxMemoryData.Create(Nil);
  RxConfiguraGrid        := TRxMemoryData.Create(Nil);

  AdicionaCamposNaRx;
  If pFuncao = 1 Then  //GRAVAR
    GravaOrdenacao
  Else If pFuncao = 2 Then //FORMSHOW
  Begin 
    RxConfiguraGridDefault.close;
    RxConfiguraGridDefault.Open;
    For vCont:=0 To pGrid.Columns.Count -1 Do
    Begin
      RxConfiguraGridDefault.Append;
      RxConfiguraGridDefault.FieldByName('CAMPO'     ).asstring  := pGrid.Columns[vcont].FieldName;
      RxConfiguraGridDefault.FieldByName('TITULO'    ).asstring  := pGrid.Columns[vcont].Title.Caption;
      RxConfiguraGridDefault.FieldByName('TAMANHO'   ).asInteger := pGrid.Columns[vcont].Width;
      RxConfiguraGridDefault.FieldByName('EXPANDCOLS').asInteger := pGrid.Columns[vcont].ExpandCols;
      RxConfiguraGridDefault.FieldByName('COLUNA'    ).asInteger := vCont;
      RxConfiguraGridDefault.Post;
    End;

    If pExpanded Then
      AtualizaCamposExpand;
    ConfiguraOrdenacao;
    //AtualizaGrid( RxConfiguraGridDefault, pGrid);
  End
  Else If pFuncao = 3 Then //FORMACTIVE
  Begin
    ConfiguraOrdernacaoGenerica(RxConfiguraGridDefault, nil, pGrid);
    ConfiguraOrdernacaoGenerica(RxConfiguraGridDefault, RxConfiguraGrid, pGrid);
    RxConfiguraGrid := LendoDB(RxConfiguraGrid, pGrid);
    AtualizaGrid( RxConfiguraGrid, pGrid);
  End;

  FreeAndNil(RxConfiguraGridDefault);
  FreeAndNil(RxConfiguraGrid);
end;

//overload da função GravaEOrdenaGridGenerico de XDbGrid para funcionar tbm com DbGrid Comum
procedure GravaEOrdenaGridGenerico(pFuncao:Integer;                         // 1 =  GRAVAR / 2 = FORMSHOW / 3 = FORMACTIVE
                                   pTela:String;                            // Tela da Alteração Ex: CGSDocumentosDeServico
                                   pGrid:TDBGrid;                           // Grid que será usado
                                   pDataSource : TDataSource;               // DataSource associado ao Grid.
                                   pPossuiCampoMarcar:Boolean = False;      // Se possui o campo Marcar no Grid.
                                   pIndexColunaDoCampoMarcar:Integer = 0);  // Index da columa marcar
var RxConfiguraGridDefault : TRxMemoryData;
    RxConfiguraGrid        : TRxMemoryData;
    I                      : Integer;
    vTamanho               : Integer;
    vCont                  : Integer;

  Procedure AtribuiPropriedadesMarcar;
  Begin
  //Incompactivel com DBGrid comum
//    pGrid.Columns[pIndexColunaDoCampoMarcar].CharCase       := ecNormal;
//    pGrid.Columns[pIndexColunaDoCampoMarcar].CheckBox       := True;
//    pGrid.Columns[pIndexColunaDoCampoMarcar].CheckBoxKind   := ckCheck;
//    pGrid.Columns[pIndexColunaDoCampoMarcar].CheckBoxStyle  := cbAuto;
//    pGrid.Columns[pIndexColunaDoCampoMarcar].CheckBoxToggle := ctSelectClick;
//    pGrid.Columns[pIndexColunaDoCampoMarcar].CheckBoxValues := 'S;N';
  End;

  procedure ConfiguraOrdenacao;
  var vcampo, vPosCampo, vTamanho : String;
      vPosicao, vCont : Integer;
      vQrAuxiliar : TQuery;
  Begin

    pGrid.DataSource := nil;

    RxConfiguraGrid.Close;
    RxConfiguraGrid.EmptyTable;
    RxConfiguraGrid.Open;

    RxConfiguraGrid.LoadFromDataSet(RxConfiguraGridDefault,0,lmCopy);

    vPosCampo := '';

    vQrAuxiliar := TQuery.Create(nil);
    vQrAuxiliar.DatabaseName := cDatabaseName;

    For vCont:= 0 To pGrid.Columns.Count-1 do
    begin
      vcampo := LeArqIni(vcUsuario+'/'+pTela+'Campo', FormatFloat('00',vCont));

      If (vCampo <>'') and RxConfiguraGrid.Locate('CAMPO',vcampo,[]) Then
      begin
        vPosCampo := vPosCampo + vCampo+'|';
        Try
          vTamanho := LeArqIni(vcUsuario+'/'+pTela+'Tamanho', FormatFloat('00',vCont));

          StrToInt(vTamanho);
        Except
          vTamanho := '0';
        End;

        If StrToInt(vTamanho) < 20 Then vTamanho := '20';

        If RxConfiguraGrid.Locate('CAMPO',vCampo,[]) Then
        Begin
          RxConfiguraGrid.Edit;
          RxConfiguraGrid.FieldByName('TAMANHO').asInteger := StrToInt(vTamanho);
          RxConfiguraGrid.FieldByName('COLUNA' ).asInteger := vCont;
          RxConfiguraGrid.Post;
        End;
      end;
    end;

    pGrid.Columns.clear;

    RxConfiguraGrid.SortOnFields('COLUNA');
    RxConfiguraGrid.First;

    vcont := -1;

    While Not RxConfiguraGrid.Eof do
    Begin
      vPosicao := Pos(RxConfiguraGrid.FieldByName('CAMPO').asstring+'|', vPosCampo);

      If (vPosicao > 0) Then
      Begin
        pGrid.Columns.Add;
        Inc(vcont);
        pGrid.Columns[vcont].FieldName     := RxConfiguraGrid.FieldByName('CAMPO').asstring;
        pGrid.Columns[vcont].Title.Caption := RxConfiguraGrid.FieldByName('TITULO').asstring;
        pGrid.Columns[vcont].Width         := RxConfiguraGrid.FieldByName('TAMANHO').asInteger;
        Delete(vPosCampo,vPosicao,Length(RxConfiguraGrid.FieldByName('CAMPO').asstring)+1);
        RxConfiguraGrid.Delete;
      End
      Else
        RxConfiguraGrid.Next;
    End;

    if pPossuiCampoMarcar Then
      AtribuiPropriedadesMarcar;

    { Caso alguma coluna seja adicionada mais tarde, irá para o final da coluna }
    RxConfiguraGrid.First;

    While Not RxConfiguraGrid.Eof do
    Begin
      Inc(vcont);
      pGrid.Columns.Add;
      pGrid.Columns[vcont].FieldName     := RxConfiguraGrid.FieldByName('CAMPO').AsString;
      pGrid.Columns[vcont].Title.Caption := RxConfiguraGrid.FieldByName('TITULO').AsString;
      pGrid.Columns[vcont].Width         := RxConfiguraGrid.FieldByName('TAMANHO').AsInteger;
      RxConfiguraGrid.Delete;
    end;

    FreeAndNil(vQrAuxiliar);

    pGrid.DataSource := pDataSource;
    If pPossuiCampoMarcar Then
      AtribuiPropriedadesMarcar;
  end;

  Procedure AdicionaCamposNaRx;
  var vQry : TQuery;
  begin
    vQry := TQuery.Create(nil);
    vQry.DatabaseName := cDataBaseName;

    With vQry do
    begin
      Close;
      Sql.Clear;

      Sql.Add(' SELECT LPAD('' '', 50, '' '') CAMPO   ');
      Sql.Add('      , LPAD('' '', 50, '' '') TITULO  ');
      Sql.Add('      , 0    TAMANHO                   ');
      Sql.Add('      , 0    COLUNA                    ');
      Sql.Add('   FROM DUAL                           ');
      AbrirQuery(vQry);

      If RxConfiguraGridDefault.Fields.Count = 0 Then
        RxConfiguraGridDefault.CopyStructure(vQry);
      RxConfiguraGridDefault.Open;
      //RxConfiguraGridDefault.LoadFromDataSet(vQry,0,LmCopy);

      If RxConfiguraGrid.Fields.Count = 0 Then
        RxConfiguraGrid.CopyStructure(vQry);
      RxConfiguraGrid.Open;
      //RxConfiguraGrid.LoadFromDataSet(vQry,0,LmCopy);
    end;
    FreeAndNil(vQry);
  end;

  Function CarregandoDadosGrid(Rx: TRxMemoryData; Grid: TDBGrid): TRxMemoryData;
  Var vcont : Integer;
  Begin
    Rx.close;
    Rx.Open;

    For vCont := 0 To Grid.Columns.Count -1 Do
    Begin
      Rx.Append;
      Rx.FieldByName('CAMPO'  ).asstring  := Grid.Columns[vcont].FieldName;
      Rx.FieldByName('TITULO' ).asstring  := Grid.Columns[vcont].Title.Caption;
      Rx.FieldByName('TAMANHO').asInteger := Grid.Columns[vcont].Width;
      Rx.FieldByName('COLUNA' ).asInteger := vCont;
      Rx.Post;
    End;
    Result := Rx;
  End;

  Procedure ConfiguraOrdernacaoGenerica(RxOrigem, RxDestino: TRxMemoryData; Grid: TDBGrid);
  Begin
    //Carregando as configurações(Default) do Grid.
    If Assigned(RxOrigem) then
      RxOrigem := CarregandoDadosGrid( RxOrigem, pGrid );

    //Carregando as configurações do grid.
    If Assigned(RxOrigem) and Assigned(RxDestino) then
    Begin
      RxDestino.close;
      RxDestino.EmptyTable;
      RxDestino.Open;

      RxDestino.LoadFromDataSet( RxOrigem, 0, lmCopy );
      RxDestino := CarregandoDadosGrid( RxDestino, grid );
    End;
  End;

  Function LendoDB(Rx: TRxMemoryData; Grid: TDBGrid): TRxMemoryData;
  Var
    vcont     : Integer;
    vTamanho  : Integer;
    vcampo    : String;
    vPosCampo : String;
  Begin
    For vcont:= 0 To Grid.Columns.Count-1 do
    begin
      Try
        vcampo := LeArqIni(vcUsuario+'/'+pTela+'SelecCampo', FormatFloat('00',vcont));

        If (vcampo <> '') and Rx.Locate('CAMPO', vcampo,[]) then
        Begin
          Try
            vTamanho := StrToInt(LeArqIni(vcUsuario+'/'+pTela+'SelecTam', FormatFloat('00',vCont)));
          Except
            vTamanho := 20;
          End;

          Rx.Edit;
          Rx.FieldByName('TAMANHO').asInteger := vTamanho;
          Rx.FieldByName('COLUNA' ).asInteger := vcont;
          Rx.Post;
        End;

      Except
      End;
    end;
    Result := Rx;
  end;

  procedure AtualizaGrid(Rx: TRxMemoryData; Grid: TDBGrid);
  Var vcont : Integer;
  begin
    Rx.First;
    While not rx.eof do
    Begin
      vcont := Rx.FieldByName('COLUNA').AsInteger;
      Grid.Columns[vcont].FieldName     := Rx.FieldByName('CAMPO'  ).AsString;
      Grid.Columns[vcont].Title.Caption := Rx.FieldByName('TITULO' ).AsString;
      Grid.Columns[vcont].Width         := Rx.FieldByName('TAMANHO').AsInteger;
      rx.Next;
    End;
  end;

  Procedure GravaOrdenacao;
  Var vcont : Integer;
  Begin
    If Not vcDatabase.InTransaction then
      vcDatabase.StartTransaction;

    For vcont:=0 to pGrid.Columns.count-1 do
    Begin
      GravaArqIni(vcUsuario+'/'+pTela+'Campo', FormatFloat('00',vcont),pGrid.Columns[vcont].FieldName);

      If pGrid.Columns[vcont].Width < 20 Then
        pGrid.Columns[vcont].Width := 20;

      GravaArqIni(vcUsuario+'/'+pTela+'Tamanho'   , FormatFloat('00',vcont),inttostr(pGrid.Columns[vcont].Width)   );
      GravaArqIni(vcUsuario+'/'+pTela+'SelecCampo', FormatFloat('00',vcont),         pGrid.Columns[vcont].FieldName);
      GravaArqIni(vcUsuario+'/'+pTela+'SelecTam'  , FormatFloat('00',vcont),inttostr(pGrid.Columns[vcont].Width)   );
    End;
    If vcDatabase.InTransaction then
      vcDatabase.Commit;
  End;

Begin

  ///////////////////
  // Rafael.Santos - Overload Andre.Oliveira//
  ///////////////////

  RxConfiguraGridDefault := TRxMemoryData.Create(Nil);
  RxConfiguraGrid        := TRxMemoryData.Create(Nil);

  AdicionaCamposNaRx;
  If pFuncao = 1 Then  //GRAVAR
    GravaOrdenacao
  Else If pFuncao = 2 Then //FORMSHOW
  Begin
    Try { Tamanho da fonte }
      vTamanho := StrtoInt(LeArqIni(pTela + '/' + vcUsuario, 'Fonte'));
    Except
      vTamanho := 7;
    End;

    pGrid.Font.Size := vTamanho;
    For i := 0 To (pGrid.Columns.Count - 1) Do
    begin
      pGrid.Columns[i].Title.Font.Size := pGrid.Font.Size;
      pGrid.Columns[i].Font.Size       := pGrid.Font.Size;
    end;

    RxConfiguraGridDefault.close;
    RxConfiguraGridDefault.Open;

    For vCont:=0 To pGrid.Columns.Count -1 Do
    Begin
      RxConfiguraGridDefault.Append;
      RxConfiguraGridDefault.FieldByName('CAMPO'  ).asstring  := pGrid.Columns[vcont].FieldName;
      RxConfiguraGridDefault.FieldByName('TITULO' ).asstring  := pGrid.Columns[vcont].Title.Caption;
      RxConfiguraGridDefault.FieldByName('TAMANHO').asInteger := pGrid.Columns[vcont].Width;
      RxConfiguraGridDefault.FieldByName('COLUNA' ).asInteger := vCont;
      RxConfiguraGridDefault.Post;
    End;

    ConfiguraOrdenacao;
  End
  Else If pFuncao = 3 Then //FORMACTIVE
  Begin
    ConfiguraOrdernacaoGenerica(RxConfiguraGridDefault, nil, pGrid);
    ConfiguraOrdernacaoGenerica(RxConfiguraGridDefault, RxConfiguraGrid, pGrid);
    RxConfiguraGrid := LendoDB(RxConfiguraGrid, pGrid);
    AtualizaGrid( RxConfiguraGrid, pGrid);
  End;

  FreeAndNil(RxConfiguraGridDefault);
  FreeAndNil(RxConfiguraGrid);
end;
GOSTEI 0
Rafael Santos

Rafael Santos

16/06/2016

Obrigado pelo elogio, caso de certo, dê um jóinha para que outros usuários confiem no código ;)

Obrigado.
GOSTEI 0
Valdenir Furlanetto

Valdenir Furlanetto

16/06/2016

Pode deixar
GOSTEI 0
POSTAR