Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-21512
Separator
2002-10-29 07:23
2002.11.07
Адресное пространство


14-21766
acorus
2002-10-16 17:59
2002.11.07
Indent/Unindent по Tab/Shift-Tab


14-21769
GOD
2002-10-17 02:37
2002.11.07
Windows windows MUST Die!!!


3-21392
Ээх
2002-10-17 22:44
2002.11.07
Есть RxDBGrid, нужно сделать горизонтальную прокрутку, но не всех


6-21719
kofman
2002-09-10 20:41
2002.11.07
Алгоритм поиска в тексте html-страниц банеров





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