Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
С.Толик   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.038 c
15-1188304203
@!!ex
2007-08-28 16:30
2007.09.30
Task Manager. Куда копать?


2-1188797687
малой
2007-09-03 09:34
2007.09.30
Служба и процессы


3-1180000443
TCrash
2007-05-24 13:54
2007.09.30
IB expert &amp; *.fdb


6-1170415405
inex
2007-02-02 14:23
2007.09.30
переслать результат выполнения в коммандной строке


3-1180354657
Вадим71
2007-05-28 16:17
2007.09.30
Как записать дату и время в smallDateTime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский