DbGrid ou StringGrid - Alteração nas posição das linhas
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.
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
Curtidas 0
Melhor post
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
16/06/2016
Alguém? ninguém tem uma idéia?
GOSTEI 0
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
Escopo do código:
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 marcarEscopo 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
16/06/2016
Obrigado pelo elogio, caso de certo, dê um jóinha para que outros usuários confiem no código ;)
Obrigado.
Obrigado.
GOSTEI 0
Valdenir Furlanetto
16/06/2016
Pode deixar
GOSTEI 0