![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найти общее свойство у семейства классов [D6]
MsGuns © (2002-10-25 13:20:00)Есть текст, извлекающий указатель на поле НД текущего DB-контрола
и ищущий в предварительно сохраненном массиве значение соотв.поля предыдущей записи НД (реализация фичи Ditto)
function GetFieldFromArray: variant;
// Извлечение из массива значения пред.поля текущей колонки грида
// Если массив не определен, возвращается string="Not Assigned"
var
ds: TDataSet;
fld: TField;
begin
result := "Not Assigned";
fld := nil; // Кляп для компиллера
if PrevRecFlds=nil then exit;
ds := GetActiveDataSet; // Получить НД, связанный с контролом
if ds=nil then exit; // Текущий контроль не DBControl
if not (ds.State in [dsInsert,dsEdit]) then exit; // НД не в Modify
if Screen.ActiveControl.ClassType=TDBGrid then
fld := TDBGrid(Screen.ActiveControl).SelectedField;
if Screen.ActiveControl.ClassType=TDBEdit then
fld := TDBEdit(Screen.ActiveControl).Field;
if Screen.ActiveControl.ClassType=TDBCombobox then
fld := TDBCombobox(Screen.ActiveControl).Field;
if Screen.ActiveControl.ClassType=TDBMemo then
fld := TDBMemo(Screen.ActiveControl).Field;
result := PrevRecFlds[fld.Index];
end;
Можно ли, не проверяя текущий контрол на принадлежность к КОНКРЕТНОМУ типу, просто проверить, есть ли у него такое св-во и, если есть, присвоить его значение (точнее, указатель) нужной переменной (fld). Ответ, в общем-то я знаю: положительный. Но вот КАК ? В тексейре слишком замудренно это объясняется - я не понял (тупой по жизни, наверное).
Спасибо за помощь
evgeg (2002-10-25 22:30:00) [1]http://ad4.bannerbank.ru/bb.cgi?cmd=ad&pubid=7708682&pg=1&vbn=750&w=468&h=60&num=1&r=ssi&ssi=nofillers&r=ssi&nocache=566
MBo (2002-10-25 16:34:00) [2]>на конкретном примере
ищем компоненты, у которых есть Height - это свойство появляется на уровне TControl
1) if Components[i] is TControl then (Height имеется)
2) if GetPropInfo(components[i].ClassInfo, "Height")<>nil then
аналогично
В хелпе D5 RTTI не документировано, не знаю как в более новых версиях. Я обычно смотрю в typinfo.pas.
кое-какие примеры есть здесь:
http://www.lmc-mediaagentur.de/dpool/pascal02.htm
Юрий Зотов (2002-10-25 16:31:00) [3]> работа со свойствами и методами, получение информации о
> свойствах и метода
Просто посмотрите раздел interface в модуле TypInfo. Там все есть, а все названия говорят сами за себя.
MsGuns (2002-10-25 16:20:00) [4]>MBo © (25.10.02 13:34)
А нельзя ли по-русски, т.е. на конкретном примере (без Predok и т.п.).
>Ученик © (25.10.02 13:51)
Получить доступ к полю ИМЕННО ИЗ ГРИДА я могу и проще, как я это и делаю в приведенном коде.
ОБОИМ СПАСИБО ЗА УРОК По ООП !
Заодно не подскажете где можно взять хорошую доку по процедурам (разбитую по тематике, например, работа со свойствами и методами, получение информации о свойствах и методах и т.п.) Стандартный Хелп подразумевает знание по крайней мере первых букв нужной процедуры/функции, а если мне надо что-то, а я не знаю даже как наз-ся такая фича и есть ли она вообще, то поиск по станд. SDK редко когда помогает.
Ученик (2002-10-25 13:51:00) [5]Частично решает проблему это, но с Grid-ом не получится
uses
TypInfo;
function FieldFromControl(Control : TControl) : TField;
var
DataSource : TDataSource;
begin
Result := nil;
if IsPublishedProp(Control, "DataSource") and
IsPublishedProp(Control, "DataField") then begin
DataSource := GetObjectProp(Control, "DataSource") as TDataSource;
if (DataSource <> nil) and (DataSource.DataSet <> nil) then
Result := DataSource.DataSet.FindField(GetStrProp(Control, "DataField"))
end
end;
MBo (2002-10-25 13:34:00) [6]1) Если свойство наследуется от общего предка
if SomeControl is TPredokSoSvoystvom
или SomeControl.InheritsFrom(TPredokSoSvoystvom)
2)if GetPropInfo(SomeObject.ClassInfo, PropName)<>nil то оно есть