Ir para conteúdo
Fórum Script Brasil
  • 0

Traizegroupitem E Tcomponent


fajo

Pergunta

Olá,

eu tenho uma rotina que uso pra desabilitar ou habilitar os botões de acesso aos forms de acordo com as permissões do usuário que é assim:

If (Form.Components Is TSpeedButton) Then

(Form.Components As TSpeedButton).Enabled :=

(Locate('IdItem', (Form.Components As TSpeedButton).Tag, [])) Or ((Form.Components As TSpeedButton).Tag = 0);

só que estou querendo trocar os botões e menus por um componente Raize, o RzGroup, e o código segue a mesma lógica:

If (Form.Components Is TRzGroupItem) Then

(Form.Components As TRzGroupItem).Enabled :=

(Locate('IdItem', (Form.Components As TRzGroupItem).Tag, [])) Or ((Form.Components As TRzGroupItem).Tag = 0);

só que na hora da compilação dá o seguinte erro:

[DCC Error] UDMAutenticacao.pas(68): E2010 Incompatible types: 'TRzGroupItem' and 'TComponent'

porque que ocorre o erro com o RzGroupItem e com o SpeedButtom não? e como corrigí-lo?

Obrigado

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Opa

Teria que testar pra conseguir fazer funcionar mais tente assim, "talvez" funcione...

If (Form.Components Is TRzGroupItem) Then

TRzGroupItem(Form.Components).Enabled :=

(Locate('IdItem', TRzGroupItem(Form.Components).Tag, [])) Or (TRzGroupItem(Form.Components).Tag = 0);

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Churc,

acho que está no caminho certo

no código:

If (Form.Components Is TRzGroupItem) Then

(Form.Components As TRzGroupItem).Enabled :=(Locate('IdItem', (Form.Components As TRzGroupItem).Tag, [])) Or ((Form.Components As TRzGroupItem).Tag = 0);

o erro : [DCC Error] UDMAutenticacao.pas(68): E2010 Incompatible types: 'TRzGroupItem' and 'TComponent'

acontece 3 vezes, ou seja onde tem "Form.Components Is TRzGroupItem","Form.Components As TRzGroupItem","Form.Components As TRzGroupItem"

já no seu código:

If (Form.Components Is TRzGroupItem) Then

TRzGroupItem(Form.Components).Enabled := (Locate('IdItem', TRzGroupItem(Form.Components).Tag, [])) Or (TRzGroupItem(Form.Components).Tag = 0);

só acontece um erro: [DCC Error] UDMAutenticacao.pas(68): E2010 Incompatible types: 'TRzGroupItem' and 'TComponent'

e é exatamente na 1ª linha, onde tem: Form.Components Is TRzGroupItem;

tá perto!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Hmm eu teria que ter este componente pra testar, não sei como verificar o

type cast de outra forma, acha que se usar o "=" ele vai dar o mesmo erro...

Mas pra resolver o seu problema, vai uma idéia, depois se achar outra maneira

usando type cast não vai te prejudicar em nada...

A idéia é, porque você não classifica os componentes Rz com números em suas

tags, exemplo

Vamos supor que tenha 3 componentes do tipo Rz

TRzEdit - pra "todos" os TRzEdits coloque a tag 6550

TRzGroupItem - pra "todos" os TRzGroupItems coloque a tag 6551

TRzButton - pra "todos" os TRzButtons coloque a tag 6552

Ai depois você pode fazer

case Components.Tag of

6550: é um TRzEdit;

6551: é um TRzGroupItem;

6552: é um TRzButton;

else

if (Components is TSpeedButton) then

...

end;

É só uma idéia pra você ir adiantando, depois se encontrar forma melhor só trocar o

código nem nas tags não vai precisar mexer porque não vai mudar nada... a menos

que você as use...

Capaz que fique ainda mais rápido do que comparar tipos rsr, mas é imperceptível...

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Churc esse lance do utilizar a Tag seria uma saída, mas o colega fajo já utiliza esta propriedade para outra finalidade.

A questão de erro no teste:

If (Form.Components Is TRzGroupItem) Then

pode ser contornada através da verificação via método ClassName:

If (Form.Components.ClassName = 'TRzGroupItem') Then

Depois, o type-cast é desse jeito mesmo que você colocou:

TRzGroupItem(Form.Components)....

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Micheus, pela dica, value mesmo, e a você Churc, também meu muito obrigado, o problema agora é que acho que a classe não está sendo reconhecida, vou colocar o procedimento todo:

Procedure TDMAutenticacao.AutenticaMenus(IdSistema, IdUsuario: Integer; Form : TForm);

Var

I : Integer;

Begin

With cdsPermissoes Do

Begin

If Active Then

Close;

Params.ParamByname('IdUsuario').Value := IdUsuario;

Params.ParamByname('IdSistema').Value := IdSistema;

Open;

For I := 0 To Form.ComponentCount - 1 Do

Begin

If (Form.Components Is TMenuItem) Then

(Form.Components As TMenuItem).Enabled :=

(Locate('IdItem', (Form.Components As TMenuItem).Tag, [])) Or ((Form.Components As TMenuItem).Tag = 0);

If (Form.Components Is TSpeedButton) Then

(Form.Components As TSpeedButton).Enabled :=

(Locate('IdItem', (Form.Components As TSpeedButton).Tag, [])) Or ((Form.Components As TSpeedButton).Tag = 0);

If (Form.Components.ClassName = 'TRzGroupItem') Then

TRzGroupItem(Form.Components).Enabled := (Locate('IdItem', TRzGroupItem(Form.Components).Tag, [])) Or (TRzGroupItem(Form.Components).Tag = 0);

End;

Close;

End;

End;

quando o item é um menu ele entra no 1º if habilitando ou desabilitando os menus, quando o item é um SpeedButton, ele entra no 2º if, habilitando ou desabilitando os botões, mas, não entra no 3º if, como se não tivesse esse componente!!!

alguma sugestão?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Olha ultimamente ando tão passado que fui dar a dica do TAG sendo que

claramente no seu código dava pra ver que você já usa pra outra finalidade

IAUHEAU

mas ai tenta assim

If (Form.Components Is TRzGroup) Then

TRzGroup(Form.Components).Enabled :=

(Locate('IdItem', TRzGroup(Form.Components).Tag, [])) Or (TRzGroup(Form.Components).Tag = 0);

ou

If (Form.Components.ClassName = 'TRzGroup') Then

TRzGroup(Form.Components).Enabled :=

(Locate('IdItem', TRzGroup(Form.Components).Tag, [])) Or (TRzGroup(Form.Components).Tag = 0);

Visto que pelo que parece o componente em si é TRzGroup e TRzGroupItem é

apenas um item do TRzGroup e é claro que não poderia ser comparado como

um componente rsr

Se não for TRzGroup, troque pelo nome da Classe do componente em si exemplo

TRzGroupBox... não conheço esse set de componentes :|

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

É faz sentido sim, se o problema não for de "case sensitive" no nome da Classe

então eu já não sei mais como te ajudar, espero que outros saibam...

If (LowerCase(Form.Components.ClassName) = 'trzgroupitem') Then

...

Talvez não tenha a ver, mas se fosse comigo eu tentaria de todas as formas possíveis rs

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Acredito que não seja uma questão de "case sensitive", mas nada impede que seja feita a conversão para minúscula ou maiúscula.

Visto que pelo que parece o componente em si é TRzGroup e TRzGroupItem é apenas um item do TRzGroup e é claro que não poderia ser comparado como um componente rsr
Chur, essa é uma boa obsevação. Como é um componente de terceiro, nada impede que ele tenha sido programado de uma forma um pouco diferente do que se está acostumado.

A pergunta é: fajo, no seu form, onde ficam as declarações dos componentes adicionados a ele, existe alguma referência a componentes do tipo TRzGroupItem?

Link para o comentário
Compartilhar em outros sites

  • 0
Tem não Micheus, só aparece os grupos, RzGroup1, etc..., dentro dos grupos é que estão os itens!!
Era bem a resposta que estava esperando. :D

Pelo que dá para ver no site da Raize, este seu TRzGroup deve ser um dos componentes similares ao TRadioGroup. Se for isto mesmo, parece-me que estes seu TRzGroupItem devam ser "armazenados" em uma propriedade tipo a Items. Voce já verificou isto?

Porque se for, você terá que gravar/procurar no seu controle de acesso, a referência ao TRzGroup e qual o item dele você quer habilitar/desabilitar.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...