Size: a a a

2020 September 11

СП

Сергей Пятыгин... in Delphi & Lazarus
Renat Suleymanov
У FPC есть еще дженерики списки с хешами. Там удобство еще более очевидно в сравнении с обычным TList
На чем лучше остановиться для решения задачи свойства класса-как динамического массива? TFPGList?
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
На чем лучше остановиться для решения задачи свойства класса-как динамического массива? TFPGList?
В смысле свойства-массива? Зависит от задачи. Я обычно или TFPGList использую или THashMap, если потребуется быстрый доступ по нечисловому индексу, к примеру. Зависит от того как и для чего Вы используете это свойство-массив. В Вашем случае скорее всего TFPGList хватит
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Renat Suleymanov
А что у тебя объявление класса TWinding открывается и не закрывается?
Не понял-почему не закрывается?
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Renat Suleymanov
В смысле свойства-массива? Зависит от задачи. Я обычно или TFPGList использую или THashMap, если потребуется быстрый доступ по нечисловому индексу, к примеру. Зависит от того как и для чего Вы используете это свойство-массив. В Вашем случае скорее всего TFPGList хватит
По числовому, TFPGList.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Сергей Пятыгин
А в чем тогда преимущество дженериков?
в том, что например, тебе нужны, например, сортированные (упрощённо) списки integer, extended и string
в эру до дженериков, ты вынужден был копипастить код для всех них, который отличался бы только типом значений
с дженериками код - в единственном экземпляре
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
Не понял-почему не закрывается?
Ну у тебя обьявление класса как будто внутри другого класса. Ты видимо не это планировал.
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Alexey Shumkin
в том, что например, тебе нужны, например, сортированные (упрощённо) списки integer, extended и string
в эру до дженериков, ты вынужден был копипастить код для всех них, который отличался бы только типом значений
с дженериками код - в единственном экземпляре
Понятно, спс.
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
type

{ TWinding }

 TWinding = class
 private  // доступно только в этом модуле
   //<поля, методы, свойства, события>
   //GUI
   FWireType: TFieldString;
   FWireInsBP: TFieldExtended;
   FWireThickness: TFieldExtended;

Ошибка?
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
type

{ TWinding }

 TWinding = class
 private  // доступно только в этом модуле
   //<поля, методы, свойства, события>
   //GUI
   FWireType: TFieldString;
   FWireInsBP: TFieldExtended;
   FWireThickness: TFieldExtended;

Ошибка?
Так то не виду ошибки. Только закрой объявление. End;
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Там просто 100500 полей и свойств... До end;
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
Там просто 100500 полей и свойств... До end;
Ясно... столько это возможно не совсем хорошо. Надо как то разделять на объекты или под объекты. Хотя щапланировать это. А по коду не понял в чем проблема у тебя
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Renat Suleymanov
Ясно... столько это возможно не совсем хорошо. Надо как то разделять на объекты или под объекты. Хотя щапланировать это. А по коду не понял в чем проблема у тебя
Основная проблема в том, что многие свойства-это массивы. К примеру у обмоток есть витки, это одномерный динамический массив. У витков, при плоскопараллельной постановке задачи, есть две координаты, х и у - это тоже два одномерных массива. Свойства - координаты х и у нужны будут в других классах, к примеру в расчете квазистатического магнитного поля. Сейчас свойства-массивы начал реализовывать-как в начале беседы через property X[j: integer]: extended read GetX write SetX; Но все пишут что это не безопасно.
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Добавил  TMyFPGList = specialize TFPGList<extended>; перед классом-родителем. Скомпилировалось. Теперь как я понимаю нужно добавить конструктор и деструктор?

type

 TMyFPGList = specialize TFPGList<extended>;

 { TWinding }

 TWinding = class
 private  // доступно только в этом модуле
   //<поля, методы, свойства, события>
   //GUI
   FWireType: TFieldString;
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
Основная проблема в том, что многие свойства-это массивы. К примеру у обмоток есть витки, это одномерный динамический массив. У витков, при плоскопараллельной постановке задачи, есть две координаты, х и у - это тоже два одномерных массива. Свойства - координаты х и у нужны будут в других классах, к примеру в расчете квазистатического магнитного поля. Сейчас свойства-массивы начал реализовывать-как в начале беседы через property X[j: integer]: extended read GetX write SetX; Но все пишут что это не безопасно.
Это все прекрасно делается свойствамт-объектами. А объекты могут быть, к примеру, с двумя свойствами публичными X и Y, или свойство может быть свойством-массивом (внутри это может быть и список и массив) и свойство, наконец может быть указанным выше списком. Как удобнее и по обстоятельству
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Renat Suleymanov
Это все прекрасно делается свойствамт-объектами. А объекты могут быть, к примеру, с двумя свойствами публичными X и Y, или свойство может быть свойством-массивом (внутри это может быть и список и массив) и свойство, наконец может быть указанным выше списком. Как удобнее и по обстоятельству
Вариаций много, но на чем остановиться?
источник

AS

Alexey Shumkin in Delphi & Lazarus
Сергей Пятыгин
Вариаций много, но на чем остановиться?
Начни с простого )
Двигайся маленькими шагами
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Alexey Shumkin
Начни с простого )
Двигайся маленькими шагами
Тогда видимо остановлюсь на модификации, которую привели выше. Она работает, в ней меньше кода и я понимаю что она делает. Хотя видимо она менее защищена от исключительных ситуаций...
procedure TSomeClass.SetX(j: integer; AValue: extended);
begin
 if (j>=Length(FX)) or (j<0) then
   Exit; // Exit можно заменить на генерацию ошибки, либо на увеличение массива. Зависит от ситуации
 FX[j] := AValue;
end;
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Но  все относительно.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Сергей Пятыгин
Тогда видимо остановлюсь на модификации, которую привели выше. Она работает, в ней меньше кода и я понимаю что она делает. Хотя видимо она менее защищена от исключительных ситуаций...
procedure TSomeClass.SetX(j: integer; AValue: extended);
begin
 if (j>=Length(FX)) or (j<0) then
   Exit; // Exit можно заменить на генерацию ошибки, либо на увеличение массива. Зависит от ситуации
 FX[j] := AValue;
end;
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Да, спасибо!
источник