Другие языки программирования и технологии

(delphi) Я заношу в массив ссылки на записи. Как получить доступ к полям записи?

Stasys Fransa
Stasys Fransa
566
Для классов вовсе не та же фигня, так как класс это не запись, а гораздо больше.
Например посмотрим, что произойдет если просто заменить record на
TSharik = class
R : integer;
P : currency;
end;
и использовать a : TObjectList вместо a:array;

1. record и array
new(sh);
if j <= 10 then a[j]:=@sh; где-то надо помнить последний заполненный и проверять на выход из границ массива
и это только для добавления, а если нужно будет удалять ...
PSharik(a[ j ])^.R := strtoint(s1);
и где-то нужно запомнить что на месте j лежит PSharik
if i = j then PSharik(a[ i ])^.R := strtoint(s1);иначе если вместо PSharik окажется PKubik,
то поля у PKubik в общем случае попортятся и никто этого не заметит.
После использования нужно dispose(a[j]);
2. class и TObjectList
sh := TSharik.Create;
sh.R := strtoint(s1);
a.Add(sh); не надо ничего помнить и проверять, а для удаления есть методы Remove Delete
для приведения типов ничего запоминать не надо
if a[ i ] is TSharik then ( a[ i ] as TSharik ).R := strtoint(s1);
После использования ничего не нужно, достаточно a.OwnObjects := True;
-----------------
imho преимущества использования классов очевидны.
Но и это еще не все - ведь у классов есть наследование и полиморфизм!
Сделаем общего предка
TCommonFig = class
P : currency;
function Massa:Double; virtual; abstract;
function Objem:Double; virtual; abstract;
end;
от него потомков
TSharik = class(TCommonFig)
R : integer;
function Massa:Double; override;
function Objem:Double; override;
end;
TKubik = class(TCommonFig)
A,B,C : integer;
function Massa:Double; override;
function Objem:Double; override;
end;
(Реализацию методов опускаю) И теперь можно например вычислять массу по всему списку
не заботясь о типах:
for i := 0 to a.Count-1 do m := ( a[ i ] as TCommonFig ).Massa;
E161Ee Волк
E161Ee Волк
13 991
Лучший ответ
Доброго времени суток.

Естественно не будет работать. Или воспользуйтесь советом Александра Ильина и объявите массив указателей PSharik, или, если уж так хочется иметь массив указателей, то делайте приведение типов.

type
PSharik = ^Sharik;

var
a : array [1..10] of Pointer;
sh : PSharik;

new(sh);
a[j]:=@sh;

PSharik(a[j])^.R := strtoint(s1);

И абсолютно прав Александр. Используйте TList для таких целей. Это тот же массив нетипизированных указателей. Что касается разных записей, то может имеет смысл посмотреть в сторону записей с вариантами?

Удачи!
TK
Timur Kenbaev
59 613
Завести тип PSharik = ^Sharik
a: array [ 1.. .10 ] of PSharik
sh: PSharik

Тогда можно будет к a[ j ]^ обращаться по полям

Но для Delphi - это дикий стиль кодинга
Пора бы научиться использовать классы и коллекции, ну или хотя бы списки
М-м-м. . конечно не знаю целей, но зачем так усложнять то?
Напиши проще:
var
a: array [1..10] of Sharik;
да и пользуйся элементами массива
a[1].R
a[1].Plotnost