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

Delphi

12/01/2006

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

Curtidas 0

Respostas

Rafael Gomes

Rafael Gomes

12/01/2006

normalmente eu crio o form em tempo de execucao, o form é chamado por duplo clique em algum componente referente ao campo que quero pesquisar ...

por exemplo, tenho uma label qualquer referente a algum campo, quando o usuario clica duas vezes a tela de procura aparece ... o empecilho é que para esses componentes que sao usados para as pesquisas eu coloco o nome deles com o mesmo nome do campo da tabela ...
dai na hora de montar a consulta SQL o campo que eu pego o nome do campo atraves de Sender.Name ....

dai para outros campos eu faço typecast e pronto ...

[]ss


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Titanius meu camarada,

Eu crio uma tela de busca para cada situação. Eu geralmente tenho um formulário padrão pra buscar que será o ´pai´ dos outros. Não vejo como criar uma tela padrão para todo o sistema.

Ex: Pesquisa de Funcionários é tranquilo pois sempre é pelo nome. Mas busca de clientes, fornecedor, transportadora vc tem CNPJ, razao social, fantasia, inscr. estadual e outros.

Ou pesquisa de Pedido de Venda. Tem filtro por data, vendedor, sendo que a data pode ser: data emissao, data faturamento, dt cancelamento, etc.

Acho que é mt caso a caso mesmo. Eu crio uma tela pra cadauma e fica show.

Pra preenchero Grid eu uso o NextGrid (nao DBware), daí faço o loop e vou preenchendo e validando como eu preciso.

Vlw!


GOSTEI 0
Titanius

Titanius

12/01/2006

Titanius meu camarada, Eu crio uma tela de busca para cada situação. Eu geralmente tenho um formulário padrão pra buscar que será o ´pai´ dos outros. Não vejo como criar uma tela padrão para todo o sistema. Ex: Pesquisa de Funcionários é tranquilo pois sempre é pelo nome. Mas busca de clientes, fornecedor, transportadora vc tem CNPJ, razao social, fantasia, inscr. estadual e outros. Ou pesquisa de Pedido de Venda. Tem filtro por data, vendedor, sendo que a data pode ser: data emissao, data faturamento, dt cancelamento, etc. Acho que é mt caso a caso mesmo. Eu crio uma tela pra cadauma e fica show. Pra preenchero Grid eu uso o NextGrid (nao DBware), daí faço o loop e vou preenchendo e validando como eu preciso. Vlw!


No meu caso, eu chamo o DBGrid primeiramente, dando um where qualquer que me retorne nada, aih eu vejo os campos, o usuario clica no titulo do dbgrid referente ao campo que ele quer procurar, aih eh preencher o Edit, e monta o SQL de acordo com o campo que o usuario escolheu...

Essa forma, foi a que eu encontrei pra criar uma tela padrão de localizar... mas como eu disse tem algumas desvantagens... Criar uma tela de localizar pra cada ocasião é bem melhor, pois voce controla melhor o que o usuario quer ver, porem da um trabalhão só... imagina criar uma tela pra cada cadastro e tals..? Mas como eu disse, eh bem melhor por voce ter total controle sob o que está sendo feito...

Quanto a esse NextGrid, o que vem a ser isso? ele não é Dataware não? Se nao for, nao fica lento? Pois vc abre uma Query, da um for nela e preenche esse Grid, nao demora não?

[]s


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Titanius,

O NextGrid (www.bergsoft.net) é um Grid que tem DBware tb, mas é pago (60 dolares).

Por carregar na mao nao fica lento de forma alguma. Nos exemplos que vem como o componente ele preenche 100 mil linhas em 1 segundo, é um controle mt rapido mesmo e tem tipo de coluna data, imagem, html, progres barr, etc.... está funcinando perfeitamente.

Da forma que vc está falando eu achei interessante porém este de fazer um select vazio pra pegar as colunas nao acho uma boa pois é um trafego q vc gera desnecessário.. mas é aquela velha coisa.. cada caso é um caso.. eu evito ia o banco de dados ao máximo, ao extremo!

Vlw!


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

