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

Вниз

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

 
mfender   (2003-09-04 17:12) [0]

Я имею в виду такую ситуацию (конкретно по полкам):
процедура получает сведения о компоненте, например TDBGrid, и соответственно этому делает какие-то движения (в частности, записывает в ini состояние ее колонок, цвета etc). Но вот частный случай: компонент оказывается TrxDBGrid. Он также относится к TCustomDBGrid. Но как об этом узнает процедура. Писать на каждый частный случай if (что-то.ClassName="TDBGrid") or (что-то.ClassName="TrxDBGrid") or (что-то.ClassName="еще_какой-то_лохматый_грид_который_сочинил_кто-то_в _порыве_чувств") then .... ? Что-то не охота.
Может кто подскажет, как постурить в таком случае.


 
Skier ©   (2003-09-04 17:19) [1]

что-то.InheritsFrom(TCustomDBGrid) then...


 
Юрий Федоров ©   (2003-09-04 17:21) [2]

1. передавай TCustomDBGrid, если все необходимые для твоей процедуры св-ва есть уже там.
2. Если их там нет, то пересмотри структуру процедур
3. если они там есть, но protected, используй механизм доступа к protected св-вам


 
Zmei-Gorin   (2003-09-04 17:23) [3]

(LоhmatyGrid is TCustomDBGrid)
всё.


 
mfender   (2003-09-04 17:51) [4]

(LоhmatyGrid is TCustomDBGrid)
всё.


Это не все. Это руками можно указать. У меня цель, чтобы процедура сама определила, что этот, скажем, LohmatyGrid является наследником TCustomDBGrid.


 
Юрий Федоров ©   (2003-09-04 17:58) [5]

InheritsFrom - class function
is - использует внутри InheritsFrom, но для созданного экземпляра
(LоhmatyGrid is TCustomDBGrid) вернет true если LоhmatyGrid является экхемпляром класса TCustomDBGrid или экземпляром класса-потомка


 
Skier ©   (2003-09-04 17:58) [6]


> чтобы процедура сама определила, что этот, скажем, LohmatyGrid
> является наследником TCustomDBGrid.

Т.е. взяла на себя роль компилятора ?


 
хм ©   (2003-09-04 18:01) [7]

procedure p(LоhmatyGrid:TObject)
begin
if LоhmatyGrid is TCustomDBGrid then writeln("Урра! Я сама определила что это наследник TCustomDBGrid!!!");
end;

Чем не нравится?


 
Игорь Шевченко ©   (2003-09-04 18:15) [8]

mfender (04.09.03 17:51) [4]

ClassName, ClassType, GetTypeInfo, и т.д.


 
me   (2003-09-04 18:18) [9]

Можно придумать что-нибудь в таком духе:

TKnownClassRec = record
Cls: TClassType;
DoSmth: procedure(Obj: TObject) of object;
end;

var
KnownClasses: array of TKnownClassRec;

procedure p(Obj: TObject)
var i: Integer
begin
for i := 0 to Length(KnownClasses)-1 do
begin
if Obj.InheritsFrom(KnownClasses[i].Cls) then
KnownClasses[i].DoSmth(Obj);
end;
end;


 
mfender   (2003-09-04 19:08) [10]

С этим понятно. Разобрались.
А вот как теперь сделать вот это:

var c: TComponent;
begin
if (что-то is TCustomDBGrid) then c (и вот как тут назначить с, что она и является TCustomDBGrid)
end;


 
Skier ©   (2003-09-04 19:14) [11]

Это имеется в виду ?

var c: TComponent;
begin
if (что-то is TCustomDBGrid) then begin
with TCustomDBGrid(что-то) do begin
//работаешь как с TCustomDBGrid...
end; //with
end; //if
end;


 
mfender   (2003-09-04 19:25) [12]

