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

Вниз

Вызов метода 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.057 c
10-1176745972
Neket
2007-04-16 21:52
2013.03.22
Быстрое заполнение Excel


15-1353423286
0xDEADBEEF
2012-11-20 18:54
2013.03.22
неадекватно отображаются компоненты в Windows7


15-1343334602
Юрий
2012-07-27 00:30
2013.03.22
С днем рождения ! 27 июля 2012 пятница


2-1337666296
Viktor
2012-05-22 09:58
2013.03.22
Работа с браузером


15-1343200140
boriskb
2012-07-25 11:09
2013.03.22
Программисты становятся дефицитом