Titanius meu camarada, Eu crio uma tela de busca para cada situação. Eu geralmente tenho um formulário padrão pra buscar que será o ´pai´ dos outros. Não vejo como criar uma tela padrão para todo o sistema. Ex: Pesquisa de Funcionários é tranquilo pois sempre é pelo nome. Mas busca de clientes, fornecedor, transportadora vc tem CNPJ, razao social, fantasia, inscr. estadual e outros. Ou pesquisa de Pedido de Venda. Tem filtro por data, vendedor, sendo que a data pode ser: data emissao, data faturamento, dt cancelamento, etc. Acho que é mt caso a caso mesmo. Eu crio uma tela pra cadauma e fica show. Pra preenchero Grid eu uso o NextGrid (nao DBware), daí faço o loop e vou preenchendo e validando como eu preciso. Vlw!


Eu gostei da ideia do Romulo, parece bem legal.
Onde eu trabalho a pesquisa fica no próprio form onde os dados são mostrados. Existe um botão que chama um procedimento. Este procedimento aponta para um form, uma para cada tipo de tela, cada tipo de cadastro.

Particularmente acho legal essa idéia, pq vc tem controle total sobre a pesquisa. Já trabalhei em locais onde a tela de pesquisa era genérica, mas neste caso as pesquisas eram sempre pelo mesmo tipo de campo, ou seja, não tinha muito o que se preocupar.


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Adriano,

Pra ver como eu consigo flexibilidade desta forma:

O meu sistema é para lojas de comércio varejista (especificamente pra Lojas de Eletrodoméstico.. mas atende a qualquer comércio). Eu fechei com uma construtura que faz terraplanagem em munícipios da região.

O que fiz? Por exemplo, meu cadstro de produto é bem grande para uma loja, mas para a construtura ele é muito reduzido a alguns campos. Então eu criei parametros no sistema.

Tela de Pesquisa 1 ou 2. De acordo com uma tabela de parametros a busca fica diferente.

Desta forma quando estou numa loja com Pesquisa = 1 tenho as opções:

CODIGO PRODUTO
DESCRICAO
REFERENCIA
COD. BARRAS
COD. FORNECEDOR
FORNECEDOR (abre outra busca dos fornecedores)

Quando a busca é do tipo 2 ele tem as opções:

PRODUTOS
EQUIPAMENTOS
AMBOS.

Na construtora ele so tem 2 tipos de produto. Produtos comuns que são usados na obra (tijolo, pedra, areia, etc..) e ferramentas da propria empresa. Iso pra pra saber onde está a ferramenta pra evitiar furtos.

Com esta tela personalizada eu consigo num único sistema atender a todos os meus clientes. Jà tenho 7 parametros!..hehehehe.. um dia vou chegar a Microsiga que tem uns 6000 parametros!!!!

Acho que nao adianta. Quando agente tem que deixar flexibilidade e detalhar bem as interfaces se nao pegar bem no código nao fica legal. Acho buscas genéricas coisa somente para tabelas auxiliares, tipo Tipo de Cobraça, forma de pagamento, tipo de produto, etc.

Na verdade venho do VB (vivo dele na verdade, Delphi está em projeots externos até eu formar minha empresa) e nele nao temos Data Modules e outras coisas, é tudo no braço! Por isso no VB temos muita qualidade (depende do programador, claro!...).

Vlw!


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

Oi Rômulo, ai sim, como parâmetros a história muda.
Você pode fazer o que quiser, terá controle total concordo plenamente.

Agora me diz uma coisa, como faz com os insumos? rsrs...já desenvolvi programas para construtoras, rsrs....sei que é a maior treta a parte de insumos.


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Cara,

To bem no inicio. To no controle de Obra, Requisições da Obra (com seus produtos/equipamentos) e gerando relatório de custo da obra, movimentacao de estoque e outros.

Na verdade o cara cara alguns milhoes no ano porem nunca teve qualquer informatizacao e ta a maior dificuldade pra poder fazer o sistema pois eles nem sabem o q querem direito.

Daí não chegamos na parte de insumos (que na verdade nem sei direito o que é!. :D )....

