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

Вниз

Как узнать в своей компоненте , что ...   Найти похожие ветки 

 
Mutniy   (2005-01-11 18:08) [0]

Делаю компоненту ,
которая юзает DBgird

то-есть

myClass = Class(TCustomPanel)
 private
 ...
 published
   property DBGrid:TDBGrid read GetDBGrid write SetDBGrid;
 ...
 end;  
на Этой панельки соэдаются несколько контролов относительно некоторых колонок DBGrid-a.

И вот, когда происхоит изменение ширины/позиции колонок на DBGride который как бы привязан к этой компоненте
мне нужно, что бы в связи с этим перерисовались некоторые контролы на этой панельке (компоненте)

не могу догодатся

Зарание благодарю .


 
Семен Сорокин ©   (2005-01-11 19:26) [1]

сдулать наследника TDBGrid, где переопределить

procedure ColWidthsChanged; dynamic;

и использовать его.


 
Mutniy   (2005-01-12 08:19) [2]

Попробую еще раз ...
так как такой вариант я уже пробовал .
может гдето я ошибся ...


 
Mutniy   (2005-01-12 19:05) [3]

Что в этом случае не верно ?
Думаю идея ясна .


TMTDBGrid = class;
 
TMyClass = Class(TCustomPanel)
private
 ...
  FMDBGrid:TMTDBGrid
  procedure ColWidthsChanged;
  function GetDBGrid:TDBGrid;
  procedure SetDBGrid(Value : TDBGrid);
published
  property DBGrid:TDBGrid read GetDBGrid write SetDBGrid;
...
public
  constructor Create(AOwner:TComponent);override;
  destructor Destroy;override;
end;  

TMTDBGrid = class(TDGrid)
private
  FMyClass:TMyClass;
protected
  procedure ColWidthsChanged;override;
 ...
public
  constructor Create(MyClass:TMyClass);override;
  destructor Destroy;override;
end

constructor TMyClass.Create(AOwner:TComponent);
begin
 FMDBGrid:=TMTDBGrid.Create(Self);
end;

function  TMyClass.GetDBGrid:TDBGrid;
begin
 result := TDBGrid(FMDBGrid);
end;

procedure TMyClass.SetDBGrid(Value : TDBGrid);
begin
 FMDBGrid := TMTDBGrid(Value);
end;

{TMTDBGrid}

constructor TMTDBGrid.Create(MyClass:TMyClass);
begin
 inheruted Create(NIL);
 FMyClass:=MyClass;
end;

destructor Destroy;
begin
 ...
end;

procedure TMTDBGrid.ColWidthsChanged;
begin
 FMyClass.ColWidthsChanged;
end;



 
Семен Сорокин ©   (2005-01-13 11:10) [4]


> procedure TMyClass.SetDBGrid(Value : TDBGrid);
> begin
>  FMDBGrid := TMTDBGrid(Value);
> end;

так не делают, либо используй без приведения (тогдя для назаначения в Desigm-time понадобится регистрировать TMTDBGrid отдельно), либо убери write-метод.


>   constructor Create(MyClass:TMyClass);override;

constructor Create(MyClass:TMyClass); reintroduce;


> constructor TMyClass.Create(AOwner:TComponent);
> begin
>  FMDBGrid:=TMTDBGrid.Create(Self);
> end;


constructor TMyClass.Create(AOwner:TComponent);
begin
 inherited Create(AOwner);
 FMDBGrid:=TMTDBGrid.Create(Self);
end;

> constructor TMTDBGrid.Create(MyClass:TMyClass);
> begin
>  inheruted Create(NIL);
>  FMyClass:=MyClass;
> end;

constructor TMTDBGrid.Create(MyClass:TMyClass);
begin
inheruted Create(MyClass);
FMyClass:=MyClass;
end;


 
Mutniy   (2005-01-15 08:54) [5]


так не делают, либо используй без приведения (тогдя для назаначения в Desigm-time понадобится регистрировать TMTDBGrid отдельно), либо убери write-метод.


Тогда как быть , просто через метод ?
собсно не очень хочется :)


 
Юрий Зотов ©   (2005-01-15 10:22) [6]

> Mutniy   (15.01.05 08:54) [5]

Зачем вообще выносить свойство DBGrid в published, да еще делать его с доступом по записи, да еще писать так:

procedure TMyClass.SetDBGrid(Value : TDBGrid);
begin
FMDBGrid := TMTDBGrid(Value);
end;

???

Все это чревато глюками и утечками памяти. Вот смотрите, что получается.

1. В конструкторе написано:
 FMDBGrid := TMTDBGrid.Create(Self);
ОК, объект создан, поле проинициализировано. Пока все хорошо.

2. Кидаю компонент на форму. Свойство DBGrid появляется в Инспекторе объектов (причем непонятно, что будет в колонке "значение" - ведь внутреннему компоненту не назначено имя) и это свойство доступно для изменения.

3. Назначаю этому свойству любой TDBGrid, который тоже лежит на форме. Выполняется код метода SetDBGrid:
FMDBGrid := TMTDBGrid(Value);

Во-первых, здесь сразу возможен глюк - ведь использовано прямое приведение типа, а назначенный мною TDBGrid совершенно не обязательно относится к классу TMTDBGrid. Даже если глюк и не возникнет сразу при присвоении, он обязательно возникнет при дальнейшей работе - ведь класс совсем не тот.

Во-вторых, теряется ссылка на внутренний TMTDBGrid - значит:

а). Произойдет 100%-ная утечка памяти (потерян доступ к внутреннему компоненту, поэтому работать с ним уже нельзя и даже уничтожить его уже не удастся).

б). Деструктор будет уничтожать совсем другой компонент.

==========================

Вывод - свойство надо пернести в public (или protected) и объявить так:
property DBGrid: TMTDBGrid read FMDBGrid;
а метод SetDBGrid убрать совсем.


 
Mutniy   (2005-01-20 11:59) [7]

И как тогда быть ?!
честно говоря даже не знаю ...


 
jack128 ©   (2005-01-21 01:18) [8]

Mutniy   (20.01.05 11:59) [7]
И как тогда быть ?!
честно говоря даже не знаю ...

обычно пишут FMDBGrid.Assign(Value);


 
Mutniy   (2005-01-21 09:17) [9]

2 jack128

Хмм, не догадался бы
ладно попробуем-с.


 
Mutniy   (2005-01-21 10:07) [10]

Все же что то ,кричит , что не могу сделать
Assign .
млин , времени нету подумать. :(

просто что я хочу , еще раз поясню .

есть панелька на которой находятся конторлы.
они позицианируются относительно колонок этого DBGrida
предпологается что ,будет юзатся либо DBGrid либо DBGridEH
и мне надо как то узнать что у данного DBGrida изменили щиоину колоноу позицию итд .


 
jack128 ©   (2005-01-21 20:50) [11]

Mutniy   (21.01.05 10:07) [10]
Все же что то ,кричит , что не могу сделать

Ну так перекрой этот метод и делай в нем, что хочешь..
Mutniy   (21.01.05 10:07) [10]
и мне надо как то узнать что у данного DBGrida изменили щиоину колоноу позицию итд .

Создай наследника от TDBGrid"a/TDbGridEh"a и пусть он информирует твою панельку обо всех этих событиях


 
Mutniy   (2005-01-22 08:09) [12]

Ну так перекрой этот метод и делай в нем, что хочешь..
ТОесть имеете ввиду

MyDBGrid = class (TCustomGrid)
public
  procedure Assign(value:TPersisten) ; override;
end

procedure MyDBGrid.Assign;
begin
 ... ?
end;
?


Создай наследника от TDBGrid"a/TDbGridEh"a и пусть он информирует твою панельку обо всех этих событиях


Вот это и пытаюсь сделать :)


 
jack128 ©   (2005-01-23 02:01) [13]

