Como diminuir o código fonte
pessoal, estou desenvolvendo 1 projeto só que muitas linha de comandos são identicas, só muda alumas linhas vou mostra um exemplo:
Neste exemplo a unica coisa q muda é que foi desabilita o pop-up menu. Tenho várias linhas q mudam pouca coisa. então gostaria de saber se tem como eu reduzir o código. com [b:2d8170e406]procedures[/b:2d8170e406], [color=green:2d8170e406][i:2d8170e406]dlls[/i:2d8170e406][/color:2d8170e406], [b:2d8170e406]label (goto) [/b:2d8170e406]ou qualquer outra forma de bloco de código.
Acredito q outras pessoas também tem a mesma dúvida.
:P Abraço a todos.
case TNServico.PageIndex of 0:begin //OS if (CBServico.Text=´Concluído´) Then begin //Desabilita menu pop-up PMImprimir.Items[0].Enabled:=True; // Imprimir PMImprimir.Items[0].Caption:=´Imprimir Laudo´; PMImprimir.Items[1].Enabled:=False; // Salvar end else begin //Habilita menu pop-up PMImprimir.Items[0].Enabled:=True; // Imprimir PMImprimir.Items[0].Caption:=´Imprimir e Salvar Ordem...´; PMImprimir.Items[1].Enabled:=True; // Salvar end; mouse_event(MOUSEEVENTF_RIGHTDOWN,0, 0, 0, 0); sleep(1); mouse_event( MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); end; //bloco 0
Neste exemplo a unica coisa q muda é que foi desabilita o pop-up menu. Tenho várias linhas q mudam pouca coisa. então gostaria de saber se tem como eu reduzir o código. com [b:2d8170e406]procedures[/b:2d8170e406], [color=green:2d8170e406][i:2d8170e406]dlls[/i:2d8170e406][/color:2d8170e406], [b:2d8170e406]label (goto) [/b:2d8170e406]ou qualquer outra forma de bloco de código.
Acredito q outras pessoas também tem a mesma dúvida.
:P Abraço a todos.
Vagner.oliveira
Curtidas 0
Respostas
Raserafim
02/09/2006
deixar o código limpo e sem redundância é importante e uma boa prática de programação. facilita muito na busca de erros, e na manutenção do sistema.
quando ainda da falta de experiência o programador acaba por desenvolver sem muito planejamento e o resultado é duplicação de código. é importante parar, rever o código e refazer. assim ganha-se experiência e aprendizagem, aumentando a capacidade do programador de já desenvolver cada vez mais, e institivamente, de forma planejada e organizada.
mas vamos a resposta:
sempre que vc tiver o mesmo código sendo repetido em várias chamadas no sistema, vc deve alocar este código em procedures e, dependendo do caso, em funções. assim vc já vai economizar muita digitação.
pela sua citação ao GOTO deu pra perceber que vc é remanescente das linguagens estruturadas. estude sobre programação orientado a objeto que vc vai ver uma imensidão de espaço para a redução de código e reaproveitamento.
mas só para introduzir:
as vezes mesmo querendo colocar um código em procedure para utilizar em outras chamadas, não é possível pois se refere a um componente do mesmo tipo, porém com nome diferente.
vc pode, então, explorar o SELF e principalmente o SENDER.
assim:
digamos que vc tenha vários componentes Edits em um form. e vc quer que ao receber o foco (OnEnter) ele receba o nome ´entrou´.
pelo método tradicional, vc iria colocar no primeiro edit
no segundo
no terceiro
vc não consegue colocar isto em uma procedure pois para cada um teria que ser uma procedure diferente.
veja a solução:
crie uma procedure que receba o parâmetro Sender
no evento OnEnter de cada Edit coloque
perceba que em todos (ou na grande parte) dos eventos tem um parâmetro Sener, este é o componente que chamou o evento.
ou ainda vc poderia colocar
no OnEnter do Edit1 e nos outros vc colocartia no Object Inspector apontando para o mesmo método.
é isso æ, vá refazendo os códigos, estudando POO e a experiência vai enriquecendo a qualidade dos códigos
quando ainda da falta de experiência o programador acaba por desenvolver sem muito planejamento e o resultado é duplicação de código. é importante parar, rever o código e refazer. assim ganha-se experiência e aprendizagem, aumentando a capacidade do programador de já desenvolver cada vez mais, e institivamente, de forma planejada e organizada.
mas vamos a resposta:
sempre que vc tiver o mesmo código sendo repetido em várias chamadas no sistema, vc deve alocar este código em procedures e, dependendo do caso, em funções. assim vc já vai economizar muita digitação.
pela sua citação ao GOTO deu pra perceber que vc é remanescente das linguagens estruturadas. estude sobre programação orientado a objeto que vc vai ver uma imensidão de espaço para a redução de código e reaproveitamento.
mas só para introduzir:
as vezes mesmo querendo colocar um código em procedure para utilizar em outras chamadas, não é possível pois se refere a um componente do mesmo tipo, porém com nome diferente.
vc pode, então, explorar o SELF e principalmente o SENDER.
assim:
digamos que vc tenha vários componentes Edits em um form. e vc quer que ao receber o foco (OnEnter) ele receba o nome ´entrou´.
pelo método tradicional, vc iria colocar no primeiro edit
Edit1.Caption := ´entrou´
no segundo
Edit2.Caption := ´entrou´
no terceiro
Edit3.Caption := ´entrou´
vc não consegue colocar isto em uma procedure pois para cada um teria que ser uma procedure diferente.
veja a solução:
crie uma procedure que receba o parâmetro Sender
procedure EntrarValor (Sender: TObject); begin TEdit(Sender).Caption := ´entrou´; end;
no evento OnEnter de cada Edit coloque
EntrarValor(Sender);
perceba que em todos (ou na grande parte) dos eventos tem um parâmetro Sener, este é o componente que chamou o evento.
ou ainda vc poderia colocar
TEdit(Sender).Caption := ´entrou´;
no OnEnter do Edit1 e nos outros vc colocartia no Object Inspector apontando para o mesmo método.
é isso æ, vá refazendo os códigos, estudando POO e a experiência vai enriquecendo a qualidade dos códigos
GOSTEI 0
Vagner.oliveira
02/09/2006
Muito obrigado me ajudou bastante mesmo. estou revendo todo meu código.
O problema é que sou iniciante e não tenho esperiencia em criar procedures, não entendo a lógica de como criar uma. poderia me dar alguna exemplos. :oops:
O problema é que sou iniciante e não tenho esperiencia em criar procedures, não entendo a lógica de como criar uma. poderia me dar alguna exemplos. :oops:
GOSTEI 0
Raserafim
02/09/2006
coloque o código que vc já citou sendo que com o cabeçalho da procedure.
e mais algum outro.
fica mais fácil de ajudar dando exemplo diretamente para o que vc precisa.
e mais algum outro.
fica mais fácil de ajudar dando exemplo diretamente para o que vc precisa.
GOSTEI 0
Vagner.oliveira
02/09/2006
gostaria de criar uma [b:45c2096596]procedure[/b:45c2096596] que troque o campo dos edits, comboboxes e memos com enter.
uso este código em cada um deles:
como poderia faze-lo com procedure ?
uso este código em cada um deles:
begin // trocar campo com enter // with Tedit do If Key = #13 Then Begin SelectNext(Sender as tWinControl, True, True ); Key := 0; end;
como poderia faze-lo com procedure ?
GOSTEI 0
Raserafim
02/09/2006
vc pode criar uma procedure com o seguinte nome: TabParaEnter
e nela colocar o seguinte código:
e nos eventos OnKeyPress de cada componente vc coloca:
traduzindo tudo:
vc criou uma procedure que vai receber de parâmetro os mesmos parâmetro do evento ao qual vc vai aplicar o procedimento (só é necessário utilizar os parâmetros que vc vai precisar, neste caso precisa dos dois).
ao chamar o procedimento vc terá que passar os parâmetros. neste caso o objeto que disparou (Sender) e a tecla pressionada (Key).
procedure TabParaEnter (Sender: TObject; var Key: Char);
e nela colocar o seguinte código:
If Key = #13 Then Begin SelectNext(Sender as tWinControl, True, True ); Key := 0; end;
e nos eventos OnKeyPress de cada componente vc coloca:
TabParaEnter(Sender, Key);
traduzindo tudo:
vc criou uma procedure que vai receber de parâmetro os mesmos parâmetro do evento ao qual vc vai aplicar o procedimento (só é necessário utilizar os parâmetros que vc vai precisar, neste caso precisa dos dois).
ao chamar o procedimento vc terá que passar os parâmetros. neste caso o objeto que disparou (Sender) e a tecla pressionada (Key).
GOSTEI 0
Raserafim
02/09/2006
vc pode ainda fazer uma outra coisa, para facilitar ainda mais.
primeiramente vc sabe criar uma procedure?
é o seguinte:
no início da Unit vc tem assim:
se vc quiser criar uma procedure que apenas possa ser utilizada dentro desta Unit declare na Private:
e depois pressione Ctrl + Shift + C , o delphi criará automaticamente o esqueleto pra vc.
se quiser que esta procedure possa ser chamada de outras units basta declarar na Public.
na dica do post anterior vc poderia criar tanto na Public quanto na Provate.
agora uma outra dica. vc pode criar acima da Private, ficando, por tanto, dentro de Type, que será o Published (apesar de não ter o nome).
tudo o que estiver ali poderá ser enchergado pelo ObjectInspector.
criando a procedure TabParaEnter neste espaço vc poderá clicar no componente e ir na propriedade OnKeyPress e ao clicar no ComboBox verá na lista o seu procedimento.
assim não precisa colocar um código de chamada da procedure em cada componente.
primeiramente vc sabe criar uma procedure?
é o seguinte:
no início da Unit vc tem assim:
... type ... ... private ... public ... end;
se vc quiser criar uma procedure que apenas possa ser utilizada dentro desta Unit declare na Private:
procedure TabParaEnter (Sender: TObject; var Key: Char)
e depois pressione Ctrl + Shift + C , o delphi criará automaticamente o esqueleto pra vc.
se quiser que esta procedure possa ser chamada de outras units basta declarar na Public.
na dica do post anterior vc poderia criar tanto na Public quanto na Provate.
agora uma outra dica. vc pode criar acima da Private, ficando, por tanto, dentro de Type, que será o Published (apesar de não ter o nome).
tudo o que estiver ali poderá ser enchergado pelo ObjectInspector.
criando a procedure TabParaEnter neste espaço vc poderá clicar no componente e ir na propriedade OnKeyPress e ao clicar no ComboBox verá na lista o seu procedimento.
assim não precisa colocar um código de chamada da procedure em cada componente.
GOSTEI 0