Quando estiver avançando eu te falo. Se quiser, e tiver tempo, eu te mando o programa e o FBCLIENT.DLL que o acesso funciona num banco remoto Firebird. Assim q to testando. Se tiver banda larga roda na boa.


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

Cara, To bem no inicio. To no controle de Obra, Requisições da Obra (com seus produtos/equipamentos) e gerando relatório de custo da obra, movimentacao de estoque e outros. Na verdade o cara cara alguns milhoes no ano porem nunca teve qualquer informatizacao e ta a maior dificuldade pra poder fazer o sistema pois eles nem sabem o q querem direito. Daí não chegamos na parte de insumos (que na verdade nem sei direito o que é!. :D ).... Quando estiver avançando eu te falo. Se quiser, e tiver tempo, eu te mando o programa e o FBCLIENT.DLL que o acesso funciona num banco remoto Firebird. Assim q to testando. Se tiver banda larga roda na boa.



Ah, sua dor de cabeça ainda vai começar...rsrs...não é difícil, mas é chato.
Se precisar de um help pode chamar.


GOSTEI 0
Titanius

Titanius

12/01/2006

é pelo que estou vendo, realmente o pessoal prefere fazer uma tela de localizar pra cada coisa... mas me digam.. o sistema nao fica lento nao? vamos supor 40 telas de cadastros, consequentemente mais 40 telas de localizar...ao todo sao 80 telas, e o que eh melhor, usar dBWare ou normal como o romulo faz?

[]s


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Titanius,

Lento não fica. Exemplo, eu para abrir a busca de Produtos faço:

var
  Frm:  TFrmPesquisarProdutos;
  Produto: Integer;
begin

  Frm := TFrmPesquisarProdutos.Create(Self);
  Produto := 0;

  try
    Frm.ShowModal;
    Produto := Frm.ProdutoSelecionado;
  finally
    Frm.Release;
    FreeAndNil(Frm);
  end;

  if Produto > 0 then
      CarregarDadosDoProduto(Produto)
  else
      LimparCampos;
end;



Quer dizer, eu abro a busca, pesquiso o que preciso e destruo logo o bjeto. Nâo uso aquele CreateForm. No source do meu projeto eu só crio na inicialização meu formulario principal e o Data Module, do resto é tudo deste jeito e nao tenho absolutamente nenhum problema.

Caraca.. este é o fórum mais produtivo que já participei, geralmente foruns sao cheios de briguinhas ridiculas, discussoes inuteis ou OFF-TOPIC o tempo todo.

Vlw!!!!


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Titanius,

