Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Обращению к поле структуры по string переменной


Автор: hug 2.8.2007, 11:35
есть структурка:
Код



type
PMyRec = ^TMyRec;
TMyRec = record
  id_firm: string;
  id_pok: string;
  id_order : string;
end;



Вот как мне в эту структурку прочитать данные. Если известны имена которые нужны читать
Код

SQLParams : array[1..3] of string

SQLParams[1]:='id_firm'
SQLParams[2]:='id_pok'
SQLParams[3]:='id_order'

for i:=1 to NumSQLParams do
             SQLParamsValue[i]:=PMyRec(Node.Data)^.id_firm;


Мне необходимо считывать значение параметром из структуры, обращаясь к поле структуры по имени
Код

or i:=1 to NumSQLParams do
             SQLParamsValue[i]:=PMyRec(Node.Data)^.SQLParams[i];


Вот примерно чтобы хотелось сделать. Как превратить в рабочий код

Автор: aktuba 2.8.2007, 12:46
Никак!!!

Автор: hug 2.8.2007, 12:58
ок как обращаться к переменным не напрямую, а как к строчным значениям?

Автор: Grigory 2.8.2007, 13:07
Цитата(hug @ 2.8.2007,  12:58)
ок как обращаться к переменным не напрямую, а как к строчным значениям?

Ну там все достаточно просто  smile  Время будет напишу. Хочеься даже сказать учите мат.часть  smile 

Автор: hug 2.8.2007, 14:54
Жду время)

Автор: MetalFan 2.8.2007, 15:30
Grigory, не городи ерунды. сказано - нет возможности обращаться к переменным по их строковым псевдонимам во время выполнения программы

т.е. нельзя написать так:
Код

var
  lParam1,
  lParam2: integer;
...
  'lParam1' := 10
...


разве что к published св-вам класса

Автор: EvilsInterrupt 2.8.2007, 19:19
hug
Извините, но я так и не понял зачем это вам так нада? Никакой гибкости от этого не получите, а вот изврату очень даже получите!

Опишите, что вы хотите решить или чем упростить себе жизнь хотите, быть может вы получите более лучшее решение чем вы хотели бы, а это ведь всегда приятно!

Автор: hug 2.8.2007, 19:35
Цитата(MetalFan @ 2.8.2007,  15:30)
Grigory, не городи ерунды. сказано - нет возможности обращаться к переменным по их строковым псевдонимам во время выполнения программы

т.е. нельзя написать так:
Код

var
  lParam1,
  lParam2: integer;
...
  'lParam1' := 10
...


разве что к published св-вам класса

Расскажите как обращаться к publushed полям класса по имени

Автор: EvilsInterrupt 2.8.2007, 19:48
hug, Почитай в Ксавье Пачеко "Delphi 5 для разработчика", том 2 про свойства-массивы.
Это тебе очень многое даст или наведет на мысль к примеру:

objOfDB.FieldValues['ID_Param']; - видел наверное при работе с базами,это свойство-массив

при работе с TjanXmlParser2:

edParamId.Text    := XmlParam.attribute['ID'];

Тоже свойство-массив

Автор: Alexeis 2.8.2007, 22:24
Цитата(hug @  2.8.2007,  19:35 Найти цитируемый пост)
Расскажите как обращаться к publushed полям класса по имени 

  Это возможности так называемой RTTI - информации о типах времени исполнения. В делфи для обращения к свойствам по их строковому имени используется встроенный модуль TypInfo.pas. Достаточно его открыть и не нужна никакая справка, там очень звучные названия функций. Типа GetPropList и т.д.

Автор: MetalFan 3.8.2007, 10:49
Цитата(EvilsInterrupt @  2.8.2007,  19:48 Найти цитируемый пост)
Тоже свойство-массив 

бред. у ObjectPascal'евсого массива не может быть строкового индекса) там просто св-во с параметром (псевдомассив чтоли)...

Автор: EvilsInterrupt 3.8.2007, 12:38
MetalFan, Это есть! Называется оно "свойство-массив". Внизу в коде видишь property Coordinates[Index: Integer], вот это и есть свойство-массив! Позволяет не только принимать Integer, но также можно принять strings, как это сделано в FieldValues при работе с TOraQuery, да и не только с ним

по теме:
Цитата

Index Specifiers 
Index specifiers allow several properties to share the same access method while representing different values. An index specifier consists of the directive index followed by an integer constant between -2147483647 and 2147483647. If a property has an index specifier, its read and write specifiers must list methods rather than fields. For example,

