Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизВызов метода Owner-класса Найти похожие ветки
← →
Очень Злой (2012-03-07 13:15) [0]Имеется нечто подобное:
type Tclass1 = class
private
...
procedure pr1;
public
...
end;
type TClass2=class(TComponent)
private
Fcon:array of TClass1;
...
public
...
published
...
end
В классе TClass1 описаны методы и поля, которые свойственны конкретному объекту, а в классе TClass2 общие методы и поля.
Как правильнее сделать описание вызова метода TClass2 из метода TClass1?
← →
DVM © (2012-03-07 13:18) [1]Tclass1 и TClass2 как то связаны?
← →
Anatoly Podgoretsky © (2012-03-07 13:20) [2]> Очень Злой (07.03.2012 13:15:00) [0]
Уже описал
← →
DVM © (2012-03-07 13:22) [3]Если связаны то:
type
TClass2=class;
Tclass1 = class
private
FOwner: TClass2;
procedure pr1;
public
constructor Create(AOwner: TClass2);
...
end;
procedure Tclass1.pr1;
begin
...FOwner...
end;
← →
DVM © (2012-03-07 13:23) [4]Если не связаны, то:
type
TClass2=class;
Tclass1 = class
private
...
procedure pr1(AClass2: TClass2);
public
constructor Create(AOwner: TClass2);
...
end;
procedure Tclass1.pr1(AClass2: TClass2);
begin
...
end;
← →
DVM © (2012-03-07 13:24) [5]
> DVM © (07.03.12 13:23) [4]
и это убрать еще
> constructor Create(AOwner: TClass2);
← →
Очень Злой (2012-03-07 15:16) [6]
> type
> TClass2=class;
>
> Tclass1 = class
Что-то видно я не так пробую. не получается...
Вобщем смысл таков (если более детально):TClass1=class
private
FOwner:TObject;
FConNo:Integer;
FWindowHandle:HWND;
FSocket:TSocket;
FBuffer: packed array[0..8191] of byte;
...
procedure WndProc(var Msg: TMessage);
procedure MyEvent(var M:TMessage); message WM_MY_EVENT;
public
...
constructor Create(AOwner:TObject;ConNo:integer);
destructor Destroy; override;
end;
type TClass2 = class (TComponent)
private
...
FStarted:boolean;
FConCount:integer;
FCon:packed array of TClass1;
procedure Process(Sender:TObject;ConNo:Integer; var msg:TMessage);
public
...
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Start;
procedure Stop;
end;
...
// TClass1
constructor TClass1.Create(AOwner:TObject; ConNo:integer);
begin
FOwner:=AOwner;
inherited Create;
FConNo:=ConNo;
FWindowHandle := classes.AllocateHWnd(WndProc);
end;
destructor TClass1.Destroy;
begin
if FWindowHandle <> 0 then classes.DeallocateHWnd(FWindowHandle);
inherited;
end;
procedure TClass1.WndProc(var Msg: TMessage);
begin
try
Dispatch(Msg);
except
if Assigned(ApplicationHandleException) then
ApplicationHandleException(Self);
end;
end;
procedure TClass1.SocketEvent(var M:TMessage);
begin
// Здесь нужно вызвать Fowner.Process(Self,FConNo,M);
end;
// TClass2
constructor TClass2.Create(AOwner: TComponent);
begin
inherited;
FStarted:=false;
end;
destructor TClass2.Destroy;
begin
Stop;
inherited;
end;
procedure TClass2.Start;
var
i:integer;
begin
if not FStarted then
begin
SetLength(FCon,FConCount);
for i:=0 to FConCount-1 do
begin
FCon[i]:=TClass1.Create(self,i);
end;
FStarted:=true;
end;
end;
procedure TClass2.Stop;
var
i:integer;
begin
if FStarted then
begin
for i:=0 to FConCount-1 do
begin
FCon[i].Free;
end;
SetLength(FCon,0);
FStarted:=false;
end;
end;
procedure TClass2.Process(Sender:TObject;ConNo:Integer; var msg:TMessage);
begin
// тут собственно происходит обработка
end;
← →
Очень Злой (2012-03-07 15:17) [7]
> procedure TClass1.SocketEvent(var M:TMessage);
> begin
> // Здесь нужно вызвать Fowner.Process(Self,FConNo,M);
> end;
небольшая ошибочкаprocedure TClass1.MyEvent(var M:TMessage);
begin
// Здесь нужно вызвать Fowner.Process(Self,FConNo,M);
end;
← →
Сергей М. © (2012-03-07 15:33) [8]почему бы класс TClass1 не сделать также как TClass2 наследником TComponent ?
Тогда бы и необх-ть в дин.массиве в класса-контейнере TClass2 отпала бы и задача бы упростилась :
TClass1(MyObjectOfClass1.Owner).SomeMethod
← →
Юрий Зотов © (2012-03-07 16:12) [9]Если "в TClass1 описаны методы и поля, которые свойственны конкретному объекту, а в классе TClass2 общие методы и поля", то напрашивается наследование TClass1 от TClass2. Тогда любой объект TClass1 просто вызывает методы TClass2 без всяких заморочек.
← →
CRLF (2012-03-07 17:07) [10]
> constructor Create(AOwner:TObject;ConNo:integer);
Это зачем? У тебя же жёстко задано, что Owner типа TClass2. Вот и объявляй FOwner и AOwner как TClass2.
← →
Очень злой (2012-03-08 12:23) [11]
> Юрий Зотов © (07.03.12 16:12) [9]
>
> Если "в TClass1 описаны методы и поля, которые свойственны
> конкретному объекту, а в классе TClass2 общие методы и поля",
> то напрашивается наследование TClass1 от TClass2. Тогда
> любой объект TClass1 просто вызывает методы TClass2 без
> всяких заморочек.
>
Первоначально где-то приблизительно так и писал. Но подумал, что лучше иметь один объект, обрабатывающий данные от всех "подобъектов", чем кучу объектов, которые будут обрабатывать собственные данные. Т.е. я перебрасываю всю обработку данных (довольно сложную по кол-ву кода) из "внутреннего класса", по которому создается много объектов на "внешний класс", по которому будет создаваться один объект.
Разумеется от этого в быстродействии я не выиграю (останется то же самое), а использование памяти должно уменьшиться... ИМХО
> CRLF (07.03.12 17:07) [10]
>
>
> > constructor Create(AOwner:TObject;ConNo:integer);
> Это зачем? У тебя же жёстко задано, что Owner типа TClass2.
> Вот и объявляй FOwner и AOwner как TClass2.
Угу. переделал так. Вроде все компилируется, но так как классы еще полностью не написаны то проверить как оно работать будет еще нет возможности.
← →
Юрий Зотов © (2012-03-08 17:11) [12]
> Т.е. я перебрасываю всю обработку данных (довольно сложную
> по кол-ву кода) из "внутреннего класса", по которому создается
> много объектов на "внешний класс", по которому будет создаваться
> один объект. Разумеется от этого в быстродействии я не выиграю (останется то же самое), а использование памяти должно уменьшиться...
И в этом внешнем сидит та же самая куча внутренних. В чем же экономия?
А вот если общий для всех обьъектов код вынести в класс-предок, то экономия действиттельно будет.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.064 c