Warrior.of.Ice Postado Outubro 22, 2007 Denunciar Share Postado Outubro 22, 2007 Primeiro post :rolleyes: Galera, como faz para utilizar um DBNavigator no Form pai e quando abrir as janelas filhas dentro dele, eu passe de um registro para o outro clicando no botão do DBNavigator do pai, sem ter que criar um component pra cada janela filha?Obrigado! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 22, 2007 Denunciar Share Postado Outubro 22, 2007 Experimente, ao tornar a janela filha ativa, alterar o dataset (ou datasource) ligado ao DBNavigator. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Warrior.of.Ice Postado Outubro 24, 2007 Autor Denunciar Share Postado Outubro 24, 2007 Amigo, eu sou novo no Delphi.Entendi a idéia, mas como eu faria isso?Valeu. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 24, 2007 Denunciar Share Postado Outubro 24, 2007 Voce já consegue colocar seu DBNavigator no form principal. Certo?!Então, acho que você poderia utilizar o evento OnActivate dos form's filhos para alterar o dataset ligado ao DBNavigator lá no form principal.Onde estão os datasets em questão? Estão cada qual no respectivo form filho (MDIChild) ou estão em um datamodule?O datasource ao qual você liga seu DBNavigator está no form principal ou em um datamodule? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Warrior.of.Ice Postado Outubro 25, 2007 Autor Denunciar Share Postado Outubro 25, 2007 Em um DataModule. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 25, 2007 Denunciar Share Postado Outubro 25, 2007 Em um DataModule.então, supondo que:- seu form principal chame-se MDIForm1;- seu datamodule chame-se DataModule1;- seus datasources chamem-se respectivamente Datasource1 (para MDIChild1), Datasource2 (para MDIChild1), Datasource3 (para MDIChild1)você poderia colocar no evento OnActivate do form MDIChild1:procedure TMDIChild1.MDIChild1Activate(sender :TObject); begin MDIForm1.DBNavigator1.DataSource := Datasource1; end; você poderia colocar no evento OnActivate do form MDIChild2: procedure TMDIChild2.MDIChild2Activate(sender :TObject); begin MDIForm1.DBNavigator1.DataSource := Datasource2; end;Algo assim. Verifique ser vai funcionar corretamente. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Warrior.of.Ice Postado Outubro 27, 2007 Autor Denunciar Share Postado Outubro 27, 2007 Muito obrigado! Deu certinho.Agora outra duvida. No deactivate, pra eu deixar o campo DataSource em branco novamente, qual o comando??TenteiFrmPrincipal.DBNavigator1.DataSource := null;eFrmPrincipal.DBNavigator1.DataSource := ' ';e nada... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 28, 2007 Denunciar Share Postado Outubro 28, 2007 Agora outra duvida. No deactivate, pra eu deixar o campo DataSource em branco novamente, qual o comando??TenteiFrmPrincipal.DBNavigator1.DataSource := null;eFrmPrincipal.DBNavigator1.DataSource := ' ';e nada...Warrior.of.Ice, sendo a instância de um objeto uma área de memória (ponteiro), então você deve utilizar NIL.-> NULL, seria para atribuir um valor nulo a uma variável do tipo Variant;-> '' (sem espaço entre as áspas simples) seria para atribuir um valor nulo a uma variável do tipo StringAbraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Warrior.of.Ice Postado Outubro 28, 2007 Autor Denunciar Share Postado Outubro 28, 2007 você é demais, cara! Primeiro lugar onde eu consigo tirar minhas dúvidas e onde sempre funciona! hahahaeu to fazendo um projeto em delphi pra uma matéria da facul, e essa parte tá me dando trabalho. Eu quero que pra incluir, dê pra clicar num botão incluir (BitButon) ao invés do Navigator. No caso, eu linkar um campo não dá pois o comando na verdade entraria no onclick do botão... como posso colocar isto no onactivate do botão em cada janela filha?Cara, vou indicar esse fórum pra td mundo que eu conheço, ótimo trabalho =] Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 29, 2007 Denunciar Share Postado Outubro 29, 2007 Eu quero que pra incluir, dê pra clicar num botão incluir (BitButon) ao invés do Navigator.até aqui eu entendi...No caso, eu linkar um campo não dá pois o comando na verdade entraria no onclick do botão... como posso colocar isto no onactivate do botão em cada janela filha?mas aqui, eu me perdi. :unsure: Por acaso, você está querendo colocar em cada janela MDIChild um botão para inclusão dos dados ao invés de utilizar o botão insert do DBNavigator? (mas manterá o esquema com o DBNavigator já resolvido)Cara, vou indicar esse fórum pra td mundo que eu conheço, ótimo trabalho =]espero que você não conheça tanta gente assim, senão não vamos dar conta. :D Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Warrior.of.Ice Postado Outubro 29, 2007 Autor Denunciar Share Postado Outubro 29, 2007 Não, os botões BitButon que eu quero por (Incluir, Excluir, Editar, Cancelar e Confirmar) ficam em um tool bar na janela pai. É a mesma idéia do DBNavigator que você me explicou, mas desta vez eu coloquei botões.O problema é que agora não dá pra mudar um campo das propriedades do botão, na verdade eu teria que mudar o evento onclick pra janela que estivesse ativa no momento.Tendeu? Tem idéia de como faço isso? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 30, 2007 Denunciar Share Postado Outubro 30, 2007 Warrior.of.Ice, neste caso, vale o que você mesmo já disse: "na verdade eu teria que mudar o evento onclick pra janela que estivesse ativa no momento"vou dar duas sugestões:1) criar um procedimento que modifica o evento OnClick dos botões conforme MDIChild ativo:- no seu MDIMain (janela MDI "pai") crie uma função para fazer a atribuição do evento;- nos seus MDIChild (janelas MDI "filhas") crie os procedimentos para cada evento necessário.segue exemplo conceitual (não faça um copiar-colar):// No código do MDIMain ("pai") - uMDIMain.pas type TMDIMain = class(TForm) ... public ... procedure SetButtonEvento(BtnID :Byte; BtnEvent :TNotifyEvent); end; ... procedure TMDIMain.SetButtonEvento(BtnID :Byte; BtnOnClick :TNotifyEvent); begin case BtnID of 1 : BtnInsert.OnClick := BtnOnClick; // botão para insert recebe respectivo evento... 2 : BtnEdit.OnClick := BtnOnClick; // botão para edit recebe respectivo evento... 3 : BtnCancelar.OnClick := BtnOnClick; // botão para cancelar recebe respectivo evento... ... // outros botões end; end; // No código de cada MDIChild ("filhas") - uMDIChild1.pas type TMDIChild = class(TForm) ... public ... procedure btnInsert(Sender :TObject); procedure btnEdit(Sender :TObject); ... // os outros eventos necessários end; uses uMDIMain; ... procedure TMDIChild.btnInsert(Sender :TObject); begin TabNome.Insert; TabNomeCodNome.Value := Max(CodNum)+1; // isto também é conceitual... ... // outras inicializações end; procedure TMDIChild.btnEdit(Sender :TObject); begin ... // inicializações... TabNome.Edit; end; procedure TMDIChild.FormActivate(Sender: TObject); begin MDIMain.SetButtonEvento(1, btnInsert); MDIMain.SetButtonEvento(2, btnEdit); ... // outros botões end; ... // os outros eventos necessários 2) modificar o dataset a ser utilzado peles eventos OnClick dos botões conforme MDIChild ativo: - no seu MDIMain (janela MDI "pai") você coloca um componente TDataSource (DataSourceMain) e cria os eventos OnClick dos botões de forma genérica; - nos seus MDIChild (janelas MDI "filhas") no evento OnActivate, você modifica o dataset linkado ao DataSourceMain; segue exemplo conceitual (não faça um copiar-colar): // No código do MDIMain ("pai") - uMDIMain.pas type TMDIMain = class(TForm) ... procedure btnInsertClick(Sender :TObject); // eventos dos botões criado pelo duplo click nos mesmos procedure btnEditClick(Sender :TObject); // eventos dos botões criado pelo duplo click nos mesmos procedure btnDeleteClick(Sender :TObject); // eventos dos botões criado pelo duplo click nos mesmos public ... private ... end; ... procedure TMDIMain.btnInsertClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin DataSet.Insert; ... // outras ações end; end; procedure TMDIMain.btnEditClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin DataSet.Edit; ... // outras ações end; end; procedure TMDIMain.btnDeleteClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin if MessageDlg('Confirma exclusão do registro selecionado?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DataSet.Delete; end; end; procedure TMDIMain.btnDeleteClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin if MessageDlg('Deseja cancelar alterações realizadas?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DataSet.Cancel; end; end; // No código de cada MDIChild ("filhas") - uMDIChild1.pas type TMDIChild = class(TForm) ... procedure FormActivate(Sender: TObject); private ... public ... end; uses uMDIMain; ... procedure TMDIChild.FormActivate(Sender: TObject); begin MDIMain.DataSourceMain.DataSet := TabNome; // isto é uma atribuição conceitual. Atribua o dataset adequado. end;Esta última abordagem considero mais simples, do ponto de vista de codificação, porém exige uma boa padronização no uso dos datasets fazendo uso dos seus eventos:- OnNewRecord para inicializações de campos, - OnBeforePost para validação de campos antes da "postagem";e alguns outros, conforme aplicação em desenvolvimento.Eu tenho um projeto, onde tenho cadastros simples (uns 10), feitos em DBGrids colocados cada um em um TabSheet, onde existem apenas 3 botões (Inclusão, Alteração e Exclusão) mas com função de 5 (ficam inclusos: Cancelar e Gravar) - a cada Guia selecionada o parent dos botões são alterados. Há um DataSourceGenerico que também é atualizado para cada Guia selecionada. Deste modo, há apenas o código para os três botões funcionando para todos os 10 cadastros!Espero que consiga captar a idéia e utilizá-la em seu projeto.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Warrior.of.Ice Postado Outubro 30, 2007 Autor Denunciar Share Postado Outubro 30, 2007 Nuss, vai dar trampo, mas vou tentar.. bom que eu aprendo bastante coisa aí! Nem sei como te agradecer :P Cara, uma outra dúvida, desta vez prometo que bem simples:minhas janelas filhas estão abrindo com um tamanho padrão que eu não consigo alterar. Independente do tamanho que eu coloco em cada janela, elas abrem com o mesmo tamanho. Eu não encontro onde está a propriedade desse tamanho nem na janela pai, pois já alterei todos os Height e Width que já encontrei e nada. Aonde fica essa configuração? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 31, 2007 Denunciar Share Postado Outubro 31, 2007 Cara, uma outra dúvida, desta vez prometo que bem simples:minhas janelas filhas estão abrindo com um tamanho padrão que eu não consigo alterar. Independente do tamanho que eu coloco em cada janela, elas abrem com o mesmo tamanho. Eu não encontro onde está a propriedade desse tamanho nem na janela pai, pois já alterei todos os Height e Width que já encontrei e nada. Aonde fica essa configuração?Warrior.of.Ice, troque a propriedade BorderStyle dos MDIChild para bsDialog - deve resolver.Obs: para próximas dúvidas, tente manter assuntos diferentes em tópicos diferentes (crie um tópico para cada dúvida). Esta última dúvida, por exemplo, não tinha nada a ver com DBNavigator ou acesso as tabelas. Assim, mantemos a ordem no forum e facilitamos futuras buscas. ;)Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fabioLZS Postado Fevereiro 18, 2011 Denunciar Share Postado Fevereiro 18, 2011 Desculpem ressucitar um tópico tão antigo, mas foi o único que achei onde o que esta sendo explicado é exatamento o que estou tentando fazer.Bom, segui todas as instruções que estão acima e quando mando compilar aparece o seguinte erro:unitcadpessoas.pas(197,37) Error: Wrong number of parameters specified for call to "pesAddClick"que corresponde a essa linha:frmMain.SetBtnEvent(1, pesAddClick);Já tentei passas diversos parâmetros para o a procedure pesAddClick mas nenhuma funcionou. Sempre aparece o mesmo erro.O que estou fazendo de errado? :blink: Graçias! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 18, 2011 Denunciar Share Postado Fevereiro 18, 2011 unitcadpessoas.pas(197,37) Error: Wrong number of parameters specified for call to "pesAddClick"Número errado de parâmetros especificado para chamada a " pesAddClick "OBS: pode ser que tambem não tenha a necessidade de passar nenhum parametroabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fabioLZS Postado Fevereiro 19, 2011 Denunciar Share Postado Fevereiro 19, 2011 Desculpe Jhonas, mas copiei a mensagem de erro errada. Vou colocar aqui todos os códigos que estou usando. tavez esteja fazendo algo errado em outra parte:No form principal:... public { public declarations } procedure SetBtnEvent(BtnID: byte; BtnEvent: TNotifyEvent); end; var frmMain: TfrmMain; implementation ... procedure TfrmMain.SetBtnEvent(BtnID: byte; BtnEvent: TNotifyEvent); begin case btnID of 1: tbAdd.OnClick := BtnEvent; // botão insert end; end; procedure TfrmMain.tbAddClick(Sender: TObject); //botão inserir begin dmMain.zqPES.Insert; ShowMessage('Inserindo...'); //só para testar... end; ... Agora o código no form filho ... public { public declarations } procedure pesAddClick; var frmCadPessoas: TfrmCadPessoas(Sender: TObject); implementation ... procedure TfrmCadPessoas.pesAddClick; //procedimentos que devem ser feitos ao se precionar o botão de inserir no form principal begin if frmValCPF_CNPJ = nil then Application.CreateForm(TfrmValCPF_CNPJ, frmValCPF_CNPJ); frmValCPF_CNPJ.ShowModal; if valCpfCnpj = True then begin dmMain.zqPES.Insert; dmMain.zqFIS.Insert; dmMain.zqEND.Insert; EnableComponents(Self); //função própria UnsetReadOnly(Self); //função própria ClearComponents(Self); //função própria dbeCOD.ReadOnly := True; dbeCOD.Color := clForm; dmMain.zqFISFIS_CPF.AsString := Copy(numCpfCnpj, 1, 3) + '.' + Copy(numCpfCnpj, 4, 3) + '.' + Copy(numCpfCnpj, 7, 3) + '-' + Copy(numCpfCnpj, 10, 2); cbTipo.ItemIndex := 0; dbeNOME.SetFocus; end; end; procedure TfrmCadPessoas.FormCreate(Sender: TObject); begin DisableComponents(Self); filterClick := False; ActiveSQLQuery := dmMain.zqPES; frmMain.SetBtnEvent(1, pesAddClick); //erro nessa linha. Estou usando essa função no form create ao invez de onactive porque por enquanto so tenho 1 form filho. end; . ..Ao compilar aparece esse erro:unitcadpessoas.pas(197,37) Error: Incompatible type for arg no. 2: Got "untyped", expected "<procedure variable type of procedure(TObject) of object;Register>"unitmain.pas(184,20) Hint: Found declaration: TfrmMain.SetBtnEvent(Byte,TNotifyEvent);Já tentei passar varios tipos de parametros e ate deixar sem nada como acima, mas nada funciona. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 21, 2011 Denunciar Share Postado Fevereiro 21, 2011 Ao compilar aparece esse erro:unitcadpessoas.pas(197,37) Error: Incompatible type for arg no. 2: Got "untyped", expected "<procedure variable type of procedure(TObject) of object;Register>"unitmain.pas(184,20) Hint: Found declaration: TfrmMain.SetBtnEvent(Byte,TNotifyEvent);Já tentei passar varios tipos de parametros e ate deixar sem nada como acima, mas nada funciona.unitcadpessoas.pas(197,37) Erro: Tipo incompatível para arg nº. 2: Got " não tipado ", esperado " <procedimento tipo variável de procedure(TObject) de object;Register>" unitmain.pas(184,20) Sugestão: Ache declaração: TfrmMain.SetBtnEvent(Byte,TNotifyEvent);tem um exemplo nesse link de como é montada a função setBtnEvents(btn:MovieClip) ... veja se te ajudahttp://forum.imasters.com.br/topic/407885-...acao-flash-xml/abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fabioLZS Postado Fevereiro 23, 2011 Denunciar Share Postado Fevereiro 23, 2011 Vixi, piorou mais ainda, não manjo nada de java (é java né?).Meu problema e passar a procedure pra um TNotifyEvent. Se eu conseguir fazer isso acho que o resto vai ser fácil.Já vi varios exemplos na net só que todas as procedures estão no mesmo form, e eu quero separa-las para o código não ficar muito confuso. Bom, se não conseguir resolver isso hoje coloco um toolbar em cada form mesmo, fazer o que.Bem, por enquanto obrigado! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 23, 2011 Denunciar Share Postado Fevereiro 23, 2011 Já que voce não entendeu o código do link, então veja esse exemplo:procedure TForm1.Button1Click(Sender: TObject); var btn : TButton; begin btn := Sender as TButton; ShowMessage(btn.Caption); ShowMessage(IntToStr(btn.Left)); btn.OnClick(Sender); end;se voce entender esse, voce resolve o seu problemaabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Warrior.of.Ice
Primeiro post :rolleyes:
Galera, como faz para utilizar um DBNavigator no Form pai e quando abrir as janelas filhas dentro dele, eu passe de um registro para o outro clicando no botão do DBNavigator do pai, sem ter que criar um component pra cada janela filha?
Obrigado!
Link para o comentário
Compartilhar em outros sites
19 respostass a esta questão
Posts Recomendados
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.