Код

type 
   TRectangle = class 
     private 
       FCoordinates: array[0..3] of Longint; 
       function GetCoordinate(Index: Integer): Longint; 
       procedure SetCoordinate(Index: Integer; Value: Longint); 
     public 
       property Left: Longint index 0 read GetCoordinate write SetCoordinate; 
       property Top: Longint index 1 read GetCoordinate write SetCoordinate; 
       property Right: Longint index 2 read GetCoordinate write SetCoordinate; 
       property Bottom: Longint index 3 read GetCoordinate write SetCoordinate; 
       property Coordinates[Index: Integer]: Longint read GetCoordinate write SetCoordinate; 
       ... 
   end;


и это есть в справке!!!

зы:
Правда пока я это нашел в справке от BDS2006 Architect я мозк убил ((( Но оно же есть! )))

Автор: aktuba 3.8.2007, 12:44
Цитата

Правда пока я это нашел в справке от BDS2006 Architect я мозк убил ((( Но оно же есть! )))


А где в примере строки???

Автор: MetalFan 3.8.2007, 12:55
Цитата(EvilsInterrupt @  3.8.2007,  12:38 Найти цитируемый пост)
ndex Specifiers 

это из другой оперы. данная возможность позволяет н-ким свойствам "обслуживаться" одной функцией.

согласен. внешне свойство-массив выглядит как массив. в т.ч. со строкой в качестве "индекса".
выдержка по теме:
Цитата(Delphi Help)

Array properties are indexed properties. They can represent things like items in a list, child controls of a control, and pixels of a bitmap.

The declaration of an array property includes a parameter list that specifies the names and types of the indexes. For example,

Код

property Objects[Index: Integer]: TObject read GetObject write SetObject;
property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;
property Values[const Name: string]: string read GetValue write SetValue;


The format of an index parameter list is the same as that of a procedure's or function's parameter list, except that the parameter declarations are enclosed in brackets instead of parentheses. Unlike arrays, which can use only ordinal-type indexes, array properties allow indexes of any type.

For array properties, access specifiers must list methods rather than fields. The method in a read specifier must be a function that takes the number and type of parameters listed in the property's index parameter list, in the same order, and whose result type is identical to the property's type. The method in a write specifier must be a procedure that takes the number and type of parameters listed in the property's index parameter list, in the same order, plus an additional value or const parameter of the same type as the property.

For example, the access methods for the array properties above might be declared as

Код

function GetObject(Index: Integer): TObject;
function GetPixel(X, Y: Integer): TColor;
function GetValue(const Name: string): string;
procedure SetObject(Index: Integer; Value: TObject);
procedure SetPixel(X, Y: Integer; Value: TColor);
procedure SetValue(const Name, Value: string);


An array property is accessed by indexing the property identifier. For example, the statements

Код

if Collection.Objects[0] = nil then Exit;
Canvas.Pixels[10, 20] := clRed;
Params.Values['PATH'] := 'C:\BIN'; 


correspond to

Код

if Collection.GetObject(0) = nil then Exit;
Canvas.SetPixel(10, 20, clRed);
Params.SetValue('PATH', 'C:\BIN');


см.подчеркнутый текст. это я и имел ввиду.

Автор: EvilsInterrupt 3.8.2007, 13:00
aktuba, млин ))) Ща блин, покажу я вам строки smile))
у TjanXMLNode2 обладачет таким своейством:
Код

    property attribute[index:variant]: variant read getAttribute write setAttribute;default;

и вот как его применяю:
Код

    XmlParam.attribute['ID']    := edParamId.Text;
    XmlParam.attribute['Name']  := edParamName.Text;


Ну а всем известно, что Variant содержит в себе не только varInteger, но и строки!

Добавлено через 2 минуты и 7 секунд
Автору темы:
Тебе тута написали прилично, садись читать хелп и Пачеко, думаю того что написали тебе должно хватить для реализации твоих мыслей!

Автор: MetalFan 3.8.2007, 15:03
Цитата(EvilsInterrupt @  3.8.2007,  13:00 Найти цитируемый пост)
покажу я вам строки

да что показывать? в выдержке из хэлпа все есть ;)

Автор: AdvanTiSS 14.1.2008, 11:33
в тему вопрос:

есть свойство 

Код

property OutParams[Index: string]: variant read GetOutParam write SetOutParam;


Как передать все элементы свойства-массива в другому экземпляру тогоже класса с сохранением названий индексов?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)