Fórum Dúvida Case #363958
15/09/2008
0
Eu criei uma rotina onde de acordo com o campo selecionado no dbgrid, deixa ou não a célula em modo de edição. Como há vários campos, então resolvi utilizar um case of, como segue abaixo:
[EVENTO ONENTER do dbgrid]
case dbgItem.DataSource.DataSet.DataSetField.Index of
1,2,5,9: dbgItem.Options := dbgItem.Options - [dgEditing];
10..14:
begin
if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then
dbgItem.Options := dbgItem.Options - [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing]
end;
else
dbgItem.Options := dbgItem.Options + [dgEditing];
end;
O primeiro intervalo é intercalado(colunas 1, 2, 5 e 9), não sei se está correto da forma como coloquei, só sei que ao executar o aplicativo, qdo clico no grid pela primeira vez dá a mensagem de erro ´access violation´, depois funciona numa boa.
Estou pedindo uma orientação de vcs, e caso tenha uma outra sugestão, por favor fiquem a vontade.
Grato.
[]s
Roger1976
Curtir tópico
+ 0Posts
15/09/2008
Marco Salles
procedure TForm1.dbgItemEnter(Sender: TObject); begin with dbgItem.DataSource.DataSet do begin if Assigned(DataSetField) then begin case DataSetField.Index of 1,2,5,9: dbgItem.Options := dbgItem.Options - [dgEditing]; 10..14: begin if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then dbgItem.Options := dbgItem.Options - [dgEditing] else dbgItem.Options := dbgItem.Options + [dgEditing] end; else dbgItem.Options := dbgItem.Options + [dgEditing]; end; end; end; end;
Gostei + 0
16/09/2008
Roger1976
procedure TfrmAtendimento.dbgItemColEnter(Sender: TObject);
begin
if dbgItem.SelectedField = dmAtendimento.dsAten_temp.DataSet.FieldByName(´AT_TMP_SIM´) then
dbgItem.Options := dbgItem.Options - [dgEditing]
else if dbgItem.SelectedField = dmAtendimento.dsAten_temp.DataSet.FieldByName(´AT_CLIN_STM´) then
dbgItem.Options := dbgItem.Options - [dgEditing]
else if dbgItem.SelectedField = dmAtendimento.dsAten_temp.DataSet.FieldByName(´AT_CLIN_OP1´) then
if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then
dbgItem.Options := dbgItem.Options - [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing]
else if dbgItem.SelectedField = dmAtendimento.dsAten_temp.DataSet.FieldByName(´AT_CLIN_OP2´) then
if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then
dbgItem.Options := dbgItem.Options - [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing]
else if dbgItem.SelectedField = dmAtendimento.dsAten_temp.DataSet.FieldByName(´AT_CLIN_OP3´) then
if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then
dbgItem.Options := dbgItem.Options - [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing]
else if dbgItem.SelectedField = dmAtendimento.dsAten_temp.DataSet.FieldByName(´AT_CLIN_OP4´) then
if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then
dbgItem.Options := dbgItem.Options - [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing]
else if dbgItem.SelectedField = dmAtendimento.dsAten_temp.DataSet.FieldByName(´AT_CLIN_OP5´) then
if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then
dbgItem.Options := dbgItem.Options - [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing];
end;
procedure TfrmAtendimento.dbgItemEnter(Sender: TObject);
begin
vCalcGrid := true;
dbgItemColEnter(self); - essa parte a pessoa tinha repetido o código do onenter, ou seja, tinha usado o famoso copiar/colar (rsrsrsrsrs)
end;
Dessa maneira, funciona, agora da forma como eu tinha simplificada não. A coluna 1 e a 2 tbem ficam em modo de edição (não deveria).
Obrigado pela força, se tiver outra sugestão, por favor fique a vontade.
[]s
Gostei + 0
16/09/2008
Roger1976
- No OnEnter do grid:
case dbgItem.SelectedField.Index of
1,2,5: dbgItem.Options := dbgItem.Options - [dgEditing];
9:
begin
case dmAtendimento.cdsAten_TempCF_ITEM_COD.AsInteger of
22167,22168,22170: dbgItem.Options := dbgItem.Options - [dgEditing];
else
dbgItem.Options := dbgItem.Options + [dgEditing]
end
end;
10..14:
begin
if dmAtendimento.cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then
dbgItem.Options := dbgItem.Options - [dgEditing]
else
dbgItem.Options := dbgItem.Options + [dgEditing]
end;
else
dbgItem.Options := dbgItem.Options + [dgEditing];
end;
- No CellClick do grid:
// Controla o modo de edição do dbgrid de acordo com o item selecionado
dbgItem.OnEnter(self);
Não sei se é a solução mais plausível, mas até o momento foi a única que surtiu melhor efeito.
Gostei + 0
16/09/2008
Marco Salles
Acho que o problema esta sendo em Refactoring do Codigo. Nada de POO e muito RAD.. Como infelismente o Delphi nos obrigou :cry: :cry:
Mas tarde posto a minha opinião , com mais tempo
Gostei + 0
16/09/2008
Roger1976
Gostei + 0
17/09/2008
Marco Salles
E acrescento , infelismente :cry: :cry:
Não estou discutindo a lógica , nen se funciona ou não..
Estou somente discursando sobre a legutibilidade do Codigo
Codigo Legivel é melhor para manutenção ,expansão , correção etc..
Vc pode refectorar de forma ainda melhor
Veja uma que eu Fiz
procedure TForm1.dbgItemEnter(Sender: TObject); procedure Editar(S:boolean); begin if S Then dbgItem.Options := dbgItem.Options + [dgEditing] else dbgItem.Options := dbgItem.Options - [dgEditing]; end; begin with dmAtendimento do case dbgItem.SelectedField.Index of 1,2,5: Editar(false); 9: case cdsAten_TempCF_ITEM_COD.AsInteger of 22167,22168,22170:Editar(false); else Editar(True) end; 10..14: if cdsTopicoAtenCF_OR_TOPI_TIP_OPC.AsInteger in [1,2] then Editar(false) else Editar(True) else Editar(True) end; end;
Parece que fica melhor a leitura do que o codigo se propõem a Fazer
O que voce acha ???
Gostei + 0
17/09/2008
Roger1976
É isso. Obrigado pela força.
[]s
PS: Como faço para que o tópico apareça [RESOLVIDO]?[/url]
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)