Só uma coisa, quanto a usar DBware ou não eu nao uso DBWare nas minhas pesquisas pois nao posso comprar o NextDBGrid da bergsoft!... :(


GOSTEI 0
Jairroberto

Jairroberto

12/01/2006

Olá, Fellipe!

Criei alguns formulários padronizados de cadastro que são herdados por todos os formulários de cadastro da aplicação. Nele há um PageControl com duas abas: Filtro e Cadastro. A tela sempre se abre no filtro, onde o usuário pode escolher o campo desejado na pesquisa, o operador (igual a, contém, etc., limitado de acordo com o tipo de campo selecionado) e o valor ou valores que deseja filtrar. Abaixo destas opções é apresentado o resultado em um DBGrid. Na aba Cadastro ficam os detalhes de cada registro. Como o formulário de pesquisa é o mesmo do cadastro, a formatação do campos e os títulos do DBGrid do Filtro são ajustados de acordo com o mesmo DataSet usado para inserção, edição e exclusão. Não deixa de ser um formulário de pesquisa para cada cadastro, porém os recursos de dados utilizados são os mesmos para ambos. A única preocupação é mudar Visible para False nos campos que não devem constar da pesquisa. Lembra-se da tal Orientação a Objetos?! Esse formato é ótimo, pois qualquer melhora implementada no mecanismo de pesquisa dos formulários ´pais´ são refletidas automaticamente em todos os formulários de cadastro, e o que é melhor, de todos os sistemas que desenvolvemos.

Há também a necessidade de pesquisa em campos específicos que correspondem a chaves estrangeiras em tabelas auxiliares. Neste caso, criei um diálogo padronizado para o qual passo alguns parâmetros que permitem fazer a consulta em campos pré-determinados, recebendo de volta o valor chave do registro selecionado. Neste diálogo o usuário também pode selecionar o operador e o valor a ser pesquisado e a formatação do valores retornados é realizada em função do tipo de campo retornado. O título dos campos retornados é passado juntamente com o nome deles na tabela, em um formato pré-definido pela rotina (Ex.: ´PesNome <Nome>´ ou simplesmente ´Nome´ caso o nome do campo seja mesmo ´Nome´).


Um abraço,
Jair


GOSTEI 0
Titanius

Titanius

12/01/2006

Realmente, a única ´desvantagem´ que vejo nisso eh a quantidade de forms no projeto.. mais se bem que isso não é desvantagem.. :wink:

Agora, tenho outras discussões :D

Romulo, esta é pra vc:
Esse NextGrid (normal, não o dataware) é gratuito? pois baixei ele, e instalei e nao me fala nada de pagar... por sinal um otimo grid... gostei muito dele...

Essa é pra todos:

E os campos Lookups? como vocês fazem?
tipo, numa tabela: VENDAS
IDVENDA
IDCLIENTE
VALOR
...

Note que na tabela soh tem o IDCLIENTE, e na tela, como voces trazem ele? No meu caso, coloco um Edit pra colocar o codigo, e um outro Edit que exibe o nome do cliente, e trago este nome via FK no SQL.
Ou vocês usam o DBLookupComboBox?

[]s


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

var
  Frm:  TFrmPesquisarProdutos;
  Produto: Integer;
begin

  Frm := TFrmPesquisarProdutos.Create(Self);
  Produto := 0;

  try
    Frm.ShowModal;
    Produto := Frm.ProdutoSelecionado;
  finally
    Frm.Release;
    FreeAndNil(Frm);
  end;

  if Produto > 0 then
      CarregarDadosDoProduto(Produto)
  else
      LimparCampos;
end;



Posso te dar uma dica Romulo? A única modificação que faria no seu código é:



var
  Produto: Integer;
begin

  FrmPesquisarProdutos := TFrmPesquisarProdutos.Create(Self);
  Produto := 0;

  with FrmPesquisarProdutos do 
  begin
    try
      ShowModal;
      Produto := ProdutoSelecionado;
    finally
      Release;
      FreeAndNil(FrmPesquisarProdutos);
    end;
  end;
  if Produto > 0 then
      CarregarDadosDoProduto(Produto)
  else
      LimparCampos;
end;



Eu retirei a variavel Frm, não muda nada, mas fica mais simples...eu acho.


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

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!


GOSTEI 0
Titanius

Titanius

12/01/2006

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


GOSTEI 0
Titanius

Titanius

12/01/2006

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


GOSTEI 0
Renatacoimbra

Renatacoimbra

12/01/2006

Pessoal esse NextDBGrid pagoWare vem com os fontes tb ?

[]´s


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Sim.

Veja no site www.bergsoft.net


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

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!


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

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.


GOSTEI 0
Jairroberto

Jairroberto

12/01/2006

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


GOSTEI 0
Titanius

Titanius

12/01/2006

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


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

[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.


GOSTEI 0
Titanius

Titanius

12/01/2006

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


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

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!


GOSTEI 0
Jairroberto

Jairroberto

12/01/2006

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


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

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.


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

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.


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Realmente o debug do Delphi eu acho (se me permitem) muito ruim. O do VB dá show.


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

Realmente o debug do Delphi eu acho (se me permitem) muito ruim. O do VB dá show.


Até o Delphi 6.0 tranquilo, excelente. Mas do 7 nao sei o que aconteceu.


GOSTEI 0
Sourcecode

Sourcecode

12/01/2006

Eu uso uma tela padrão que é totalmente parametrizável, tipo, dá pra definir em runtime onde vai pesquisar, que campos vão estar disponíveis, posso fazer uma pesquisa simples ou adicionar filtros, entre outras coisas, pena não estar aqui pra tirar uma screen deu um belo trabalho pra fazer mas ficou muito bom, só tá faltando mesmo a nextgrid que pretendo comprar, é excelente este componente, tem também a Express Quantum Grid da www.devexpress.com, muito boa também, não tem o visual bonitinho da next porém tem muito mais funções, eu acho até que ela tem coisas até d+... rsrs pena ser tão cara, preço varia de $699.99 até alguns milhares de dólares, dependendo do tipo de licença que você for precisar... esse pessoal é meio afastado de Deus, tem outra grid muito boa também a da TMS: TMSGridPack, que inclusive tem uma grid que tem suporte nativo a arquivos do excel inclusive com campo de cálculo, tipo A1 + B1, idêntico ao excel, muito xique, mas é carinha também, estamos precisando de uma grid com o melhor dessas 3 aí e opensource, alguém se habilita? rsrs

[]´s


GOSTEI 0
The_holyman

The_holyman

12/01/2006

Tenta deixar o meu sistema o mais orientado a objetos possivel(pq ainda sou iniciante na tecnica) entao eu crio uma tela unica de cadastro que dela eu herdo todas as outras , para a pesquisa eu criei uma somente onde tenho um Edit e DbGrid ligado a um query, a questão é tenho um método no meu Data Module que chama a pesquisa, no cabecalho do método eu digo, a tabela de pesquisa, o campo da pesquisa, os campos exibidos(isso já inclue como eu quero q eles apareçam),o campo de retorno(ou seja se eu quizer fazer um tipo lookup é só dizer o campo de qual tabela eu quero q o resultado preencha) e por fim o ´filtro´ é na verdade uma clausula WHERE e pronto assim, tenho tela padrões(ou seja facil para o usuario se situar), tenhoa um busca incremental(vai achando a medida q o usuario digita) e ainda posso filtrar e retornar para onde eu quizer essa informação, qualquer coisa eu tenho algumas coisinhas hospedadas nesse site: www.jb0.org/the_holyman.

Ate mais galera!


GOSTEI 0
Titanius

Titanius

12/01/2006

Tenta deixar o meu sistema o mais orientado a objetos possivel(pq ainda sou iniciante na tecnica) entao eu crio uma tela unica de cadastro que dela eu herdo todas as outras , para a pesquisa eu criei uma somente onde tenho um Edit e DbGrid ligado a um query, a questão é tenho um método no meu Data Module que chama a pesquisa, no cabecalho do método eu digo, a tabela de pesquisa, o campo da pesquisa, os campos exibidos(isso já inclue como eu quero q eles apareçam),o campo de retorno(ou seja se eu quizer fazer um tipo lookup é só dizer o campo de qual tabela eu quero q o resultado preencha) e por fim o ´filtro´ é na verdade uma clausula WHERE e pronto assim, tenho tela padrões(ou seja facil para o usuario se situar), tenhoa um busca incremental(vai achando a medida q o usuario digita) e ainda posso filtrar e retornar para onde eu quizer essa informação, qualquer coisa eu tenho algumas coisinhas hospedadas nesse site: www.jb0.org/the_holyman. Ate mais galera!


e aí blz?

O seu jeito de criar está precido com o meu, tomei a liberdade de ver lá no link que você indicou, em algum sistema que está lá você usa este tipo de tela que vc citou? Ou poderia me enviar algum exemplo de como vc faz?

[]s


GOSTEI 0
The_holyman

The_holyman

12/01/2006

Beleza cara, olha lá tem sim um sistema que usa isso, mas ultimamente implementei algumas melhorias que não estão lá!

O SGE e o SISCOMV

o do SISCOMV é mais atual, bem a coisa é simples!(pelo menos eu axo simples, vc poderia até me ajudar a melhorar).

me manda um email e ai te passo os arquivos com o código!

o meu email é isaac.cavalcanti@gmail.com

ate mais, espero realmente poder ajudar!


GOSTEI 0
Sourcecode

Sourcecode

12/01/2006

Só alertando, tome muito cuidado com os sqls, uma pesquisa mal feita pode resultar em trava do servidor, não sei qual é o seu caso, mas faça com cuidado e teste bastante, principalmente quando a pesquisa retorna um grande volume de dados, se estiver usando firebird pode usar ´First 30´ por exemplo para não deixar a pesquisa trazer 200 mil registros :)


GOSTEI 0
POSTAR