var c: TComponent;
begin
if (что-то is TCustomDBGrid) then begin
with TCustomDBGrid(что-то) do begin
//работаешь как с TCustomDBGrid...
end; //with
end; //if
end;

попробовал

with TCustomGrid(Component.Cl) do
begin
GridCols:="";
for o:=0 to ColumnCount-1 do
begin
GridCols:=GridCols+IntToStr( Columns.Items[o].Width)+" ";
end;
GridCols:=TrimRight(GridCols);
WriteIni(Form.Name,Name,
ColorToString( Color)+" "+
IntToStr( ColumnCount)+" "+
GridCols);
end;

не получается. говорит "Undeclared identifier" про то, что я жирным повыделил


 
Skier ©   (2003-09-04 19:36) [13]

>mfender (04.09.03 19:25)
Давай разберёмся...
Общий предок видимо всё-таки TCustom DBGrid.
Так ?


 
me   (2003-09-04 19:40) [14]

На сколько я понимаю, не TCustomGrid, а TCustomDBGrid.
(У TCustomGrid нет свойства Columns).

Все выделенные св-ва у TCustomDBGrid protected.
Это обходится так:

THackCustomGrid = class(TCustomDBGrid);

with THackCustomGrid(...) do
...


 
mfender   (2003-09-04 19:47) [15]

Согласен. Columns у TCustomGrid - суть вещь не бывалая. Погорячился по малограмотности и сирости своей. Делайте скидку.
Сделал, как рекомендовали (см. текст, только вместо TCustomGrid написал TCustomDBGrid). Та же порча.


 
Skier ©   (2003-09-04 19:49) [16]

>mfender (04.09.03 19:47)
Да не TCustomDBGrid надо писать, а THackCustomGrid
Тебе же me уже всё написал. См. [14]


 
mfender   (2003-09-04 19:52) [17]

а где все-таки написать THackCustomGrid = class(TCustomDBGrid);
????


 
me   (2003-09-04 19:59) [18]

Это объявление наследника TCustomDBGrid
(и лучше бы назвать его THackCustom DBGrid).
Соответственно пишется это в любом глобальном блоке type
перед использующей его процедурой.
Например, так:

...

type
THackCustomGrid = class(TCustomDBGrid);

procedure TXXXX.XXXX(....);
begin
...
with THackCustomDBGrid(Component.Cl) do
begin
GridCols:="";
for o:=0 to ColumnCount-1 do
begin
GridCols:=GridCols+IntToStr(Columns.Items[o].Width)+" ";
end;
GridCols:=TrimRight(GridCols);
WriteIni(Form.Name,Name,
ColorToString(Color)+" "+
IntToStr(ColumnCount)+" "+
GridCols);
end;
...
end;


 
mfender   (2003-09-04 20:04) [19]

спасибо всем. наконец-то постиг. теперь все работает и выглядит так:

if (c is TCustomDBGrid) then
begin
with Form do
begin
with THackCustomGrid(c) do
begin
GridCols:=""; //GridColCnt:=ColumnCount;
for o:=0 to Columns.Count-1 do
begin
GridCols:=GridCols+IntToStr(Columns.Items[o].Width)+" ";
end;
GridCols:=TrimRight(GridCols);
WriteIni(Form.Name,Name,
ColorToString(Color)+" "+
IntToStr(Columns.Count)+" "+
GridCols);
end;
end;
end;



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

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

Наверх




Память: 0.51 MB
Время: 0.027 c
6-58820
tasman
2003-07-15 06:29
2003.09.18
Проблема с Submit у TWebBrowser


1-58642
Marmel
2003-09-05 11:53
2003.09.18
Перехватить информацию из ячейки Exel.


8-58786
ProgrammSoft
2003-05-19 11:10
2003.09.18
Звук


3-58594
3APA3A
2003-08-26 14:17
2003.09.18
Выбрать все записи в таблице


14-58876
lamorg
2003-08-29 22:15
2003.09.18
Цветные курсоры