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

Como Usar Um Dbnavigator P/ Várias Janelas Mdi?


Warrior.of.Ice

Pergunta

19 respostass a esta questão

Posts Recomendados

  • 0

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?

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0
Agora outra duvida. No deactivate, pra eu deixar o campo DataSource em branco novamente, qual o comando??

Tentei

FrmPrincipal.DBNavigator1.DataSource := null;

e

FrmPrincipal.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 String

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

você é demais, cara! Primeiro lugar onde eu consigo tirar minhas dúvidas e onde sempre funciona! hahaha

eu 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 =]

Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0

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?

programalq5.th.png

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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?

Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0

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!

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
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 ajuda

http://forum.imasters.com.br/topic/407885-...acao-flash-xml/

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

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!

Link para o comentário
Compartilhar em outros sites

  • 0

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 problema

abraço

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,5k
×
×
  • Criar Novo...