Текущий архив: 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.48 MB
Время: 0.008 c