Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Упростить код.


Автор: ivan219 16.9.2006, 23:59
Код

procedure KeyToPress(Sender:TObject);
begin

 if (Sender=Form1.LCFC)or
    (Sender=Form1.LCFL)or
    (Sender=Form1.LCFF) then LCF;  

 if (Sender=Form1.FNC)or
    (Sender=Form1.FNLR)or
    (Sender=Form1.FNFc) then FN;   

 if (Sender=Form1.FVC)or
    (Sender=Form1.FVLR)or
    (Sender=Form1.FVFc) then FV;        

 if (Sender=Form1.FPC1)or
    (Sender=Form1.FPL1)or
    (Sender=Form1.FPFc1)or
    (Sender=Form1.FPC2)or
    (Sender=Form1.FPL2)or
    (Sender=Form1.FPFc2) then FP(Sender);   

 if (Sender=Form1.LW1)or
    (Sender=Form1.LDk1)or
    (Sender=Form1.LDp1)or
    (Sender=Form1.LJ1)or
    (Sender=Form1.LL1) then LCil1;  

 if (Sender=Form1.L2W)or
    (Sender=Form1.L2Dn)or
    (Sender=Form1.L2Dv)or
    (Sender=Form1.L2J) then LCil2(Sender);  

 if (Sender=Form1.L4J)or
    (Sender=Form1.L4D)or
    (Sender=Form1.L4L) then L4lin;            

 if (Sender=Form1.LTorW)or
    (Sender=Form1.LTorM)or
    (Sender=Form1.LTorDn)or
    (Sender=Form1.LTorDv)or
    (Sender=Form1.LTorH)or
    (Sender=Form1.LTorL) then LTor;          

 if (Sender=Form1.TrL)or
    (Sender=Form1.TrT)or
    (Sender=Form1.TrU1)or
    (Sender=Form1.TrU2)or
    (Sender=Form1.TrI2) then Tr;     

 if (Sender=Form1.OmV)or
    (Sender=Form1.OmI)or
    (Sender=Form1.OmRn)or
    (Sender=Form1.OmW) then Om;                  

 if (Sender=Form1.RRR1)or
    (Sender=Form1.RRR2)or
    (Sender=Form1.RRR12) then RR;            

 if (Sender=Form1.RDUv)or
    (Sender=Form1.RDU)or
    (Sender=Form1.RDI)or
    (Sender=Form1.RDR) then RRD;      

 if (Sender=Form1.CDIn)or
    (Sender=Form1.CDUn)or
    (Sender=Form1.CDUv)or
    (Sender=Form1.CDF)or
    (Sender=Form1.CDC) then CD;                  

 if (Sender=Form1.RabcRab)or
    (Sender=Form1.RabcRbc)or
    (Sender=Form1.RabcRca)or
    (Sender=Form1.RabcRa)or
    (Sender=Form1.RabcRb)or
    (Sender=Form1.RabcRc) then Rabc(Sender); 

 if (Sender=Form1.R1R2EUIR1)or
    (Sender=Form1.R1R2EUIR2)or
    (Sender=Form1.R1R2EUIE)or
    (Sender=Form1.R1R2EUIU)or
    (Sender=Form1.R1R2EUII)or
    (Sender=Form1.R1R2EUIRn) then R1R2EUI(Sender);

 if (Sender=Form1.RLCFLL)or
    (Sender=Form1.RLCFLR)or
    (Sender=Form1.RLCFLF)or
    (Sender=Form1.RLCFLRxl)or
    (Sender=Form1.RLCFLRRxl) then RLCFL;           

 if (Sender=Form1.RLCFCC)or
    (Sender=Form1.RLCFCF)or
    (Sender=Form1.RLCFCRxc)then RLCFC;                

 if Sender=Form1.E1 then ColorRE;                     

 if Sender=Form1.ColorLEdit1 then ColorLE;           

 if (Sender=Form1.RshRa)or
    (Sender=Form1.RshIa)or
    (Sender=Form1.RshUa)then Rsh1;                   

 if (Sender=Form1.RshE)or
    (Sender=Form1.RshU) then Rsh3;            

 if (Sender=Form1.RoRu)or
    (Sender=Form1.RoIu)or
    (Sender=Form1.RoUu)or
    (Sender=Form1.RoE)or
    (Sender=Form1.RoR) then Ro;                     

 if (Sender=Form1.TS26C)or
    (Sender=Form1.TS26F)or
    (Sender=Form1.TS26L) then GB1(Sender);       

 if (Sender=Form1.TS26EditF)or
    (Sender=Form1.TS26EditT)or
    (Sender=Form1.TS26EditJ)or
    (Sender=Form1.TS26EditJ4) then GB2(Sender);   

 if (Sender=Form1.TS26W)or
    (Sender=Form1.TS26Dk)or
    (Sender=Form1.TS26Dp)or
    (Sender=Form1.TS26J)or
    (Sender=Form1.TS26Ll) then GB3(Sender);     

 if Sender=Form1.SMDEdit1 then Find;   

end;


Возможно зедлать этот код более компактным а то уменя этих if ещё целая куча.

Может как то оптимизировать???

Автор: skyboy 17.9.2006, 00:12
ivan219, что такое FPC1, FPL1, FPC2 и иже с ними? в чём вообще суть представленного кода? переработка архитектуры допустима?

Автор: Alexeis 17.9.2006, 00:23
ivan219, можно всем указаным объектам в поле Tag заносить свой номер
так для Form1.LCFC, Form1.LCFL, Form1.LCFF - будет один и тот же номер, например 1
И сделать масив элементы которого процедурного типа например procs, так элемент под индексом 1 будет процедра GB1 (procs[1] :=  GB1;)
теперь весь этот длинный код можно будет упростить до одной строчки:
Код

procs[sender.tag](sender);

Автор: skyboy 17.9.2006, 00:29
там процедуры разные. одни принимают параметры, другие нет.

Добавлено @ 00:31 
т.е. как минимум одно ветвление придётся делать и разные массивы. или приведение типов. а раз разная логика у вызываемых обработчиков, то на кой их сводить вместе?

Автор: Alexeis 17.9.2006, 01:08
skyboy, на сколько разные? Я видел там всего два вида, без параметров и с передачей объекта.

Цитата(skyboy @  17.9.2006,  00:29 Найти цитируемый пост)
то на кой их сводить вместе? 

Цитата(ivan219 @  16.9.2006,  23:59 Найти цитируемый пост)
Возможно зедлать этот код более компактным а то уменя этих if ещё целая куча.

Может как то оптимизировать??? 


Автор: ivan219 17.9.2006, 07:09
Цитата

ivan219, что такое FPC1, FPL1, FPC2 и иже с ними? в чём вообще суть представленного кода? переработка архитектуры допустима?


Это контролы тип TLabeledEdit и эта процедура вызывается из
Код

Procedure TForm1.EditChange(Sender: TObject);
begin
 KeyToPress(Sender);
end;


Я её вынес отдельно так как Unit1 стал более громозким, там уменя ещё и Button, ComboBox, RadioButton и.т.д. и чтоб не создавать на каждый отдельный обработчик я зделал так как было выше.

alexeis1 

С тегами я думал и пришол к этому коду
Код

case TLabeledEdit(Sender).Tag of
        1:......;
        .
        .
end;

Он по проще но всё равно как то громоздко получается.

Код

procs[sender.tag](sender);


Можеш поподробнее smile 

Автор: Alexeis 17.9.2006, 12:40
Цитата(ivan219 @  17.9.2006,  07:09 Найти цитируемый пост)
Можеш поподробнее

Описывается процедурный тип
Код

type 
  Tpr = procedure (self : TObject );

если используются обычные процеуры.
или 
Код

type 
  Tpr = procedure (self : TObject) of Object;

если используются методы классов.
Далее объявляется массив
Код

var
  procs : array[1..5] of Tpr;

в коде инициализируем его
Код

procs[1] := LCF;
procs[2] := FN;
procs[3] := FV;
procs[4] := FP;
......

индекс должен соответствовать тэгам каждой группы
теперь вызов нужной функции будет производится
procs[<номер нужного тэга>](общие параметры)

Если имеются две группы функций с одинаковымим параметрами. Каждой группе можно поставить в соответствие свой массив
Нвпример если их две то получим
процедурные типы будут соотв.
Код

type 
  Tpr1 = procedure of Object;
  Tpr2 = procedure (self : TObject) of Object;


Код

var
  procs1 : array[1..5] of Tpr1;
  procs2 : array[6..9] of Tpr2;


А запуск соответственно
Код

Case sender.tag of
1..5 : procs1[sender.tag]();
6..9 : procs2[sender.tag](sender);
end;

Автор: volvo877 17.9.2006, 13:34
alexeis1,
Код
type 
  Tpr = procedure (self: TObject);
 smile 

Автор: ivan219 17.9.2006, 13:52
Попробую.

Автор: Alexeis 17.9.2006, 18:16
volvo877, спасибо, что поправил smile .
[offtop]Это результат перехода с делфи на С++, начинаю комбинировать обе конструкции smile [/offtop]

Автор: ivan219 24.9.2006, 15:12
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button: TButton;
    Button1: TButton;
    Button2: TButton;
    procedure Click(Sender: TObject);
    procedure LabelCaption;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
 Tpr = procedure (self : TObject);


var
  procs : array[1..3] of Tpr;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Click(Sender: TObject);
begin
 procs[1] :=LabelCaption;
 procs[2] :=LabelCatison;
 procs[3] :=LabelCatison;
end;

procedure TForm1.LabelCaption;
begin
 case Sender.tag or
      1: Caption:='1';
      2: Caption:='2';
      3: Caption:='3';
 end;
end;
end.


Что то я неразобрался как этим пользоватся smile 

alexeis1  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)