Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с указателями [D7]


Страницы:   1 2

aka ©   (2012-12-28 11:35:00) 

Привет, чтобы лучше донести суть вопроса набросал примерчик


program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

type
 PA = ^TA;
 TA = record
   recType: string[20];
   field_1: Integer;
   field_2: Integer;
 end;

 PB = ^TB;
 TB = record
   recType: string[20];
   field_3: Integer;
   field_4: Integer;
   name: String[30];
 end;

 PC = ^TC;
 TC = record
   recType: string[20];
   field_5: Integer;
 end;

var
 PtrData: array of Pointer;
 PtrCount: Integer;

 A: PA;
 B: PB;
 C: PC;

 i: Integer;
begin
 PtrCount := 3;
 SetLength(PtrData, PtrCount);

 New(A); //index in PtrData array = 0
 A.recType := 'AType';
 A.field_1 := 1;
 A.field_2 := 2;
 PtrData[0] := A;

 New(B); //index in PtrData array = 1
 B.recType := 'BType';
 B.field_3 := 1;
 B.field_4 := 2;
 B.name := 'ivan';
 PtrData[1] := B;

 New(C); //index in PtrData array = 2
 C.recType := 'CType';
 C.field_5 := 1;
 PtrData[2] := C;

 writeln(PA(PtrData[0])^.recType); //out = AType
 writeln(PB(PtrData[1])^.recType); //out = BType
 writeln(PC(PtrData[2])^.recType); //out = CType

 for i := 0 to Length(PtrData) - 1 do
   writeln(i,' - ',PA(PtrData[i])^.recType);

 for i := 0 to Length(PtrData) - 1 do
   Dispose(PtrData[i]);

 readln;
end.



Теперь, если мне нужно вывести значения, я могу поступить так:

 writeln(PA(PtrData[0])^.recType); //out = AType
 writeln(PB(PtrData[1])^.recType); //out = BType
 writeln(PC(PtrData[2])^.recType); //out = CType


Здесь мы явно "показываем" тип PA или PB или PC перед PtrData[I], потому что знаем что там "лежит". Вопрос: как быть если мы не знаем что там, но нам нужно узнать какой там находится тип записи (у каждой и трех структур {A,B,C} имеется общее поле recType).

Можно и так, но бутет ли так корректно, применил один из типов, хотя там может быть и другой:

for i := 0 to Length(PtrData) - 1 do
   writeln(i,' - ', PA(PtrData[i])^.recType);


Сергей М.   (2012-12-28 12:11:00) [21]


> А может пойдет?
>


Ну в качестве самодельного велосипеда вполне подойдет.

Только непонятно зачем в поле recType держать именно строку, в то время как достаточно одного байта.


Сергей М.   (2012-12-28 12:07:00) [22]


> нужны же именно записи


Дельфийские классы и объекты и есть ничто иное как записи.


aka   (2012-12-28 12:06:00) [23]

пардон.


 for i := 0 to Length(PtrData) - 1 do
 begin
   if(PA(PtrData[i])^.recType = 'AType') then
     writeln(PA(PtrData[i])^.field_2);

   if(PA(PtrData[i])^.recType = 'BType') then
     writeln(PB(PtrData[i])^.name);

   if(PA(PtrData[i])^.recType = 'CType') then
     writeln(PC(PtrData[i])^.field_5);
 end;


aka   (2012-12-28 12:04:00) [24]

А может пойдет?

работает без ошибок, ну первый IF - понятное дело, но ведь нормально работает и в остальных случаях.

 for i := 0 to Length(PtrData) - 1 do
 begin
   if(PA(PtrData[i])^.recType = 'BType') then
     writeln(PA(PtrData[i])^.field_2);

   if(PA(PtrData[i])^.recType = 'BType') then
     writeln(PB(PtrData[i])^.name);

   if(PA(PtrData[i])^.recType = 'CType') then
     writeln(PC(PtrData[i])^.field_5);
 end;


aka   (2012-12-28 11:51:00) [25]


> используется в дельфийских классах и объектах

Ну так нужны же именно записи.


aka   (2012-12-28 11:50:00) [26]


> Сергей М. ©   (28.12.12 11:44) [1]

Что не будет - догадывался.
RTTI - за это ничего не знаю, почитаю.


Сергей М.   (2012-12-28 11:44:00) [27]


> бутет ли так корректно


Не будет.

Собственно а к чему этот велосипед, если он давно уже изобретен, называется RTTI (таблица информации о типах времени выполнения) и сплошь и рядом используется в дельфийских классахи объектах


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо