Dúvida Case
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
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
Curtidas 0
Respostas
Marco Salles
15/09/2008
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;
GOSTEI 0
Roger1976
15/09/2008
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
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
Roger1976
15/09/2008
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.
- 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
Marco Salles
15/09/2008
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
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
Roger1976
15/09/2008
valeu brother!
GOSTEI 0
Marco Salles
15/09/2008
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
Parece que fica melhor a leitura do que o codigo se propõem a Fazer
O que voce acha ???
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
Roger1976
15/09/2008
...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]
É isso. Obrigado pela força.
[]s
PS: Como faço para que o tópico apareça [RESOLVIDO]?[/url]
GOSTEI 0