Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно оптимизировать этот код? Повтор процедур! [D7, XP]


Страницы:   1 2

С.Толик ©   (2007-09-04 20:33:00) 


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.


evvcom   (2007-09-06 12:51:00) [1]


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

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


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

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


Slym   (2007-09-05 13:23:00) [3]

26! - мелочь :) ты сюда посмотри http://www.delphimaster.ru/cgi-bin/forum.pl?id=1188795881&n=3скока соптимизировать можно :)


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

Всё ок!

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

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


Slym   (2007-09-05 13:08:00) [5]

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


Slym   (2007-09-05 13:07:00) [6]

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;


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


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 12:56:00) [8]

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

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


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

все решил!

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

var
Cash0     : OleVariant;
GUID : String;

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


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

GUID:= User[1];


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

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


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

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

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

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


Slym   (2007-09-05 12:40:00) [13]

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

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


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

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


Slym   (2007-09-05 12:31:00) [15]

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;


Slym   (2007-09-05 12:31:00) [16]

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


Slym   (2007-09-05 12:29:00) [17]

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


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

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

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


Slym   (2007-09-05 12:22:00) [19]

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


Slym   (2007-09-05 12:21:00) [20]

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо