Como vocês criam suas telas de Localizar? Vamos debater?

12/01/2006

0

Bom dia a todos,

Estou aqui para lançar mais uma discussão, que ao meu ver ajudará muita gente, pois esse dúvida não só eu tenho...

[b:29324df17b]Como vocês criam suas telas de localizar?[/b:29324df17b]

Eu crio assim:

Tenho uma tela padrão, com um Edit e um DBGrid, o DBGrid está vinculado a um SQL em um Datamodule...

pois bem, sempre que preciso chamo a tela passando o parametro NOMETABELA, e quando o usuario digita algo no Edit, ele cria um SQL e retorna no DBGrid, eu pego os valores no DataSet no DataModule.

Funciona perfeitamente, porem tem alguns contras:

- É dificil você personalizar o que você quer trazer, pois em SQL traz tudo que está no banco...
- Traz os nomes do banco no titulo do DBGrid.
- Não vem formatado os dados no grid.

Pois bem, todos os contras eu consegui resolver, mas fica muito ´lento´ ao exibir pro usuário..

então por isso estou escrevendo isso, queria trocar um idéia de como criar uma tela de localizar padrão pro sistema inteiro, e de fácil customizacao..

[]s a todos...


Titanius

Titanius

Responder

Posts

12/01/2006

Romulocpd

Olá Adriano,

Sim, a dia é boa. Assim vc propoe que a variavel seja global então? Vou ver como posso melhorar meu código, mas o meu ta ruim não né!? hehe.


Titanius,

O Grid é grátis porém o NextDBGrid é pago. Uma vergonha eu não ter comprado. Custa 49 dólares. Mandei um e-mail para a empresa dizendo que o Dólar no Brasil custa R$ 2,50 blá. Dei aquela enrolada. Ganhei um desconto e vou pagar $29 pelo NextDBGrid!

Me apurrinhei e vou comprar logo. Teste o componente antes, verá que é bom.

Vlw!


Responder

12/01/2006

Titanius

Olá Adriano, Sim, a dia é boa. Assim vc propoe que a variavel seja global então? Vou ver como posso melhorar meu código, mas o meu ta ruim não né!? hehe. Titanius, O Grid é grátis porém o NextDBGrid é pago. Uma vergonha eu não ter comprado. Custa 49 dólares. Mandei um e-mail para a empresa dizendo que o Dólar no Brasil custa R$ 2,50 blá. Dei aquela enrolada. Ganhei um desconto e vou pagar $29 pelo NextDBGrid! Me apurrinhei e vou comprar logo. Teste o componente antes, verá que é bom. Vlw!



hehehe, o famoso jeitinho brasileiro...vou testar o componente, me parece muito bom mesmo, se o DB for tao rapido quanto o normal eh, putz, vale a pena comprar...


[]s


Responder

12/01/2006

Titanius

Olá Adriano, Sim, a dia é boa. Assim vc propoe que a variavel seja global então? Vou ver como posso melhorar meu código, mas o meu ta ruim não né!? hehe. Titanius, O Grid é grátis porém o NextDBGrid é pago. Uma vergonha eu não ter comprado. Custa 49 dólares. Mandei um e-mail para a empresa dizendo que o Dólar no Brasil custa R$ 2,50 blá. Dei aquela enrolada. Ganhei um desconto e vou pagar $29 pelo NextDBGrid! Me apurrinhei e vou comprar logo. Teste o componente antes, verá que é bom. Vlw!



hehehe, o famoso jeitinho brasileiro...vou testar o componente, me parece muito bom mesmo, se o DB for tao rapido quanto o normal eh, putz, vale a pena comprar...


Só acrescentando... no codigo acima, a variavel nao eh global, note
FrmPesquisarProdutos := TFrmPesquisarProdutos.Create(Self);

a Variavel eh o proprio nome do Form, ou seja, esta variavel ja esta declarada no projeto...

soh outra pergunta... no codigo:

finally
Release;
FreeAndNil(FrmPesquisarProdutos);

o Release já não faz o trabalho do FreeAndNil não?


[]s


Responder

12/01/2006

Renatacoimbra

Pessoal esse NextDBGrid pagoWare vem com os fontes tb ?

[]´s


Responder

12/01/2006

Romulocpd

Sim.

Veja no site www.bergsoft.net


Responder

12/01/2006

Romulocpd

Titanius,

Até onde eu sei o Release finaliza os eventos de interface que ainda estao pendentes (teclado e mouse). Pensando bem acho que o FreeAndNil já fecha o objeto na hora, mas sei lá, eu uso assim pra garantir!

Aquela variavel que é criada quando o form é criado eu removo todas!.heheh.. vou ter que rever, mas devo continuar do jeito antigo mesmo.

Agora, vc viu os exemplos do NextGrid? Viu a velocidade? Muito sinistro.. eu gostei do componente pois tudo ele tem LINHA, COLUNA. No OnChange vc tem os parametros ACol, ARow e isso pra mim é essencial! Fora outras propriedades tipo ColumnByName e outras. Eu nao conheço 40¬ dos recursos do grid, tem pesquisa e tudo.

