Форум: "Начинающим";
Текущий архив: 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.051 c