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

Вниз

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

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

Наверх





Память: 0.49 MB
Время: 0.009 c
3-58568
KIR
2003-08-27 12:44
2003.09.18
Реален ли такой запрос?


14-58892
KSergey
2003-08-29 13:40
2003.09.18
MS Word и автосохранение


1-58776
BiSer
2003-09-03 11:37
2003.09.18
Создание объектов(компонентов), используя название типа объекта.


3-58525
explorer
2003-08-28 09:56
2003.09.18
Бесплатные БД с поддержкой SQL


14-58879
panov
2003-08-29 16:00
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский