Jump to content

Recommended Posts

Posted

Bom dia,

Eu há alguns tempos que sei programar em pascal (o básico, que se aprende na escola) mas agora surgiu-me uma proposta de trabalho para delphi e gostaria de criar um pequeno programa com 2 ou 3 forms.

O meu problema é como é que abro um form filho dentro do form pai, pois na internet ja vi vários exemplos mas por alguma razao nao consigo abrir o formulário.

Será que alguem me pode ajudar, pf...

A mim aconselharam-me a aprender a trabalhar com o embarcadero XE, pois é o software quea empresa usa no desenvolvimento de softwares.

Atentamente,

security.

"Innovation distinguishes between a leader and a follower." Steve jobs.

Posted

Bom dia e bem vindo ao Delphi.

Antes de mais gostava de saber se, quando te referes a form filho, queres dizer o sistema MDI (forms que pertencem a uma form principal e que só existem dentro dessa) ou simplesmente forms secundárias, abertas a partir de uma principal, mas que ocupam o seu proprio espaço.

Já agora, o sistema MDI caiu em desuso (se bem que se o sitio para onde fores programar as quiser usar, que remedio tens tu senão as usar também 😉 )

Convém saber isto, porque a maneira de trabalhar com forms é bastante diferente de um tipo para outro.

Aproveita e mete o código que estás a usar para as abrir, para se ver onde está a falha!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Bom dia e obrigado pela dica.

Sim estou a trabalhar com sistemas MDI Form.

Não tenho muito código.

Apenas criei um form MDI "pai" e um form "filho". No Form "pai" tenho um menu com uma opção "Pessoas" ->"Direção" e neste botao DIreção deveria abrir um form "filho". simplesmente. mas da sempre um ou mais erro/s. Gostava de saber como se faz essa simples função.

Já agora, que tipo de sistemas se utiliza hoje em dia???

"Innovation distinguishes between a leader and a follower." Steve jobs.

Posted

Já agora, que tipo de sistemas se utiliza hoje em dia???

Hoje em dia utiliza-se mais o sistema de múltiplas Forms com espaço independente. Por exemplo, para o teu caso, eu faria uma Form à parte.

Considerando que a Form "Direcção" abre a partir da Principal, eu bloquearia esta enquanto a "Direcção" estivesse aberta, isto dependendo do propósito desta - supondo que é para preencher dados, bloquear é a melhor forma.

Em VB.NET (porque eu não domino Delphi) isto far-se-ia do seguinte modo:

Private Sub Button_Direccao(ByVal ... ) Handles Button_Direccao.Click  'gere o clique do botão "Direccao"
   Form_Direccao.Show() 'mostra a form "Direccao"
   Me.Enabled = False   'bloqueia a form principal (actual)
End Sub

O processo era revertido aquando o fecho da form "Direccao".

Isto é o mais comum e, de certa forma, o mais intuitivo hoje em dia. Eu, pessoalmente, por exemplo, nunca apreciei muito o sistema MDI excepto em situações que assim o exigem, como certos IDEs.

Knowledge is free!

Posted

Boa tarde,

A trabalhar com MDI's tens de criar um objecto "child-form" dentro do parent-form, mais correctamente na mesma unit. Vê o exemplo de código abaixo:

procedure TfrMain.CreateChildForm
	 (const childName : string);
 var Child: TfrChild;
begin
 Child := TfrChild.Create(Application);
 Child.Caption := childName;
end;

Uma vez construído podes abri-lo no menu do parent-form, no evento click. Vê o exemplo:

procedure TfrMain.NewChild1Click(Sender: TObject);
begin
CreateChildForm('Child '+IntToStr(MDIChildCount+1));
end;

Já não uso isto à bastante tempo... Nem tive oportunidade de testar pois não tenho nem delphi nem lazarus aqui a jeito, mas a ideia é a mesma, agora só tens de adaptar o código para ti.

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Posted (edited)

Este procedure é colocado onde???

procedure TfrMain.CreateChildForm
	 (const childName : string);
 var Child: TfrChild;
begin
 Child := TfrChild.Create(Application);
 Child.Caption := childName;
end;

O codigo do formulario principal é

unit Unit4;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus;
type
 TForm4 = class(TForm)
MainMenu1: TMainMenu;
irecao1: TMenuItem;
procedure irecao1Click(Sender: TObject);
 private
{ Private declarations }
 public
{ Public declarations }
 end;
var
 Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.irecao1Click(Sender: TObject);
begin
    {Aqui fica o codigo: [b]CreateChildForm('Child '+IntToStr(MDIChildCount+1));[/b]}
end;
end.
Edited by security

"Innovation distinguishes between a leader and a follower." Steve jobs.

Posted

Bem, uma maneira simples de usar as MDI's é assim:

1. Na tua form principal, alteras a propriedade FormStyle para fsMDIForm

2. Crias uma form secundária (será um modelo de form, pois vais poder abrir várias instancias dessa se quiseres), e modificas-lhe a propriedade FormStyle para fsMDIChild

3. Abres a source do teu ficheiro DPR. O Delphi mete lá uma instância de Application.CreateForm para cada form que crias no IDE. Eu pessoalmente não gosto disso, pelo que sugiro que removas todas as linhas destas, excepto a da form principal.

4. Adicionas a(s) unit(s) da(s) form(s) secundária(s) ao USES da form principal.

5. No evento OnClose da(s) form(s) secundária(s), mete o seguinte:

procedure TfChild.FormClose(Sender: TObject; var Action: TCloseAction);  // Linha criada pelo Delphi
begin  // Linha criada pelo Delphi

 Free;  // Insere esta linha aqui   <==============

end;   // Linha criada pelo Delphi

6. Quando quiseres criar uma nova form, inseres a seguinte linha:

 fchild:=TfChild.Create(self);  // Metes isto num menu, num botão (onclick) ou onde quer que precises que uma form seja criada.

Só com isto já consegues criar e fechar forms.

Depois precisas do acessório. Por exemplo, para saberes quantas forms child uma form principal tem:

ShowMessage(IntToStr(fMDIParent.MDIChildCount));

Para organizar todas as child forms lado a lado dentro da form principal:

fMDIParent.Tile;

Para organizar todas as child forms em cascata dentro da form principal:

fMDIParent.Cascade;

Para acederes às propriedades e eventos da child activa, qualquer que ela seja:

fMDIParent.ActiveMDIChild

Para percorreres todas as forms child

for i:=0 to fMDIParent.MDIChildCount -1 do
  fMDIParent.MDIChildren[i]

Etc.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

acho que estou a perceber... assim é muito mais simples e rapido... e tambem mais parecido com vb.net...

vou exprimentar...

Obrigado

"Innovation distinguishes between a leader and a follower." Steve jobs.

Posted

Note-se que eu usei fMDIParent e fChild como os nomes das forms principal e secundária respectivamente.

Se usares outros nomes, tens de alterar a chamada também.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.