На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Глубокая копия списка объектов, Spring4D
    Запутался... :huh:
    Как сделать глубокую копию списка объектов?
    Ниже пробовал через Select, но фиг поймет не работает, при изменении данных в одном из списков меняется другой список тоже (комметами пометил важные места кода). Специально определил деструктор Tperson чтобы отследить удаления, но как видите удаляются всего 3 объекта, куда делись еще 3!!! :wacko:
    Я вроде создаю на каждой итерации новый объект TPerson или нет?
    ExpandedWrap disabled
      unit uPersonDemo;
       
      interface
       
      uses
        System.SysUtils,
        Spring.Collections;
       
      type
        TPerson = class
        public
          Name: string;
          Age: integer;
          constructor Create(AName: string; AAge: integer);
          destructor Destroy; override;
        end;
       
      procedure ProcessPersons;
       
      implementation
       
      { TPerson }
       
      constructor TPerson.Create(AName: string; AAge: integer);
      begin
        Name:= AName;
        Age:= AAge;
      end;
       
      destructor TPerson.Destroy;
      begin
        Writeln('--> TPerson deleting...');
        inherited;
      end;
       
      procedure ProcessPersons;
      begin
        var persons := TCollections.CreateObjectList<TPerson>([
          TPerson.Create('Gregory', 42),
          TPerson.Create('Mark', 27),
          TPerson.Create('Julia', 23)
        ]);
       
        var personsCopy := TEnumerable.Select<TPerson, TPerson>(
          TCollections.CreateList<TPerson>(persons),
          function (p: TPerson): TPerson
          begin
            Result := TPerson.Create(p.Name, p.Age); // new person
          end);
       
        persons[0].Name := 'XXX'; // change person name
       
        // output
        for var p in persons do
        begin
          Writeln(Format('%s', [p.Name]));
        end;
        Writeln;
       
        for var p in personsCopy do
        begin
          Writeln(Format('%s', [p.Name]));
        end;
        Writeln;
      end;
       
      end.

    Выхлоп
    ExpandedWrap disabled
      XXX
      Mark
      Julia
       
      XXX
      Mark
      Julia
       
      --> TPerson deleting...
      --> TPerson deleting...
      --> TPerson deleting...
    Сообщение отредактировано: Cfon -
    "What I cannot create, I don't understand" Richard Feynman.
    https://github.com/Cfon/
    :D
      Проделал следующее, добавил символ ` после имени персоны чтобы было видно где какие данные
      ExpandedWrap disabled
        ...
          var personsCopy := TEnumerable.Select<TPerson, TPerson>(
            TCollections.CreateList<TPerson>(persons),
            function (p: TPerson): TPerson
            begin
              Result := TPerson.Create(p.Name + '`', p.Age); //<-- add ` sign
            end
          );
        ...

      Теперь выхлоп такой :blink:
      ExpandedWrap disabled
        XXX
        Mark
        Julia
         
        XXX`
        Mark`
        Julia`
         
        --> TPerson deleting...
        --> TPerson deleting...
        --> TPerson deleting...

      Это как могло получиться? :D
      Сообщение отредактировано: Cfon -
      "What I cannot create, I don't understand" Richard Feynman.
      https://github.com/Cfon/
      :D
        Разобрался! :blush:
        Короче Select операция ленивая, т.е. при ее вызове мы нифига не получаем! :blink:
        Да-да не удивляйтесь! :D
        А чтобы селект вернул результат надо применить к нему какую-либо, так называемую энергичную операцию, например ToArray:
        ExpandedWrap disabled
          ...
            var personsCopy := TEnumerable.Select<TPerson, TPerson>(
              TCollections.CreateList<TPerson>(persons),
              function (p: TPerson): TPerson
              begin
                Result := TPerson.Create(p.Name, p.Age); //<-- new person
              end
            )
            .ToArray; //<--
          ...

        Теперь вывод правильный
        ExpandedWrap disabled
          XXX
          Mark
          Julia
           
          Gregory
          Mark
          Julia
           
          --> TPerson deleting...
          --> TPerson deleting...
          --> TPerson deleting...

        Теперь по поводу удаления 3х объектов из 6. Тут при вызове селект я передаю ему результат CreateList<TPerson>(persons), а он не контролит создаваемые внутри объекты. Надо бы заюзать CreateObjectList, но не при передаче в селект, а обернуть им сам селект, тогда можно убрать вызов ToArray, поскольку сама передача селекта в CreateObjectList активирует операцию селект:
        ExpandedWrap disabled
            var personsCopy := TCollections.CreateObjectList<TPerson>( //<--
              TEnumerable.Select<TPerson, TPerson>(
                persons,
                function (p: TPerson): TPerson
                begin
                  Result := TPerson.Create(p.Name, p.Age);
                end
              )
            );

        Выхлоп
        ExpandedWrap disabled
          XXX
          Mark
          Julia
           
          Gregory
          Mark
          Julia
           
          --> TPerson deleting...
          --> TPerson deleting...
          --> TPerson deleting...
          --> TPerson deleting...
          --> TPerson deleting...
          --> TPerson deleting...

        ВСЕ! :victory:
        Сообщение отредактировано: Cfon -
        "What I cannot create, I don't understand" Richard Feynman.
        https://github.com/Cfon/
        :D
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,1210 ]   [ 18 queries used ]   [ Generated: 28.02.20, 02:03 GMT ]