Vlw!


Responder

12/01/2006

Adriano Santos

Olá Adriano, Sim, a dia é boa. Assim vc propoe que a variavel seja global então? Vou ver como posso melhorar meu código, mas o meu ta ruim não né!? hehe.


Não Romulo, não está ruim seu código, muito pelo contrário. É que quando se quer criar um form em runtime como vc está fazendo, não há a necessidade de criar uma variável para ele.

Você pode até criar assim:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(Self) do
  begin
    try
      ShowModal;
    finally
      FreeAndNil(Form2);
    end;
  end;
end;


Isso serve tamém para componentes

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TOpenDialog.Create(Self) do
  begin
    InitialDir := ´C:\Temp\´;
    DefaultExt := ´bmp´;
    Filter := ´Arquivos Bitmaps(*.BMP)|*.bmp|Todos os arquivos(*.*)|*.*´;
    if Execute then
    begin
      ShowMessage(´O usuário escolheu o arquivo: ´ + FileName);
    end;
  end;
end;


Note que estou usando o método Create da classe que quero criar TForm2 e TOpenDialog. Eu vejo poucas pessoas usarem esta técnica e é algo simples.


Responder

12/01/2006

Jairroberto

Olá, Fellipe!

Usar a chave estrangeira no SQL é a melhor opção, exceto para tabelas auxiliares muito pequenas, utilizadas em alguns casos, onde pode-se usar um campo lookup.

Aproveitando o exemplo do Romulo, comentado pelo Adriano, eu gostaria de acresentar um comentário também sobre algo que aprendi com o Guinter num edição recente da Clube Delphi e que pode ser útil: quando você usa um campo de chave estrangeira em uma cláusula SQL, como o nome do produto, por exemplo, é menos oneroso para a rede aproveitar o retorno da rotina de pesquisa para alimentar também esse campo. Vou dar um exemplo mostrando somente a parte relacionada a isso:

Um diálogo de pesquisa:
interface

  TDlgPesquisa = class(TForm)
    ...
  public
    class function Executar(const SQL: string; var Id: Integer; var Nome: string): Boolean;
    property Id: Integer read GetId write SetId;
    property Nome: string read GetNome write SetNome;
  end;

implementation
...

  class function TDlgPesquisa.Executar(const SQL: string; var Id: Integer; var Nome: string): Boolean;
  var
    // A variável local é importante para permitir várias instâncias ao mesmo tempo
    DlgPesquisa: TDlgPesquisa;
  begin
    DlgPesquisa := TDlgPesquisa.Create(nil);
    try
      Result := IsPositiveResult(DlgPesquisa.ShowModal);
      if Result then
      begin
        Id := DlgPesquisa.Id;
        Nome := DlgPesquisa.Nome;
      end;
    finally
      DlgPesquisa.Release;
    end;
  end;
...
end.


A chamada a partir do formulário de cadastro (é só um exemplo hipotético):
  uses
    ..., Dlg_Pesquisa;

  procedure TFormCadastro.BtnPesquisarNomeClick(Sender: TObject);
  var
    IdProduto: Integer;
    NomeProduto: string;
  begin
    if TDlgPesquisa.Executar(´SELECT "PrdId", "PrdNome" FROM PRODUTOS´, IdProduto, NomeProduto) then
    begin
      cdsVendasVenPrdId.AsInteger := IdProduto;
      cdsVendasPrdNome.AsString := NomeProduto;
    end;
  end;


Considerando que o CommandText do cdsVendas seja ´SELECT VENDAS.*, PRODUTOS.´PrdNome´ FROM VENDAS LEFT JOIN PRODUTOS ON (PRODUTOS.´PrdId´ = VENDAS.´VenPrdId´)´, a alimentação direta do campo cdsVendasPrdNome com o valor retornado da rotina de pesquisa junto com o ID economiza uma nova consulta ao banco de dados pelo ID do Produto para pegar o seu Nome após o retorno positivo da pesquisa. Em um select desse tipo, no SQLDataSet vinculado ao cdsVendas é necessário adicionar os TFields e alterar a propriedade ´ProviderFlags´ do campo ´PrdNome´ para ´[]´.

Esse exemplo não se aplica diretamente ao exemplo dado pelo Romulo, pois certamente ele deve precisar de mais informações do produto alimentadas pela rotina ´CarregarDadosDoProduto(Produto)´, e além o uso da rotina ´LimparCampos´ demonstra que ele deve trabalhar com componentes não dataware e certamente sem joins no SQL. Mas pode ser útil para os que trabalham desse outro jeito.


Um abraço,
Jair


Responder

12/01/2006

Titanius

