Como diminuir o código fonte

Delphi

02/09/2006

pessoal, estou desenvolvendo 1 projeto só que muitas linha de comandos são identicas, só muda alumas linhas vou mostra um exemplo:

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

Vagner.oliveira

Curtidas 0

Respostas

Raserafim

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

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:


GOSTEI 0
Raserafim

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.


GOSTEI 0
Vagner.oliveira

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:
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

Raserafim

02/09/2006

vc pode criar uma procedure com o seguinte nome: TabParaEnter

  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

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:
...
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
POSTAR