Mutniy   (22.01.05 8:09) [12]
ТОесть имеете ввиду

да. В принципе мжешь все что нужно описать в set-методе, то  есть например

procedure TMyClass.SetDBGrid(Value : TDBGrid);
begin
FMDBGrid.DataSource := Value.DataSource;
// ну и так далее
end

но если ты планируешь наследоваться от TMTDBGrid, то перекрытие Assign выглядит предпочтительней..
Mutniy   (22.01.05 8:09) [12]
Вот это и пытаюсь сделать :)

Ну так а в чем проблема?? Ну например для того что бы узнать когда изменилясь ширина колонок можно перекрыть TCustomGrid.ColWidthsChanged...


 
Юрий Зотов ©   (2005-01-23 04:29) [14]

> Mutniy   (21.01.05 10:07) [10]

> млин , времени нету подумать. :(

Мне кажется, что Вы ответили сами себе:
Mutniy   (20.01.05 11:59) [7]
И как тогда быть ?!
честно говоря даже не знаю ...


 
Mutniy   (2005-01-24 11:06) [15]

Я сделал немного по другому

TTOnDrawColumnCell =  procedure(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumnEh;State: TGridDrawState) of object;

TMyClass = Class(TCustomPanel)
private
...
 //FMDBGrid:TMTDBGrid
 FDBGrid:TDBGrid;
 OnDraw:TTOnDrawColumnCell;
//  procedure ColWidthsChanged;
 
 function GetDBGrid:TDBGrid;
 procedure SetDBGrid(const Value : TDBGrid);
protected
 procedure DrawColumnCell(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumnEh;State: TGridDrawState) of object;

published
 property DBGrid:TDBGrid read GetDBGrid write SetDBGrid;
...
public
 constructor Create(AOwner:TComponent);override;
 destructor Destroy;override;
end;  

procedure TMyClass.SetDBGrid(const Value:TDBGrid)
begin
... // тут всякие проверки естественно ...
  FDBGrid := Value ;
  OnDraw := Value.OnDrawColumnCell;
  FDBGrid.OnDrawColumnCell := DrawColumnCell;
...
end;

procedure TMyClass.DrawColumnCell(...)
begin
 if Assigned(OnDraw) then OnDraw(...)
 DrawMyControls;
end;

procedure TMyClass.DrawMyControls;
begin
 ...
 делаем все что нам требуется ...
 
end;


 
jack128 ©   (2005-01-24 20:33) [16]

Mutniy   (24.01.05 11:06) [15]
FDBGrid.OnDrawColumnCell := DrawColumnCell;


Хм. Такой подход - не есть хорошо. Коли клиенты TMyClass имеют доступ к этому гриду, то они вполне могут заменить это событие на своё.


 
Mutniy   (2005-01-25 08:02) [17]

Всмысле ?
если я понял тебя , то для эого я и делаю вот это :
 OnDraw := Value.OnDrawColumnCell;

а потом соответсвенно
  if Assigned(OnDraw) then OnDraw(...)


 
jack128 ©   (2005-01-25 15:09) [18]

m := TMyClass.Create(Self);
m.Parent := Self;
m.DbGrid := SameGrid;
m.DBGrid.OnDrawColumnCell := nil; // И все твой компоннет не работает..


 
PopUp`s   (2005-01-25 16:41) [19]

надо проверить :)



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.039 c
14-1128276346
Piter
2005-10-02 22:05
2005.10.30
Вечная память Magic Forum у... Аминь.


1-1128582273
Aleksey
2005-10-06 11:04
2005.10.30
Использование CreatePen


4-1125042482
ganda
2005-08-26 11:48
2005.10.30
Подключится к интернету зная только имя соединения


3-1127299186
Juice
2005-09-21 14:39
2005.10.30
Lookup-поле в сетке


1-1129013418
Gorez
2005-10-11 10:50
2005.10.30
janXMLparser2