Titanius, Até onde eu sei o Release finaliza os eventos de interface que ainda estao pendentes (teclado e mouse). Pensando bem acho que o FreeAndNil já fecha o objeto na hora, mas sei lá, eu uso assim pra garantir! Aquela variavel que é criada quando o form é criado eu removo todas!.heheh.. vou ter que rever, mas devo continuar do jeito antigo mesmo. Agora, vc viu os exemplos do NextGrid? Viu a velocidade? Muito sinistro.. eu gostei do componente pois tudo ele tem LINHA, COLUNA. No OnChange vc tem os parametros ACol, ARow e isso pra mim é essencial! Fora outras propriedades tipo ColumnByName e outras. Eu nao conheço 40¬ dos recursos do grid, tem pesquisa e tudo. Vlw!


Sinistro mesmo... Gostei dessa possibilidade de linha x coluna... foi o que me agradou nele.. hehe... vou pensar em usar ele na minha tela de localizar.. hehe..porque com 100.000 foi rapidissimo, duvido algum select trazer 100.000 registros.. heehe, eu barro pra trazer no maximo 100 de cada vez... vai ficar um tiro.. hehe...


[]s


Responder

12/01/2006

Adriano Santos

[b:0a54de7214]Sobre o Release[/b:0a54de7214]
[quote:0a54de7214=´Help do Delphi´]
Use Release to destroy the form and free its associated memory.

Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form´s event queue are processed before the form is released. Any event handlers for the form or its children should use Release instead of Free (Delphi) or delete (C++). Failing to do so can cause a memory access error.
[/quote:0a54de7214]

[b:0a54de7214]Sobre o FreeAndNil[/b:0a54de7214]
[quote:0a54de7214=´Help do Delphi´]
Use FreeAndNil to ensure that a variable is nil (Delphi) or NULL (C++) after you free the object it references. Pass any variable that represents an object as the Obj parameter.
[/quote:0a54de7214]

finally ...Release; ...FreeAndNil(FrmPesquisarProdutos); o Release já não faz o trabalho do FreeAndNil não?



Até onde eu sei o Release finaliza os eventos de interface que ainda estao pendentes (teclado e mouse). Pensando bem acho que o FreeAndNil já fecha o objeto na hora, mas sei lá, eu uso assim pra garantir!



Bom o que diz no help é que o Release garante a execução de todos os eventos do objeto em questão mesmo depois de seu ´Release´, ok?
Já o FreeAndNil libera o objeto da memória e toda sua referência além de marcá-lo como Nil.

Vejo muita gente usando o seguinte:

Na criação e uso do Form;
try
  MeuForm.ShowModal;
finally
  MeuForm.Free;
end;


E no onDestroy do Form colocam

   Form := Nil;


Não é necessário pq o FreeAndNil já o faz.


Responder

12/01/2006

Titanius

Realemnte Jair, eu gosto de usar o FK, pois eu trago tudo de uma vez, tudo que eu preciso, ou seja, pode demorar ate um pouco mais, mas eh melhor do que ficar indo no banco pra trazer tudo, como seria o caso de um DBLookupComboBox... pois teria que abrir uma Query com os nomes, toda vez que abrir o Form.. ou seja, ao inves de trazer somente 1 registro, trago todos..

[]s


Responder

12/01/2006

Romulocpd

Adriano,

Agora entendi! Po, muito show!!!!!!!!!!!!!! Então ele nem chega a criar variável, nada!.. após finalizar o end with os recursos utilizados são logo liberados?

Show kra!!! Vlw!!! Vou trocar tudo pra este jeito!


Responder

12/01/2006

Jairroberto

Adriano:

Esse formato é mesmo muito útil. A única perda é nos recursos de mouse durante o debug. Usando dessa forma o mouse over não apresenta o valor das propriedades da classe criada no with, pelo menos até o Delphi 6. Fora isso, funciona muito bem.

A propósito, seguindo as recomendações do help do próprio Delphi, eu uso ´Release´ para destruir formulários (Delphi 6).


Um abraço,
Jair


Responder

12/01/2006

Adriano Santos

Adriano, Agora entendi! Po, muito show!!!!!!!!!!!!!! Então ele nem chega a criar variável, nada!.. após finalizar o end with os recursos utilizados são logo liberados? Show kra!!! Vlw!!! Vou trocar tudo pra este jeito!


Veja, cada caso é um caso (como eu sempre digo) rsrs.
Só tome cuidado com os Acessos Violentos, opa, Access Violations, rsrs, da vida, pois a palavra reservada Self significa que quem vai controlar o objeto é ele mesmo. Se usar Application ai é a aplicação. Isso interfere em quem vai liberar o objeto da memória.


Responder

12/01/2006

Adriano Santos

Adriano: Esse formato é mesmo muito útil. A única perda é nos recursos de mouse durante o debug. Usando dessa forma o mouse over não apresenta o valor das propriedades da classe criada no with, pelo menos até o Delphi 6. Fora isso, funciona muito bem. A propósito, seguindo as recomendações do help do próprio Delphi, eu uso ´Release´ para destruir formulários (Delphi 6). Um abraço, Jair


Faço minhas suas palavras se me permite. :wink:
Vou testar no Delphi 7.0, agora não me recordo se acontece a msm coisa a respeito do Debug. Sei que o Debug do Delphi 7.0 tem um monte de problemas.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar