Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
ВнизНайти общее свойство у семейства классов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c