powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли получить размер поля записи?
16 сообщений из 16, страница 1 из 1
Можно ли получить размер поля записи?
    #39492162
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, есть тип:

Код: pascal
1.
2.
3.
4.
5.
TRec1 = packed record
  A: Byte;
  B: Integer;
  C: array[1..5] of Char;
end;



Есть необходимость в выражениях использовать константы размеров полей этой записи.
Но такие конструкции не работают:
Код: pascal
1.
2.
3.
SizeOf(TRec1.A)
SizeOf(TRec1.B)
SizeOf(TRec1.C)



Работает, например, так:
Код: pascal
1.
2.
3.
4.
PRec1 = ^TRec1;
SizeOf(PRec1(nil).A)
SizeOf(PRec1(nil).B)
SizeOf(PRec1(nil).C)


Но как-то выглядит слегка коряво...

Подскажите пожалуйста, как можно "красиво" получать размер полей записи?
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492168
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikhalichПодскажите пожалуйста, как можно "красиво" получать размер полей записи?
Сначала объяви переменную с рекордом и её и измеряй.
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492177
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanСначала объяви переменную с рекордом и её и измеряй.Фактически я именно это и делаю в конструкции вида
Код: pascal
1.
SizeOf(PRec1(nil).A)
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492205
Q640
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TForm1.Button7Click(Sender: TObject);
type TRec1 = packed record A: Byte; B: Integer; C: array[1..5] of Char; end;
var Rec1: TRec1;
begin
ShowMessage(Format('A~%d, B-%d, C~%d', [SizeOf(Rec1.A), SizeOf(Rec1.B), SizeOf(Rec1.C)]));
end;
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492212
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Q640,
Именно это я и делаю. Только в моем варианте не нужно заморачиваться с объявлением переменной.
PRec1(nil) - это фактически переменная, нулевой указатель на структуру типа TRec1.
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492227
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikhalichНо как-то выглядит слегка коряво...
так тебе "шашечки или ехать?"
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492230
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доктак тебе "шашечки или ехать?"
Я уже еду.... А теперь хочу шашечки, блекджек, шл...х, коктейль и музыку.
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492239
Q640
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется вы как раз заморочились намного больше чем было бы с объявлением переменной...
Ну объявили бы и всё, не будете использовать - она соптимизируется вникуда... Нулевые указатели, блин. С:
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492250
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Q640Мне кажется вы как раз заморочились намного больше чем было бы с объявлением переменной...
Ну объявили бы и всё, не будете использовать - она соптимизируется вникуда... Нулевые указатели, блин. С:
Чтобы объявить переменную, нужно лезть черт знает куда по коду.
Нужно помнить название переменной (или постоянно смотреть как она называется). Т.е. заметное количество телодвижений.
Если мы таким образом используем переменную, то память под нее все равно будет выделяться? А если там большие массивы, то этот факт не есть гут.
Поэтому хочу какую-нибудь простую и приятную конструкцию типа SizeOf(Integer).
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492260
Q640
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не будет.
И я объявил прямо над местом где понадобилось узнать размер, никуда не "лазил". С:
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492263
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhalich,

ну, вот так. Все в соответствии с описанием:
System.SizeOf FunctionReturns the number of bytes occupied by a variable or type.

Т.е., подавай либо экземпляр, либо "чистый тип".

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type
  TA5C = array[1..5] of Char;
  TRec1 = record
    A: Byte;
    B: Integer;
    C: TA5C;
  end;
begin
  ShowMessageFmt('A~%d, B-%d, C~%d', [SizeOf(Byte), SizeOf(Integer), SizeOf(TA5C)]);
end;


...

В общем-то, твое желание работать с именами полей, а не с их типом, понятно: тип поля может измениться. Но - "так сделано", "люминь", "можете жаловаться" (по выбору)...
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492316
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Q640Не будет.
И я объявил прямо над местом где понадобилось узнать размер, никуда не "лазил". С:
А код между разделом "var" и местом, "где все это дело приспичило" просто не существует? У меня там много букавок.

И ассемблер говорит такую загадочную вещь:
для
Код: pascal
1.
C: array[1..5] of Char;


Код: sql
1.
add esp,-$10


для
Код: pascal
1.
C: array[1..10] of Char;


Код: sql
1.
add esp,-$1c
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492317
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччДНо - "так сделано", "люминь", "можете жаловаться" (по выбору)...
Тогда в пичали пойду за горькой.....
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492550
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikhalichQ640Не будет.
И я объявил прямо над местом где понадобилось узнать размер, никуда не "лазил". С:
А код между разделом "var" и местом, "где все это дело приспичило" просто не существует? У меня там много букавок.

И ассемблер говорит такую загадочную вещь:
для
Код: pascal
1.
C: array[1..10] of Char;


Код: sql
1.
add esp,-$1c

Ага, как интересно

У меня вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm1.FormCreate(Sender: TObject);
var
  C: array[1..10] of Char;
begin
  ShowMessage(SizeOf(C).ToString)
end;


005C9C9B 83C4DC           add esp,-$24
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492960
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

потому что у тебя там ещё переменная типа string

Закомментируй ShowMessage - будет примерно так же
...
Рейтинг: 0 / 0
Можно ли получить размер поля записи?
    #39492993
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhalich, "красиво"!
Код: pascal
1.
2.
3.
4.
5.
6.
{ TMyRecord }

class function TMyRecord.SizeOf(const aFildName:String): Integer;
begin
 Result := TRTTIContext.Create.GetType(TypeInfo(TMyRecord)).GetField(aFildName).FieldType.TypeSize;
end;



Есть необходимость в выражениях использовать константытак используй!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 TMyRecord = record
   private type
    TMyA = Integer;
    TMyB = Double;
   const
    cA = SizeOf(TMyA);
    cB = SizeOf(TMyB);
   public
    A : TMyA;
    B : TMyB;
 end;
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли получить размер поля записи?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]