Size: a a a

2020 September 11

СП

Сергей Пятыгин... in Delphi & Lazarus
property X[j: integer]: extended read GetX write SetX;
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
YuS
По идее тебе неадо не в X копировать а в FX. Move(Culc(), FX, SizeOf(Culc()));
Да, при работе с полем напрямую компилятор ошибки не выдал. Move происходит в публичной процедуре подкласса, поле находится в приватной части класса. Такое прямое обращение к полю не является грязным?
источник

Y

YuS in Delphi & Lazarus
Нет не является. Собственно приватные переменные и нужны чтоб ты с ним работал во внутренностях реализации своего класса. А в public описывается то, что будет использовать из вне. И соответственно в GetX SetX ты уже можешь навешивать, например  контроль выхода за пределы массива или же наоборот увеличение массива FX до нужных размеров.
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
YuS
Нет не является. Собственно приватные переменные и нужны чтоб ты с ним работал во внутренностях реализации своего класса. А в public описывается то, что будет использовать из вне. И соответственно в GetX SetX ты уже можешь навешивать, например  контроль выхода за пределы массива или же наоборот увеличение массива FX до нужных размеров.
Ок, спс.
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Alexey Shumkin
Странная функция setx. На самом деле, это Append.
Зачем там j - решительно непонятно, т.к. нет никакой зависимости между j и размером массива.
Я могу передать j больше, чем length(x), и код упадёт
Алексей, если будет время и возможность, посмотрите пожалуйста мои вопросы. Хочется понять реализацию свойств массивов в Lazarus.
источник

Y

YuS in Delphi & Lazarus
Сергей Пятыгин
Добрый день! Прошу помочь.
Имеется свойство массив Х с методом сет вида
procedure TSomeClass.SetX(j: integer; AValue: extended);
begin
 SetLength(FX, Length(FX) + 1);
 FX[j] := AValue;
end;
Есть функция Culc с результатом типа array of extended;
Как правильно скопировать массив из Culc в Х?
Копирование типа Х := Copy(Culc(), 0, Length(Culc)); выдает ошибку компилятора-неверное число параметров для сет.
Копирование типа
for j := 0 to N do
 X[j] := Culc()[j]; ошибки не выдает, но мне кажется что это грязно.
Ну тут сеттер не правильно написан, ошибка будет если j будет больше размера FX.
Если тебе надо добавить новое значение в массив то правильней сделать метод AddValue
источник

Y

YuS in Delphi & Lazarus
  { TSomeClass }

 TSomeClass = class
 private
   FX: array of extended;
   function GetX(AIndex: integer): extended;
   procedure SetX(AIndex: integer; AValue: extended);
 public
   procedure AddValue(AValue: extended);
   property X[AIndex: integer]: extended read GetX write SetX;
 end;

 { TSomeClass }

 function TSomeClass.GetX(AIndex: integer): extended;
 begin
   Result := FX[AIndex];
 end;

 procedure TSomeClass.SetX(AIndex: integer; AValue: extended);
 begin
   FX[AIndex] := AValue;
 end;

 procedure TSomeClass.AddValue(AValue: extended);
 begin
   SetLength(FX, Length(FX) + 1);
   FX[Length(FX) - 1] := AValue;
 end;
источник

Y

YuS in Delphi & Lazarus
Как то так примерно
источник

RS

Renat Suleymanov in Delphi & Lazarus
YuS
Ну тут сеттер не правильно написан, ошибка будет если j будет больше размера FX.
Если тебе надо добавить новое значение в массив то правильней сделать метод AddValue
✔️
источник

RS

Renat Suleymanov in Delphi & Lazarus
YuS
  { TSomeClass }

 TSomeClass = class
 private
   FX: array of extended;
   function GetX(AIndex: integer): extended;
   procedure SetX(AIndex: integer; AValue: extended);
 public
   procedure AddValue(AValue: extended);
   property X[AIndex: integer]: extended read GetX write SetX;
 end;

 { TSomeClass }

 function TSomeClass.GetX(AIndex: integer): extended;
 begin
   Result := FX[AIndex];
 end;

 procedure TSomeClass.SetX(AIndex: integer; AValue: extended);
 begin
   FX[AIndex] := AValue;
 end;

 procedure TSomeClass.AddValue(AValue: extended);
 begin
   SetLength(FX, Length(FX) + 1);
   FX[Length(FX) - 1] := AValue;
 end;
