Как я должен освободить массив объектов в деструкторе Delphi 7?

@ Купер, спасибо за предложенное решение, я еще не пробовал его, но попробую.

После небольшого обдумывания и исследования, эта статья Google была действительно полезной , я подумал, что было бы легче разделить то, что я хотел сделать, на разные функции и разыграть передачу.

function createHTML(data){
  var t = HtmlService.createTemplateFromFile('template');
  t.data = data;
  sendEmail(t.evaluate().getContent());
}

function sendEmail(htmlBody){
  var mailAddy = "email addy";
  MailApp.sendEmail({
       to:mailAddy,
       subject: 'Test Email markup - ' + new Date(),
       htmlBody: htmlBody,
   });
}

function getData(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");
  var range = sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn());
  var values = range.getValues();

  for (var i = 0; i < values.length; i++){
    var data = values[i];
    createHTML(data);
  }
}

Функция getdata получает строку данных, которую я хочу использовать, из электронной таблицы, а затем передает ее в createHTML, который создает HTML-текст сообщения. это решает мою блокировку попыток перебрать данные либо с помощью кода Google или HTML.

Затем он передает результаты в функцию sendEmail для отправки электронного письма.

это была функция createHTML, которая изменила правила игры. Объявление t.data в файле .gs и передача значений в html способом, который я знаю, означало, что я мог бы перебрать свой массив. Если это имеет какой-то смысл.

Это было мое решение, но, конечно, я открыт для всех способов сделать это и спросить, почему х лучше.

9
задан Blorgbeard 12 February 2009 в 23:44
поделиться

8 ответов

Необходимо циклично выполниться через и свободный каждый созданный объект.

Необходимо знать, то объявление, что массив TMySubInfo на самом деле не создает объекты. Необходимо создать их позже.

Я использовал бы TList вместо этого для более динамического подхода. Вы могли даже использовать TObjectList, который может освободить все его объекты, когда список освобожден.

12
ответ дан 4 December 2019 в 06:17
поделиться

Необходимо освободить каждый объект, как это

destructor TMyInfo.Destroy;
var
  I: Integer;
begin
  for I:= Low(SubInfo) to High(SubInfo) do
   SubInfo[I].Free;
  SetLength(SubInfo, 0); 
  inherited;
end;
9
ответ дан 4 December 2019 в 06:17
поделиться

Вы освобождаете объекты тем же путем, Вы выделили их. Если Вы присвоили значение элемента путем называния конструктора класса, то свободным объект ссылаемый тем элементом.

destructor TMyInfo.Destroy;
var
  info: TMySubInfo;
begin
  for info in SubInfo do
    info.Free;
  inherited;
end;

Это использует синтаксис, представленный в Delphi 2005. Если у Вас есть более старая версия, используйте явную переменную цикла:

var
  i: Integer;
begin
  for i := 0 to High(SubInfo) do
    SubInfo[i].Free;

Вы не должны звонить SetLength в конце. Поле динамического массива как SubInfo выпущен автоматически, когда объект уничтожается. Это работает то же интерфейсом, строкой и полями Variant.

6
ответ дан 4 December 2019 в 06:17
поделиться

При создании объектов через вызовы конструктора необходимо выполнить вызовы к Свободному для освобождения их. В противном случае Вы не делаете.

3
ответ дан 4 December 2019 в 06:17
поделиться

Согласованный со всеми вышеупомянутыми предложениями, но я хочу добавить (по общему признанию несколько анальную) рекомендацию, что Вы всегда называете FreeAndNil () процедурой в предпочтении к Бесплатному методу.

Рано или поздно Вы случайно получите доступ к объекту, который Вы уже освободили. Если у Вас есть привычка к FreeAndNil-лугу все, то Вы получаете непосредственный a/v на строке, которая содержит проблему. Если Вы просто Free'd объект, Вы, вероятно, получите таинственный и по-видимому не связанный отказ некоторое время спустя...

Это могло бы казаться маниакальным в контексте деструктора, как здесь. Хорошо, это немного, но или каждый делает это везде или нисколько.

5
ответ дан 4 December 2019 в 06:17
поделиться

Для каждого нового должно быть свободное.

2
ответ дан 4 December 2019 в 06:17
поделиться

Это тоже анально, но вроде как освободить в порядке, обратном созданию, например:

For I := List.Count-1 downto 0 do
  List[I].Free;

Я рассматриваю создание и разрушение как паретез (), хотя это делает небольшое фактическое выполнение. Bri

4
ответ дан 4 December 2019 в 06:17
поделиться

Вы не можете использовать Finalize ?

0
ответ дан 4 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: