Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Как можно оптимизировать этот код? Повтор процедур!   Найти похожие ветки 

 
С.Толик   (2007-09-04 20:33) [0]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, TrafInsp_TLB, ActiveX, ExtCtrls;

type
 TForm1 = class(TForm)
   GroupBox1: TGroupBox;
   Memo1: TMemo;
   RadioGroup1: TRadioGroup;
   RadioButton1: TRadioButton;
   RadioButton2: TRadioButton;
   GroupBox2: TGroupBox;
   Summ: TEdit;
   Label1: TLabel;
   BitBtn1: TBitBtn;
   procedure BitBtn1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure RadioButton2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1     : TForm1;
 FService  : ITrafInspAdmin;
 UList     : OleVariant;
 User      : OleVariant;
 UAttr     : OleVariant;
 UState    : OleVariant;
 Cash0     : OleVariant;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 A : Cardinal;
 GUID : String;
 Name : String;
begin
 Memo1.Clear;
 CoInitialize(nil);
 FService:=CoTrafInspAdmin.CreateRemote("192.168.0.1");
 Try
   FService.APILogon("1234567");
 Except
 End;
 UList:=FService.APIGetBillProp(APIObjectTypeUser,"");
 if not VarIsArray(UList) then ; //Error

 For A:= VarArrayLowBound(UList, 1) to VarArrayHighBound(UList, 1) do
   Begin
     User:= UList[A];
     GUID:= User[1];
     UAttr := FService.APIGetAttr(3, GUID, User_IPAddr);
     UState:= FService.APIGetUserState(GUID);
     Name:= UState[0];
     Memo1.Lines.Add(Name);
   End;
 FService:=Nil;
 CoUninitialize;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 A : Cardinal;
 GUID : String;
 Name : String;
begin
 CoInitialize(nil);
 FService:=CoTrafInspAdmin.CreateRemote("192.168.0.1");
 Try
   FService.APILogon("1234567");
 Except
 End;
 UList:=FService.APIGetBillProp(APIObjectTypeUser,"");
 if not VarIsArray(UList) then ; //Error

 For A:= VarArrayLowBound(UList, 1) to VarArrayHighBound(UList, 1) do
   Begin
     User:= UList[A];
     GUID:= User[1];
     UAttr := FService.APIGetAttr(3, GUID, User_IPAddr);
     UState:= FService.APIGetUserState(GUID);
     Name:= UState[0];
     FService.APISetUserState(GUID, Cash0+StrToFloat(Summ.text), -1, "Script", "Добавлено:"+(Summ.text)+" Мб");
   End;
 FService:=Nil;
 CoUninitialize;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
var
 A : Cardinal;
 GUID : String;
 Name : String;
begin
 Memo1.Clear;
 CoInitialize(nil);
 FService:=CoTrafInspAdmin.CreateRemote("192.168.0.1");
 Try
   FService.APILogon("1234567");
 Except
 End;
 UList:=FService.APIGetBillProp(APIObjectTypeUser,"");
 if not VarIsArray(UList) then ; //Error

 For A:= VarArrayLowBound(UList, 1) to VarArrayHighBound(UList, 1) do
   Begin
     User:= UList[A];
     GUID:= User[1];
     UAttr := FService.APIGetAttr(3, GUID, User_IPAddr);
     UState:= FService.APIGetUserState(GUID);
     Name:= UState[0];
     Memo1.Lines.Add(GUID);
   End;
 FService:=Nil;
 CoUninitialize;
end;

end.


 
DrPass ©   (2007-09-04 23:22) [1]


> Как можно оптимизировать этот код?

Тебе по размеру или по быстродействию?


 
Slym ©   (2007-09-05 05:08) [2]

type
 TUserCallBack=procedure(const Service,User:variant);

procedure ForEachUser(Proc:TUserCallBack);
var
 Service:variant;
 UserList,User,UserAttr,UserState:variant;
 i:integer;
 GUID : String;
 Name : String;
begin
 CoInitialize(nil);
 try
   Service:=CoTrafInspAdmin.CreateRemote("192.168.0.1");
   try
     Service.APILogon("1234567");
     UserList:=Service.APIGetBillProp(APIObjectTypeUser,"");
     if not VarIsArray(UserList) then ; //Error
     for i:= VarArrayLowBound(UserList, 1) to VarArrayHighBound(UserList, 1) do
     begin
       User:= UserList[i];
       GUID:= User[1];
       UserAttr := Service.APIGetAttr(3, GUID, User_IPAddr);
       UserState:= Service.APIGetUserState(GUID);
       Name:= UserState[0];
       Proc(Service,User);
     end;
   finally
     Service:=null;
   end
 finally
   CoUninitialize;;
 end
