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

Comando Para Criar Componentes


deio

Pergunta

11 respostass a esta questão

Posts Recomendados

  • 0
oi, gostaria de saber qual seria o comando para quando clicar em um botão criasse um novo page dentro do tabbednotebook, e dentro desse novo page criasse um DBGrid
deio, você utiliza o mesmo método aplicado a qualquer componente - Create. A questão, no caso dos componentes visuais (os descendentes de TWinControl), é que você tem que ajustar a propriedade Parent para apontar para o componente visual que mostrará o mesmo. Segue um ex.:

procedure TForm2.Button2Click(Sender: TObject);
begin
  TabbedNotebook1.Pages.Append('Aba '+IntToStr(TabbedNotebook1.Pages.Count));
  with TDBGrid.Create(self) do
  begin
    Parent := TWinControl(TabbedNotebook1.Pages.Objects[TabbedNotebook1.Pages.Count -1]);
    Name := 'DBGrid1';  // *** este nome deve ser único
    Top := 8;
    Left := 8;
    Width := TabbedNotebook1.Width - 16;
    Height := TabbedNotebook1.Height - 16;
  end;
end;

Uma perguntinha...

Porque você está utilizando o TabbedNoteBook (lá do Windows 3.1 - 16bits)? Acho que seria mais apropriado você utilizar as versões mais recentes TabControl ou PageControl (Windows - 32bits), com muito mais recursos (propriedades, metodos e eventos).

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

O processo é o mesmo que o mencionado anteriormente: cria a guia, define seu parent, cria os componentes a inserir na guia, definindo a mesma como seu parent:

procedure TForm3.BtnAddSheetClick(Sender: TObject);
var
  TabSheet :TTabSheet;
begin
  TabSheet := TTabSheet.Create(Self);
  TabSheet.Name := 'TabSheet'+IntToStr(PageControl1.PageCount +1);  // garante nome único
  TabSheet.Caption := 'TabSheet '+IntToStr(PageControl1.PageCount +1);
  // efetiva a inserção no componente PageControl (equivale a setar o Parent no outro componente)
  TabSheet.PageControl := PageControl1; 
  with TDBGrid.Create(self) do
  begin
    Parent := TabSheet;
    Name := 'DBGrid2';
    Top := 8;
    Left := 8;
    Width := TabSheet.Width - 16;
    Height := TabSheet.Height - 16;
  end;
end;

Outras propriedades a serem inicializadas dependem da necessidade - se necessário consulte o help sobre o componente em questão.

Link para o comentário
Compartilhar em outros sites

  • 0

vlw, já ajudou bastante, agora que eu consegui o código para criar, estou tentando fazer o codigo para fechar a aba selecionada, o problema é que a nova aba é criada em tempo de execução e não sei como me referir a este novo componente criado...

Link para o comentário
Compartilhar em outros sites

  • 0
vlw, já ajudou bastante, agora que eu consegui o código para criar, estou tentando fazer o codigo para fechar a aba selecionada, o problema é que a nova aba é criada em tempo de execução e não sei como me referir a este novo componente criado...
Se você prestou atenção aos comentários, você deve ter observado que deve dar um nome único para cada componente. Posto isso, utilize o método FindComponent(nome_componente) do seu form. Todos os componentes que tiveram como Owner o Form (self) estarão numa lista que poderá ser consultada com este método que retorna um TComponente (declare a variável para receber o retorno, teste se não é nula e depois apenas chame o Free dela) - dê uma olhada no help.

Link para o comentário
Compartilhar em outros sites

  • 0

acho que eu não perguntei direito, o componente não existe até que você execute tal função dentro do programa, e se você tentar declará-lo o delphi irá te dizer que ele não existe.

Ex:

executa o programa

clica no button1

o programa cria um button3

clica no button2 e exclui o button3

(esse button3 é criado enquanto você executa o programa, que antes de você executá-lo o componente não existia)

espero ter deixado minha dúvida um pouco mais clara :lol:

Link para o comentário
Compartilhar em outros sites

  • 0

estou achando é que eu foi quem não explicou direito. :huh:

Você não quer excluir um botão que você criou dinamicamente? Então, se você tem o nome dele na criação, você tem como localizá-lo e destruí-lo. Não é isso que você quer?

Veja o código a seguir:

procedure Form1.Button1Click(Sender :TObject);
begin
  with TButton.Create(Self) do
  begin
    Name := 'Button3';
    Left := 15;
    Top := 20;
    Parent := TabSheet1;
  end;
end;

procedure Form1.Button2Click(Sender :TObject);
var
  Componente :TComponent;
begin
  Componente := FindComponent('Button3');
  if Assigned(Componente) then
    Componente.Free;
end;

Foi isso que eu quiz dizer no outro post

Link para o comentário
Compartilhar em outros sites

  • 0

agora foi XD

micheus, está dando erro quando eu tento criar mais de um tabsheet, ele diz que já existe um DbGrid com esse nome...

sabe aquele exemplo do tabsheet que tu escreveu neste tópico, como ficaria este exemplo pra fechar feito sobre aquele, ou seja, ao clicar num button, ele fecharia a nova aba.

como ficaria para ao invés de fechar uma nova aba, ele fechasse a aba selecionada?

Editado por deio
Link para o comentário
Compartilhar em outros sites

  • 0
sabe aquele exemplo do tabsheet que tu escreveu neste tópico, como ficaria este exemplo pra fechar feito sobre aquele, ou seja, ao clicar num button, ele fecharia a nova aba.

como ficaria para ao invés de fechar uma nova aba, ele fechasse a aba selecionada?

A idéia é a mesma. Entretanto, como sua idéia é "matar" o mesmo e não apenas ocultar, é conveniente que os componentes adicionados à ela não a tenham apenas como Parent (local onde são desenhadas), mas sim, como Owner também. Isso garantirá que ao ser destruída (via método Free), esses componentes que a ela forma adicionados também o sejam.

Para acessar a guia ativa (a TabSheet), você deve obter sua instância, que nesse caso seria a guia ativa no PageControl, ou seja, via propriedade PageControl.ActivePage.

A forma mais elegante, digamos assim, seria você remover o componente de seu Owner para depois eliminá-lo. Por ex.:

var
  Componente :TComponent;
begin
  Componente := PageControl.ActivePage;
  PageControl.RemoveComponent(Componente);  // remove-o da lista de componentes interna do Owner
  Componente.Free;
end;

Mas pelo que me lembro, o método anterior (mais simplista) também resulta na remoção correta do componente. É testar para ver.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
micheus, está dando erro quando eu tento criar mais de um tabsheet, ele diz que já existe um DbGrid com esse nome...

falto só essa parte...

meu DbGrid principal está com o nome de DbGrid1 mesmo, acho que precisa fazer um contador, que para cada dbgrid criado, adicione +1 no numero dele.

Ex : Dbgrid4, Dbgrid5....

consegui fazer o programa fechar a aba selecionada XD

:

(...)
procedure Form1.Button2Click(Sender :TObject);
var
  Componente :TComponent;
begin
  Componente := FindComponent('Button3');
  if Assigned(Componente) then
    Componente.Free;
end;
var
  Componente :TComponent;
begin
  Componente := PageControl.ActivePage;
  PageControl.RemoveComponent(Componente);  // remove-o da lista de componentes interna do Owner
  Componente.Free;
end;
o que eu fiz foi misturar o dois e deu certo e fiz o seguinte :
(aprendi a usar essa janelinha XD )
var
  Componente :TComponent;
begin
  Componente := PageControl.ActivePage;
  if Assigned(Componente) then
    Componente.Free;
end;

Editado por deio
Link para o comentário
Compartilhar em outros sites

  • 0
micheus, está dando erro quando eu tento criar mais de um tabsheet, ele diz que já existe um DbGrid com esse nome...

falto só essa parte...

meu DbGrid principal está com o nome de DbGrid1 mesmo, acho que precisa fazer um contador, que para cada dbgrid criado, adicione +1 no numero dele.

Ex : Dbgrid4, Dbgrid5....

no primeiro post que eu lhe respondi tem a seguinte linha no código:

Name := 'DBGrid1'; // *** este nome deve ser único

no post seguinte:

TabSheet.Name := 'TabSheet'+IntToStr(PageControl1.PageCount +1); // garante nome único

no seguinte:

Se você prestou atenção aos comentários, você deve ter observado que deve dar um nome único para cada componente.

e ainda no próximo:

Você não quer excluir um botão que você criou dinamicamente? Então, se você tem o nome dele na criação, você tem como localizá-lo e destruí-lo.

Acho que esta questão já está respondida, além do que parece-me que você já tem a resposta - por favor preste mais atenção ao ler os comentários. <_<

consegui fazer o programa fechar a aba selecionada XD

o que eu fiz foi misturar o dois e deu certo e fiz o seguinte :

(aprendi a usar essa janelinha XD )
var
  Componente :TComponent;
begin
  Componente := PageControl.ActivePage;
  if Assigned(Componente) then
    Componente.Free;
end;

Parabéns!!! :D

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
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...