Форум: "Компоненты";
Текущий архив: 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