МОжно сделать AddValue в виде функции, которая будет возвращать индекс последнего добавленного элемента наружу
источник

Y

YuS in Delphi & Lazarus
Да, часто так делают, вариаций куча :)
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
Добрый день! Прошу помочь.
Имеется свойство массив Х с методом сет вида
procedure TSomeClass.SetX(j: integer; AValue: extended);
begin
 SetLength(FX, Length(FX) + 1);
 FX[j] := AValue;
end;
Есть функция Culc с результатом типа array of extended;
Как правильно скопировать массив из Culc в Х?
Копирование типа Х := Copy(Culc(), 0, Length(Culc)); выдает ошибку компилятора-неверное число параметров для сет.
Копирование типа
for j := 0 to N do
 X[j] := Culc()[j]; ошибки не выдает, но мне кажется что это грязно.
Перечислением/циклом присвоить не грязно. Негрязно возможно было бы добавить функцию метод, типа Assign, в котором будет происходить копирование элементов массива. А лучше отказаться от массива и использовать либо Collection, либо наследники TObjectList. Там куча готовых методов и свойств у этих объектов-списков.... Массиву на самом деле мало места в объектном паскале. Лучше использовать списки
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
Добрый день! Прошу помочь.
Имеется свойство массив Х с методом сет вида
procedure TSomeClass.SetX(j: integer; AValue: extended);
begin
 SetLength(FX, Length(FX) + 1);
 FX[j] := AValue;
end;
Есть функция Culc с результатом типа array of extended;
Как правильно скопировать массив из Culc в Х?
Копирование типа Х := Copy(Culc(), 0, Length(Culc)); выдает ошибку компилятора-неверное число параметров для сет.
Копирование типа
for j := 0 to N do
 X[j] := Culc()[j]; ошибки не выдает, но мне кажется что это грязно.
Ну и правильно выше сказали, что SetX неправильно написана у тебя функция, чтобы ты не имел ввиду
источник

RS

Renat Suleymanov in Delphi & Lazarus
Copy с массивом прокатит, если массивы одного типа
источник

Y

YuS in Delphi & Lazarus
Ну если человек только начинает осваивать, то пусть ковыряет - полезно.
источник

RS

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

Y

YuS in Delphi & Lazarus
Да, это огромный плюс. 👍
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
YuS
  { TSomeClass }

 TSomeClass = class
 private
   FX: array of extended;
   function GetX(AIndex: integer): extended;
   procedure SetX(AIndex: integer; AValue: extended);
 public
   procedure AddValue(AValue: extended);
   property X[AIndex: integer]: extended read GetX write SetX;
 end;

 { TSomeClass }

 function TSomeClass.GetX(AIndex: integer): extended;
 begin
   Result := FX[AIndex];
 end;

 procedure TSomeClass.SetX(AIndex: integer; AValue: extended);
 begin
   FX[AIndex] := AValue;
 end;

 procedure TSomeClass.AddValue(AValue: extended);
 begin
   SetLength(FX, Length(FX) + 1);
   FX[Length(FX) - 1] := AValue;
 end;
Хочу разобраться и понять в какой ситуации j может быть больше FX. Это же свойство и напрямую к сет не обратишься.
источник

RS

Renat Suleymanov in Delphi & Lazarus
Сергей Пятыгин
Хочу разобраться и понять в какой ситуации j может быть больше FX. Это же свойство и напрямую к сет не обратишься.
j индекс же у тебя внутри метода, а FX массив-поле в приватной секции. Вопрос непонятен
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Renat Suleymanov
Перечислением/циклом присвоить не грязно. Негрязно возможно было бы добавить функцию метод, типа Assign, в котором будет происходить копирование элементов массива. А лучше отказаться от массива и использовать либо Collection, либо наследники TObjectList. Там куча готовых методов и свойств у этих объектов-списков.... Массиву на самом деле мало места в объектном паскале. Лучше использовать списки
О Лист видел, но понимания его применения пока нет. Что лучше применить листа TFPList или TList ( сточки зрения НЕОБХОДИМОСТИ обработки ошибок)?
источник