Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.04.2014, 03:00
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию Массив записей, инициализация

Цитата:
Если массив.. объявлен... в разделе переменных модуля, то одновременно с объявлением массива можно выполнить его инициализацию, т. е. присвоить начальные значения элементам массива.
Код:
Team: array[1..5] of String[10]=('Зенит','Динамо','Спартак','Ротор','СКА');
здесь все ясно, а если массив записей и отдельным полям записи нужно присвоить значения?
Код:
type

  TValueType = (vtBeer,vtLiters,vtMoney);

  TbgCell = record
   Rect: TRect;
   toEdit: Boolean;
   Case ValueType: TValueType of
    vtBeer: (Beer: String[16]);
    vtLiters: (Liters: Integer);
    vtMoney:(Money: Currency);
  end;

  TbgRow = array[0..12] of TbgCell;
например: в массиве типа TbgRow у элемента с индексом [0] значение поля toEdit всегда должно быть False, а поле ValueType всегда vtFuel, второй элемент: <массив типа TbgRow>[1].toEdit:= False; <массив типа TbgRow>[1].ValueType:= vtMoney; и т.д.
Возможно ли одновременно с объявлением массива записей присвоить начальные значения полей элемента?
Ответить с цитированием
  #2  
Старый 05.04.2014, 04:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Помидоркин
...в массиве типа TbgRow у элемента с индексом [0] значение поля toEdit всегда должно быть False, а поле ValueType всегда vtFuel, второй элемент: <массив типа TbgRow>[1].toEdit:= False; <массив типа TbgRow>[1].ValueType:= vtMoney; и т.д.
Возможно ли одновременно с объявлением массива записей присвоить начальные значения полей элемента?
Наверное возможно (хотя для массива, да ещё и записей наверное на уровне объявления последних), но по-старинке тоже не плохо должно получаться
Код:
...
var
i: integer;
begin

 for i:= Low(TbgRow) to High(TbgRow) do
   with TbgRow[i] do
    begin
     toEdit:= false;
     ValueType:= vtFuel;
    end;

   end;
...
всё равно ведь по полям бегать наверное нужно


З.Ы. А кстати, в вашем списке газолинчик как раз и отсутствует
Ответить с цитированием
  #3  
Старый 05.04.2014, 05:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Попробовал бы сам поискать, что-ли...
Код:
type person = record
     name:string;
     age: integer;
end;

const persons:array[1..2] of person = (
      (name:'vanya';age:10),
      (name:'petya';age:20));
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Помидоркин (05.04.2014)
  #4  
Старый 05.04.2014, 06:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Я тоже так начал копать, но дойдя до
Код:
...
TbgRow: array[0..12] of TbgCell =
   ((toEdit: false; ValueType: vtFuel),(),(),(),(),(),(),(),(),(),(),(),());
...
забил, больно много букофф, не рационально слегка, циклом проще
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Помидоркин (05.04.2014)
  #5  
Старый 05.04.2014, 10:07
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Попробовал бы сам поискать, что-ли...
Пробовал, не получилось. Огромное спасибо.
Цитата:
Сообщение от Alegun
больно много букофф, не рационально слегка, циклом проще
не выйдет в цикле, они все разные, зато потом Rect присваивать можно будет в цикле

А не подойдет.
Код:
const persons:array[1..2] of person = (...
Это константа, можно, видимо, создать переменную, но мне нужен тип от которого потом можно создавать экземпляры.
Код:
type
....
  TbgRow = array[0..12] of TbgCell = ((toEdit:False;ValueType:vtFuel),
совершенно очевидно, что такое объявление синтаксически неправлильно.
Видимо придется "по-старинке"

Последний раз редактировалось M.A.D.M.A.N., 05.04.2014 в 12:19.
Ответить с цитированием
  #6  
Старый 05.04.2014, 11:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Помидоркин
А не подойдет...
Так вы можете за(варить)дать один массив как образец, а дальше как по шаблону его значения присваивать другим "наследникам"
Код:
...
var
 i: integer;
 bg1, bg2 : array[0..12] of TbgCell;
begin
 for i:= Low(TbgRow) to High(TbgRow) do 
 begin
  bg1[i]:= TbgRow[i];
  bg2[i]:= TbgRow[i];
 end;
end;
...
Ответить с цитированием
  #7  
Старый 05.04.2014, 13:04
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
за(варить)дать ...
гы

те же штаны только застежка сзади,
Код:
  type
   TBaseGrid = class(TCustomControl)
   private
    ...
    FGrid: array of TbgRow;
    ...
Код:
constructor TBaseGrid.Create2(AOwner:TComponent; BData: TBData);
begin
 inherited Create(AOwner);
....
 SetLength(FGrid, BData[0].Count);
 for i:= 0 to Length(FGrid)-1 do
 begin
  FGrid[i,0].toEdit:= False;
  FGrid[i,0].ValueType:= vtBeer;

  FGrid[i,1].toEdit:= False;
  FGrid[i,1].ValueType:= vtPrice;

  FGrid[i,2].toEdit:= True;
  FGrid[i,2].ValueType:= vtLiters;
  //... и т.д.
 end;
end;
Ответить с цитированием
  #8  
Старый 05.04.2014, 13:38
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

а если так
Код:
type
 
  TValueType = (vtBeer,vtLiters,vtMoney);
 
  TbgCell = record
   Rect: TRect;
   toEdit: Boolean;
   Case ValueType: TValueType of
    vtBeer: (Beer: String[16]);
    vtLiters: (Liters: Integer);
    vtMoney:(Money: Currency);
  public
    procedure Init(ValType: TValueType);
  end;
 
  TbgRow = array[0..12] of TbgCell;
...
procedure TbgCell.Init(ValType: TValueType);
begin
   FillChar(Self, SizeOf(TbgCell), 0); // инициализируем все нулем
   ValueType := ValType;
end;
...
constructor TBaseGrid.Create2(AOwner:TComponent; BData: TBData);
begin
 inherited Create(AOwner);
....
 SetLength(FGrid, BData[0].Count);
 for i:= 0 to Length(FGrid)-1 do
 begin
  FGrid[i,0].Init (vtBeer); // вызываем как метод класса
 
  FGrid[i,1].Init(vtPrice);
 
  FGrid[i,2].Init(vtLiters);
  //... и т.д.
 end;
end;
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
Этот пользователь сказал Спасибо cotseec за это полезное сообщение:
Помидоркин (05.04.2014)
  #9  
Старый 05.04.2014, 14:35
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
а если так...
Код:
...
FGrid[i,0].Init (vtBeer);
...
По-моему тоже самое

Код:
FGrid[i,0].ValueType:= vtBeer;
только не надо прописывать процедуру

Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter