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

Вниз

Найти общее свойство у семейства классов   Найти похожие ветки 

 
MsGuns ©   (2002-10-25 13:20) [0]

Есть текст, извлекающий указатель на поле НД текущего 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). Ответ, в общем-то я знаю: положительный. Но вот КАК ? В тексейре слишком замудренно это объясняется - я не понял (тупой по жизни, наверное).

Спасибо за помощь


 
MBo ©   (2002-10-25 13:34) [1]

1) Если свойство наследуется от общего предка
if SomeControl is TPredokSoSvoystvom
или SomeControl.InheritsFrom(TPredokSoSvoystvom)

2)if GetPropInfo(SomeObject.ClassInfo, PropName)<>nil то оно есть


 
Ученик ©   (2002-10-25 13:51) [2]

Частично решает проблему это, но с 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;


 
MsGuns ©   (2002-10-25 16:20) [3]

>MBo © (25.10.02 13:34)

А нельзя ли по-русски, т.е. на конкретном примере (без Predok и т.п.).

>Ученик © (25.10.02 13:51)

Получить доступ к полю ИМЕННО ИЗ ГРИДА я могу и проще, как я это и делаю в приведенном коде.

ОБОИМ СПАСИБО ЗА УРОК По ООП !
Заодно не подскажете где можно взять хорошую доку по процедурам (разбитую по тематике, например, работа со свойствами и методами, получение информации о свойствах и методах и т.п.) Стандартный Хелп подразумевает знание по крайней мере первых букв нужной процедуры/функции, а если мне надо что-то, а я не знаю даже как наз-ся такая фича и есть ли она вообще, то поиск по станд. SDK редко когда помогает.


 
Юрий Зотов ©   (2002-10-25 16:31) [4]

> работа со свойствами и методами, получение информации о
> свойствах и метода

Просто посмотрите раздел interface в модуле TypInfo. Там все есть, а все названия говорят сами за себя.


 
MBo ©   (2002-10-25 16:34) [5]

>на конкретном примере
ищем компоненты, у которых есть 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


 
evgeg ©   (2002-10-25 22:30) [6]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.017 c
7-21833
Друпи
2002-09-03 23:18
2002.11.07
Привязка программы к компьютеру


4-21896
vap
2002-09-24 14:11
2002.11.07
имя EXE зная hWnd


1-21684
Yuraz
2002-10-28 12:17
2002.11.07
Как сделать свою подсказку для каждой строчки ListBox?


3-21353
PAVELsinicinV
2002-10-17 10:54
2002.11.07
какую размерность имеет символьное поле (Characner 2)


1-21518
MsGuns
2002-10-25 13:20
2002.11.07
Найти общее свойство у семейства классов