Fórum Dúvida Case #363958

15/09/2008

0

Saudações!

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

Roger1976

Responder

Posts

15/09/2008

Marco Salles

não esta faltando algo em seu codigo ???

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;
    



Responder

Gostei + 0

16/09/2008

Roger1976

Amigo Marco Salles, agora não está dando mais o erro, muito obrigado pela ajuda. No entanto, percebi que a coluna que tem o index = 1 fica em modo de edição, e não deveria ficar. O código original é algo que dá medo (rsrsrs), pois o programador que desenvolveu a tela usou os eventos ONENTER e ONCOLENTER, o pior é que funciona, só que com mais linhas de código, veja abaixo:

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


Responder

Gostei + 0

16/09/2008

Roger1976

Amigo Marco Salles, encontrei uma solução que na minha opinião foi a melhor.

- 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.


Responder

Gostei + 0

16/09/2008

Marco Salles

Beleza...
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


Responder

Gostei + 0

16/09/2008

Roger1976

valeu brother!


Responder

Gostei + 0

17/09/2008

Marco Salles

como eu disse ... Pouco ou quase nenhum POO e muito RAD..
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 ???


Responder

Gostei + 0

17/09/2008

Roger1976

...perfeito, realmente a leitura fica mais limpa, com certeza será mais uma pro meu caderno de dicas. Pra vc ter uma idéia, trata-se de um sistema de prontuário eletrônico. Na tela de atendimento, existem 2 dbgrids, um com os tópicos, referentes a uma determinada clínica, e o outro com os itens e descrição, que é o que estamos discutindo. Para cada item, a célula da descrição tem um formato diferente. Há algumas que possuem um combobox, outras formato data, outras são editáveis, outras não, e por aí vai. Estou há 3 meses na empresa e é um padrão utilizada por ela, particularmente, dgrid pra mim só serve pra exibir dados, não gosto de ficar editando, fazendo n coisas diretamente nele, não sei se vc me entende. Pelo menos agora houve uma redução drástica na quantidade de linhas (ficou ainda melhor com a sua dica), antes, como tinha postado, havia vários if´s, sem falar que estava replicado no evento OnColEnter, que afinal não estava servindo pra nada.

É isso. Obrigado pela força.

[]s

PS: Como faço para que o tópico apareça [RESOLVIDO]?[/url]


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar