Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.038 c
4-1124854876
Alisher
2005-08-24 07:41
2005.10.30
Как при использовании IStorage удалить из хранилища бинарник


14-1128709701
default
2005-10-07 22:28
2005.10.30
"Живое" пиво, срок хранения три дня


14-1128596275
КаПиБаРа
2005-10-06 14:57
2005.10.30
"Правдозащитники"


2-1128877527
дендроид
2005-10-09 21:05
2005.10.30
как извлечь корень n-ной степени?


4-1125069900
NikNet
2005-08-26 19:25
2005.10.30
Запустить EXE из ресурса не сохраняя на диск?





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