Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Francisco Assis_45674

Como identificar componente do TabSheet

Recommended Posts

Pessoal eu estou usando o seguinte código para criar abas no TabSheet, cada aba vem com um TSynMemo (é tipo um memo, mas faz parte do pacote SynEdit)

 

  var
    TabSheet: TTabSheet;
    Editor: TSynMemo;  
    i: integer;         

    i := pgcControleDeAbas.PageCount;                        
    TabSheet := TtabSheet.Create(pgcControleDeAbas);         
    TabSheet.Caption := '* Novo arquivo ';                 
    TabSheet.Name := 'Aba' + IntToStr(i + 1);                 
    TabSheet.PageControl := pgcControleDeAbas;              
    pgcControleDeAbas.ActivePage := TabSheet;

    Editor := TSynMemo.Create(TabSheet);                     
    TWinControl(Editor).Name := 'Editor' + IntToStr(i + 1);   
    Editor.Align := alClient;                                 
    TWinControl(Editor).Parent := TabSheet;                  
    Editor.Clear;                                            
    Editor.SetFocus;                                          

Eu quero alterar o OnChance de cada novo TSynMemo criado, como posso fazer isso? Ou pelo menos obter o nome de cada componente, ou até mesmo manipular cada componente por si... Alguém tem uma solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode criar uma função para navegar pelos itens do tabsheet e ai efetuar seus controles... fiz um código pra teste uma vez que eu buscava um edit criado em runtime dentro de um formulário pra preencher ele com um texto... era algo +/- assim:

 

 

      for iItem := 0 to FormDestino.ComponentCount - 1 do
          if  (FormDestino.Components[iItem].Name = Edit)
          and (FormDestino.Components[iItem] is TEdit)  then
          begin
             TEdit(FormDestino.Components[iItem]).Text := Texto;
             break;
          end;

 

No seu caso provavelmente seria trocar o FormDestino pelo seu tabSheet que já resolveria pra poder acessar o conteúdo... agora, se cria tudo em runtime, poderia criar os métodos no seu .pas e associar ao seu TSynMemo no momento da criação o evento correspondente, algo do tipo....

 

 

      { Propriedades do Button }
      btn         := TBitBtn.Create(Panel);
      btn.Width   := 44;
      btn.Left    := 200;
      btn.Height  := 29;
      btn.Top     := 14;
      btn.Glyph   := nil;
      ImageList1.GetBitmap(0, btn.Glyph);
      btn.OnClick := btnAbrirDatabaseAClick;

 

Se criar seu componente usando a idéia acima, associando ao evento que quer usar uma chamada programada com os mesmos parâmetros, o próprio componente controlará os eventos, sem precisar esquentar a cabeça!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi,

 

É que estou desenvolvendo um editor de texto com destaque de sintase, aqueles editores de programação, e to com problemas para colocar a rotina para contar as linhas e caracteres e mostrar na Barra De Status em tempo real, por isso perguntei como alterar o OnChange... Em todo caso, obrigado, vou ver o que eu posso fazer aqui.



Mas você não poderia me dizer como eu pego o nome do componente? Só tem o SynMemo mesmo dentro do TabSheet, tem como pegar o nome dele não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque simplesmente não cria uma procedure com o mesmo formato do evento onchange do seu SynMemo e associa a ele no momento da criação do objeto em runtime? Seria mais simples.... você associaria ao sem SynMemo.OnChange o evento como mostrei no TButton acima.... e ai ao manipular o componente criado ele já dispararia o evento programado, sem precisar ficar criando métodos pra localizar o componente e tals....

 

Agora, se quiser procurar dentro do tabSheet, vai ter que adaptar um pouco o código que passei antes de exemplo... a lógica é a mesma, só muda o componente... tem que varrer de 0 até o TabSheet.ComponentCount-1 e ai testar se o tipo do componente é o procurado... algo +/- assim:

 

 

Function RetornaItem (TabSheet : TTabSheet):String;
var iITem : integer;
begin
      for iItem := 0 to TabSheet.ComponentCount - 1 do
           if  (TabSheet.Components[iItem] is TSymMemo)  then
           begin
                Result := TabSheet.Components[iItem].Name;
                break;          
           end;
end;

 

Acho que seria +/- isso... não tenho esse componente aqui pra testar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.