Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   optimizar el codigo para no tener lo mismo mas de 5 veces en el proyecto (https://www.clubdelphi.com/foros/showthread.php?t=81265)

darkbits 27-10-2012 23:39:12

optimizar el codigo para no tener lo mismo mas de 5 veces en el proyecto
 
un saludo al club
tengo este codigo( abajo) lo utilizo en mas de 3 form del proyecto y en un form el codigo esta como 5 veces
es un simple comparador de estado.

Necesito una mano como se puede meter esto a un procedure estado; o no se como se hace esto.
que cuando lo necesito lllamo a ese procedure sin tener q pegar el codigo ma de 15 veces en el mismo proyecto.


Código Delphi [-]
  if estadorma.Caption='DEVUELTO' then
        begin
         nrorma.Enabled:=false;
         estadorma.Enabled:=false;
        end
        else
        begin
         nrorma.Enabled:=true;
         estadorma.Enabled:=true;
        end;

ecfisa 28-10-2012 00:48:41

Hola darkbits.

El código podría ser más simple si supiera que componentes son estadorma y nrorma...

Pone en una unidad que utilices en los forms que mencionas (o create una al efecto e incluila) el siguiente procedimiento:
Código Delphi [-]
  ...
  procedure SetCtrlOnOff(Ctrl1, Ctrl2: TControl);
  ...
implementation

uses TypInfo;

procedure SetCtrlOnOff(Ctrl1, Ctrl2: TControl);
begin
  if GetPropInfo(Ctrl1, 'CAPTION') = nil then
    raise Exception.Create('Error: Propiedad Caption no encontrada');
  if GetStrProp(Ctrl1, 'Caption') = 'DEVUELTO' then
  begin
    Ctrl1.Enabled:= False;
    Ctrl2.Enabled:= False
  end
  else
  begin
    Ctrl1.Enabled:= True;
    Ctrl2.Enabled:= True;
  end;
end;
...

Llamadas ejemplo:
Código Delphi [-]
  SetCtrlOnOff(estadonorma, nrorma);  // correcto (si estadonorma tiene la propiedad Caption)
  SetCtrlOnOff(Button2,Button3);      // también correcto
  SetCtrlOnOff(Edit1, Label5);        // error!

Saludos.

mamcx 28-10-2012 00:48:48

Piensa en términos de hacer "plantillas" y sustituye instancias especificas de clases con los tipos que estas representan (ósea, piensa en términos de datos/información no en términos de sustantivos)

Código Delphi [-]
function checkNorma(labelNorma:TLabel, checkNorma:TCheck)
var
  esDevuelto:Boolean;
begin
    esNoDevuelto := not labelNorma:TLabel.
Caption='DEVUELTO';

    nrorma.Enabled:=esNoDevuelto;
    estadorma.Enabled:=esNoDevuelto;
end;

P.D: Este codigo esta sin probar, y adivine que tipos son los que usas.

darkbits 28-10-2012 01:04:06

gracias por su ayuda
vi unos ejemplos y creo que es la forma mas facil trate de hacerlo no funciona :(
Código Delphi [-]
procedure estado;
begin
  if estadorma.Caption='DEVUELTO' then
        begin
         nrorma.Enabled:=false;
         estadorma.Enabled:=false;
        end
        else
        begin
         nrorma.Enabled:=true;
         estadorma.Enabled:=true;
        end;
end;

y lo llaman de esta forma en los los diferentes form

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
...
..
estado;
..
..
end;

nlsgarcia 28-10-2012 01:31:36

darkbits,

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
   Unit2; // Verifica el estatus de un control, en el ejemplo TLabel

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Label1.Caption := 'DEVUELTO';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   Label1.Caption := 'NO DEVUELTO';
end;

procedure TForm1.Button3Click(Sender: TObject);
var
   NameControl : String;

begin

   NameControl := 'Label1';

   // Verifica el estatus de un control, en el ejemplo TLabel
   If StatusCaption(Form1,NameControl) then
      ShowMessage('Estatus Devuelto')
   else
      ShowMessage('Estatus No Devuelto')

end;

end.
Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

  Function StatusCaption(f : TForm; NameControl : String) : Boolean;

implementation

// Verifica el estatus de un control, en el ejemplo TLabel
Function StatusCaption(f : TForm; NameControl : String) : Boolean;
var
   Control : TComponent;

begin

   Control := f.FindComponent(NameControl);

   With Control as TLabel Do
   begin
      if Caption='DEVUELTO' then
      begin
         // nrorma.Enabled:=false;
         // estadorma.Enabled:=false;
         Result := True;
      end
      else
      begin
         // nrorma.Enabled:=true;
         // estadorma.Enabled:=true;
         Result := False;
      end;
   end;

end;

end.
Al pasar el formulario y el nombre del control a verificar perteneciente a ese formulario (En el ejemplo Label1) por medio de la función StatusCaption, puedes centralizar en una sola rutina la verificación del estatus del control sin importar el número de formularios donde la realices.

Espero sea útil :)

Nelson.

ecfisa 28-10-2012 02:09:04

Cita:

Empezado por darkbits (Mensaje 448169)
gracias por su ayuda
vi unos ejemplos y creo que es la forma mas facil trate de hacerlo no funciona :(

Hola.

A mi me funciona perfectamente, te adjunto un ejemplo para que lo estudies con tranquilidad.

Saludos.

ecfisa 28-10-2012 02:28:05

Me olvidaba...

Seguramente notes un cambio con respecto al código del primer mensaje. Lo hice no por que no funcionara, si no por que mirando el código de mamcx, me dí cuenta que se puede reducir a:
Código Delphi [-]
procedure SetCtrlOnOff(Ctrl1, Ctrl2: TControl);
var
  Activo: Boolean;
begin
  if GetPropInfo(Ctrl1, 'CAPTION') = nil then
    raise Exception.Create('Error: Propiedad Caption no encontrada');
  Activo := not (GetStrProp(Ctrl1, 'Caption') = 'DEVUELTO');
  // o igualmente: Activo := GetStrProp(Ctrl1, 'Caption') <> 'DEVUELTO';
  Ctrl1.Enabled:= Activo;
  Ctrl2.Enabled:= Activo;
end;
Es la forma en que normalmente se haría, pero uno no siempre anda con todas las luces... :o

Saludos. :)


La franja horaria es GMT +2. Ahora son las 11:06:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi