Fórum Como diminuir o código fonte #328515
02/09/2006
0
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
Curtir tópico
+ 0Posts
02/09/2006
Raserafim
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
03/09/2006
Vagner.oliveira
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
03/09/2006
Raserafim
e mais algum outro.
fica mais fácil de ajudar dando exemplo diretamente para o que vc precisa.
Gostei + 0
04/09/2006
Vagner.oliveira
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
06/09/2006
Raserafim
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
06/09/2006
Raserafim
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
Clique aqui para fazer login e interagir na Comunidade :)