Главная страница
    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.48 MB
Время: 0.01 c
1-58714
паша_ок
2003-09-08 07:43
2003.09.18
Определение имени компонента, на котором кликнули мышкой?


14-58827
Cyber Chaynik
2003-08-30 03:09
2003.09.18
Какая мышь лучше ?


8-58784
Mor
2003-05-12 19:09
2003.09.18
графика


11-58608
Bartov
2003-01-09 01:19
2003.09.18
Зарубежные KOL компонент


14-58828
Igorek
2003-08-30 15:34
2003.09.18
Ну и про меня замолвите словечко





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