end;

procedure TForm1.FormCreate(Sender: TObject);
 procedure Proc(const Service,User:variant);
   var UserState:variant;
 begin
   UserState:=Service.APIGetUserState(User[1]);
   Memo1.Lines.Add(UserState[0]);
 end;
begin
 Memo1.Clear;
 ForEachUser(@Proc);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
 procedure Proc(const Service,User:variant);
 begin
   Service.APISetUserState(User[1], Cash0+StrToFloat(Summ.text), -1, "Script", "Добавлено:"+(Summ.text)+" Мб");
 end;
begin
 ForEachUser(@Proc);
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
 procedure Proc(const Service,User:variant);
   var UserState:variant;
 begin
   UserState:=Service.APIGetUserState(User[1]);
   Memo1.Lines.Add(UserState[0]);
 end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;


 
evvcom ©   (2007-09-05 08:39) [3]

procedure TForm1.UniversalHandler(Sender: TObject);
...
 if Sender = Self then <действия специфичные для твоего обработчика FormCreate>
 if Sender = BitBtn1 then <уже думаю понятно?>
 if Sender = RadioButton2 then ...
...
end;


 
С.Толик   (2007-09-05 09:35) [4]


> Slym ©   (05.09.07 05:08) [2]


Извините Пожалуйста! Но ваша оптимизация не работает!


 
С.Толик   (2007-09-05 10:53) [5]

Ребяты! А есть ешо варианты?


 
Virgo_Style ©   (2007-09-05 11:02) [6]

С.Толик   (05.09.07 10:53) [5]

Есть. Например, вынести повторяющееся в отдельную процедуру, и вызывать ее. Хотя [3] лучше, imho.


 
Slym ©   (2007-09-05 11:44) [7]

С.Толик   (05.09.07 9:35) [4]
прям так и говорит... "я не работаю" ?


 
Slym ©   (2007-09-05 11:51) [8]

допешы :)
Form1.Memo1.Lines.Add(UserState[0]);


 
С.Толик   (2007-09-05 12:07) [9]


> Slym ©   (05.09.07 11:51) [8]
>
> допешы :)
> Form1.Memo1.Lines.Add(UserState[0]);


Куды именно в твоем опт коде?


 
Slym ©   (2007-09-05 12:10) [10]

procedure TForm1.FormCreate(Sender: TObject);
procedure Proc(const Service,User:variant);
  var UserState:variant;
begin
  with Form1 do
  begin
  UserState:=Service.APIGetUserState(User[1]);
  Memo1.Lines.Add(UserState[0]);
  end;
end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
procedure Proc(const Service,User:variant);
begin
  with Form1 do
  Service.APISetUserState(User[1], Cash0+StrToFloat(Summ.text), -1, "Script", "Добавлено:"+(Summ.text)+" Мб");
end;
begin
ForEachUser(@Proc);
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
procedure Proc(const Service,User:variant);
  var UserState:variant;
begin
  UserState:=Service.APIGetUserState(User[1]);
  Form1.Memo1.Lines.Add(UserState[0]);
end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;


 
Slym ©   (2007-09-05 12:12) [11]

привол в том что procedure Proc(const Service,User:variant); не of object и в ней не доступны self переменные :)


 
С.Толик   (2007-09-05 12:14) [12]

Пишет сие: Variant does not reference an automation object!


 
Slym ©   (2007-09-05 12:15) [13]

С.Толик   (05.09.07 12:14) [12]
а еще и показывает в каком месте :)


 
С.Толик   (2007-09-05 12:17) [14]

Class EOleError


 
Slym ©   (2007-09-05 12:19) [15]

на какой строке кода? :)


 
С.Толик   (2007-09-05 12:20) [16]


ry
  Service:=CoTrafInspAdmin.CreateRemote("192.168.0.60");
  try
    Service.APILogon("123"); // Вот тут баг и я думаю что апосля надо Except дописать
    UserList:=Service.APIGetBillProp(APIObjectTypeUser,"");
    if not VarIsArray(UserList) then ; //Error
    for i:= VarArrayLowBound(UserList, 1) to VarArrayHighBound(UserList, 1) do
    begin


 
Slym ©   (2007-09-05 12:21) [17]

у меня нет CoTrafInspAdmin и проверить не могу :)
Proc(Service,User); замени на Proc(Service as IDispatch,User);

или замени декларацию
type
TUserCallBack=procedure(Service:CoTrafInspAdmin;User:variant);
и соответственно
procedure Proc(Service:CoTrafInspAdmin;User:variant);


 
Slym ©   (2007-09-05 12:22) [18]

тады понятно
var
Service:CoTrafInspAdmin;
или
Service:=CoTrafInspAdmin.CreateRemote("192.168.0.60") as IDispatch;


 
С.Толик   (2007-09-05 12:27) [19]

Радио батоны не реагирують теперь!

begin
Memo1.Clear;
ForEachUser(@Proc);
end;


 
Slym ©   (2007-09-05 12:29) [20]

попробуй пропесадЪ полный путь до следующих переменных:
Service.APISetUserState(User[1], Cash0+StrToFloat(Summ.text), -1, "Script", "Добавлено:"+(Summ.text)+" Мб");


 
Slym ©   (2007-09-05 12:31) [21]

акарал . не туда...


 
Slym ©   (2007-09-05 12:31) [22]

procedure TForm1.RadioButton2Click(Sender: TObject);
procedure Proc(const Service,User:variant);
 var UserState:variant;
begin
 with Form1 do
 begin
   UserState:=Service.APIGetUserState(User[1]);
   Memo1.Lines.Add(UserState[0]);
 end;
end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;


 
С.Толик   (2007-09-05 12:35) [23]

Cash0     : OleVariant; а енто не то разве?


 
Slym ©   (2007-09-05 12:40) [24]

кстати этот оборот/способ называется callback...

Радио батоны не реагирують теперь
они же не молчат... на какой строке и что не пашет?


 
С.Толик   (2007-09-05 12:46) [25]

Должно выводится:
При клике на батон1 в мемо1 выводится сие - Name : String;
При клике на батон2 в мемо1 выводится сие - GUID : String;

А сейчас:
UserState:=Service.APIGetUserState(User[1]);
Memo1.Lines.Add(UserState[0]);

GUID - Не выводится!


 
Slym ©   (2007-09-05 12:48) [26]

ну хоть чтото выводится? и ошибки нет?


 
Slym ©   (2007-09-05 12:50) [27]

GUID:= User[1];


 
С.Толик   (2007-09-05 12:51) [28]

все решил!

GUID вынес из процедуру к глобальным переменным:

var
Cash0     : OleVariant;
GUID : String;

Все норм терь!


 
Slym ©   (2007-09-05 12:56) [29]

С.Толик   (05.09.07 12:51) [28]
GUID вынес из процедуру к глобальным переменным

На}{ера?
конечный код показывай


 
С.Толик   (2007-09-05 12:58) [30]


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, TrafInsp_TLB, ActiveX, ExtCtrls;

type
TForm1 = class(TForm)
  GroupBox1: TGroupBox;
  Memo1: TMemo;
  RadioGroup1: TRadioGroup;
  RadioButton1: TRadioButton;
  RadioButton2: TRadioButton;
  GroupBox2: TGroupBox;
  Summ: TEdit;
  Label1: TLabel;
  BitBtn1: TBitBtn;
   GroupBox3: TGroupBox;
   IP: TEdit;
   Label2: TLabel;
   Label3: TLabel;
   Password: TEdit;
  procedure BitBtn1Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure RadioButton2Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

var
Form1     : TForm1;
//FService  : ITrafInspAdmin;
//UList     : OleVariant;
//User      : OleVariant;
//UAttr     : OleVariant;
//UState    : OleVariant;
Cash0     : OleVariant;
GUID : String;
implementation

{$R *.dfm}

type
TUserCallBack=procedure(const Service,User:variant);

procedure ForEachUser(Proc:TUserCallBack);
var
Service:variant;
UserList,User,UserAttr,UserState:variant;
i:integer;
//GUID : String;
Name : String;
begin
CoInitialize(nil);
try
  Service:=CoTrafInspAdmin.CreateRemote("192.168.0.60") as IDispatch;
  try
    Service.APILogon("123");
    UserList:=Service.APIGetBillProp(APIObjectTypeUser,"");
    if not VarIsArray(UserList) then ; //Error
    for i:= VarArrayLowBound(UserList, 1) to VarArrayHighBound(UserList, 1) do
    begin
      User:= UserList[i];
      GUID:= User[1];
      UserAttr := Service.APIGetAttr(3, GUID, User_IPAddr);
      UserState:= Service.APIGetUserState(GUID);
      Name:= UserState[0];
      Proc(Service,User);
    end;
  finally
    Service:=null;
  end
finally
  CoUninitialize;;
end
end;

procedure TForm1.FormCreate(Sender: TObject);
procedure Proc(const Service,User:variant);
 var UserState:variant;
begin
 with Form1 do
 begin
 UserState:=Service.APIGetUserState(User[1]);
 Memo1.Lines.Add(UserState[0]);
 end;
end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
procedure Proc(const Service,User:variant);
begin
 with Form1 do
 Service.APISetUserState(User[1], Cash0+StrToFloat(Summ.text), -1, "Script", "Добавлено:"+(Summ.text)+" Мб");
end;
begin
ForEachUser(@Proc);
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
procedure Proc(const Service,User:variant);
var UserState:variant;
begin
with Form1 do
begin
  UserState:=Service.APIGetUserState(User[1]);
  Memo1.Lines.Add(GUID);
end;
end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;

end.


 
Slym ©   (2007-09-05 13:07) [31]

type
TUserCallBack=procedure(const Service,User:variant);

procedure ForEachUser(Proc:TUserCallBack);
var
 Service,UserList:variant;
 i:integer;
begin
CoInitialize(nil);
try
 Service:=CoTrafInspAdmin.CreateRemote("192.168.0.60") as IDispatch;
 try
   Service.APILogon("123");
   UserList:=Service.APIGetBillProp(APIObjectTypeUser,"");
   if not VarIsArray(UserList) then raise Exception.Create("No UserList");
   for i:= VarArrayLowBound(UserList, 1) to VarArrayHighBound(UserList, 1) do
     Proc(Service,UserList[i]);
 finally
   Service:=null;
 end
finally
 CoUninitialize;;
end
end;

procedure TForm1.FormCreate(Sender: TObject);
procedure Proc(const Service,User:variant);
var UserState:variant;
begin
with Form1 do
begin
UserState:=Service.APIGetUserState(User[1]);
Memo1.Lines.Add(UserState[0]);
end;
end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
procedure Proc(const Service,User:variant);
begin
with Form1 do
Service.APISetUserState(User[1], Cash0+StrToFloat(Summ.text), -1, "Script", "Добавлено:"+(Summ.text)+" Мб");
end;
begin
ForEachUser(@Proc);
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
procedure Proc(const Service,User:variant);
begin
with Form1 do
 Memo1.Lines.Add(User[1]);
end;
begin
Memo1.Clear;
ForEachUser(@Proc);
end;


 
Slym ©   (2007-09-05 13:08) [32]

кто такой Cash0 : OleVariant; и где его заполняют?


 
С.Толик   (2007-09-05 13:13) [33]

Всё ок!

З.Ы. Итого: Оптимизировали 26 строк кода и научили мыслить в нужном направлении!

Спасибо за Оптимизацию и Учение!


 
Slym ©   (2007-09-05 13:23) [34]

26! - мелочь :) ты сюда посмотри http://delphimaster.net/view/15-1188795881/ скока соптимизировать можно :)


 
С.Толик   (2007-09-05 13:36) [35]

Да однозначно!


 
evvcom ©   (2007-09-06 12:51) [36]


> GUID вынес из процедуру к глобальным переменным:

ООП фтопку!!! Делай как Толик!!!!! :-)



Страницы: 1 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.033 c
11-1172563692
Fregl
2007-02-27 11:08
2007.09.30
Отлов ("перехват") событий VCL приложением из KOL DLL


2-1188719155
THandle
2007-09-02 11:45
2007.09.30
Проблема с чтением текста из TFileStream


3-1180347550
salexn
2007-05-28 14:19
2007.09.30
Как работает MaxRecords свойство ADO для Oracle


15-1188799204
yura123
2007-09-03 10:00
2007.09.30
коннекшн между домом


15-1188835206
oldman
2007-09-03 20:00
2007.09.30
Собираю даньги на акцию...