Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.128 c
15-1353240876
Чайник
2012-11-18 16:14
2013.03.22
Опять про GuardMailRu


2-1329678422
Zheksonz
2012-02-19 23:07
2013.03.22
Почему на панели TCategoryPanelGroup не виден TLabel?


15-1338451685
TUser
2012-05-31 12:08
2013.03.22
Дошкольное программирование


15-1325340451
Pit
2011-12-31 18:07
2013.03.22
Delphi XE2 и крупные проекты


2-1333011642
Вася
2012-03-29 13:00
2013.03.22
При нажатии правой кнопки мыши на DBgrid не меняется активная стр





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский