![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В цикле последовательно обратиться к полям записи.
AlexanderMS © (2007-12-26 16:03:00)Скажите, пожалуйста, как в цикле последовательно обратиться к полям записи, зная их размер?
Есть переменная типа record. Необходимо в цикле последовательно прочитать из текстового файла значения полей (каждой поле - 1 байт). То есть не так (var F: TextFile):
Readln(F, S);
MyRec.Field1 := strtoint(S);
Readln(F, S);
MyRec.Field2 := strtoint(S);
Readln(F, S);
MyRec.Field3 := strtoint(S);
...
А вот так:
for Line := 0 to RecCount - 1 do
begin
Readln(F, S);
// MyRec.Fields[Line] := strtoint(S); тут нужен трюк
end;
Как можно осуществить сабж?
AlexanderMS (2007-12-26 16:39:00) [21]
> Но тогда объясни, зачем тебе цикл ?
Чтобы не писать:
Readln(F, S);
MyRec.FieldX := strtoint(S);
много раз...
А запись нужна для удобства обращения.
> И какое отношение декларатор TextFile имеет к TMyRec = packed
> record ?
Никакого, просто для примера.
Сергей М. (2007-12-26 16:36:00) [22]
> Palladin © (26.12.07 16:33) [9]
>
>
> Судя по первому посту, у него текстовый файл
Вот и непонятно, каким образом он желает сопоставить записи переменнойдлины в текстовом файле с записью фиксированного размера в памяти приложения..
Sapersky (2007-12-26 16:34:00) [23]AlexanderMS © (26.12.07 16:03)
Можно использовать вариантные поля в записях (см. хелп, Variant parts in records).
TRecord = record
Case integer of
0 : (Field1, Field2, Field3 : Byte);
1 : (Fields : array [0..2] of Byte);
end;
Само собой, правильно оно будет работать только в том случае, если поля Field1 - Field3 имеют одинаковый размер.
Anatoly Podgoretsky (2007-12-26 16:33:00) [24]> Palladin (26.12.2007 16:23:07) [7]
Вообще то у него байты, но это несущественно
Palladin (2007-12-26 16:33:00) [25]
> [8] Сергей М. © (26.12.07 16:26)
Судя по первому посту, у него текстовый файл с кучей строк и он хочет, путем минимальных пальцедвижений при наборе кода заполнить ими массив записей...
Palladin (2007-12-26 16:33:00) [26]вот я и говорю нафик запись то нужна... массив чем не устраивает?
Сергей М. (2007-12-26 16:26:00) [27]
> можно приписать
Да не не можно, а нужно!
Но тогда объясни, зачем тебе цикл ?
И какое отношение декларатор TextFile имеет к TMyRec = packed record ?
Palladin (2007-12-26 16:23:00) [28]
> [3] Anatoly Podgoretsky © (26.12.07 16:15)
умею, если трудности с восприятием информации, то я предлагал следующее
TMyRecord=Record
Fields:Array of String;
End;
AlexanderMS (2007-12-26 16:22:00) [29]
> Сергей М. © (26.12.07 16:21) [5]
> т.е. объявление записи у тебя выглядит так:
Да, только без packed. :) Но можно приписать.
Сергей М. (2007-12-26 16:21:00) [30]т.е. объявление записи у тебя выглядит так:
TMyRec = packed record
Field1: Byte;
Field2: Byte;
..
FieldN: Byte;
end;
??
AlexanderMS (2007-12-26 16:19:00) [31]Я имел ввиду обратиться к полям записи, используя, если возможно, обращение к памяти: начальный адрес записи и смещение по одному байту. Это можно сделать? Если можно, то как?
> Это вообще абсурд, цикл по записям, а обращение к массиву
> полей.
> И у записей нет никакого массива! У него есть только имена.
// MyRec.Fields[Line] := strtoint(S); тут нужен трюк
Здесь комментарий стоит, и никакого массива не планируется: я думал, так легче понять. Оказалось, наоборот.
Anatoly Podgoretsky (2007-12-26 16:15:00) [32]Ты читать умеешь?
> И у записей нет никакого массива! У него есть только имена.
Palladin (2007-12-26 16:11:00) [33]хочешь в цикле, сделай внутри записи массив, только нафик тогда нужна запись?
Anatoly Podgoretsky (2007-12-26 16:08:00) [34]Это вообще абсурд, цикл по записям, а обращение к массиву полей.
И у записей нет никакого массива! У него есть только имена.