На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania 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_
Страницы: (19) « Первая ... 17 18 [19]  все  ( Перейти к последнему сообщению )  
> Новости Embarcadero, Новости, патчи, ссылки, объявления, анонсы...
      Цитата Profi @
      Это я помню.

      Ну я тоже с дельфей максимум ~30% времени работаю. Большую часть времени C#


      Цитата Profi @
      Для того чтобы при выходе за скоуп уничтожить объект - быть управляемым языком не обязательно.

      То есть, если у меня у функции в var определена ссылочная переменная, я могу не вызывать в конце функции Free для, так как компилятор все сделает сам?


      Нет, компилятор сам Free не вызовет. Но как я выше сказал, XmlDoc - интерфейс, так что это и надо.

      Но вообще есть финт ушами, который избавляет от необходимости явно вызывать Free

      ExpandedWrap disabled
        TAutoDestroy = class(TInterfacedObject)
         ...
        public
          constructor Create(AObj: TObject);
          destructor Destroy; override; // в деструкторе вызываем AObj.Free
        end;
         
        procedure AutoDestroy(AObj: TObject): IUnknown;
        begin
          Result := TAutoDestroy.Create(AObj);
        end;
         
         
        begin  
          var Obj := TStringList.Create;
          AutoDestroy(Obj);
          // работаем с Obj - вызывать Free не надо
        end;


      Только это всё лирика, к обсуждаемой теме отношения не имеет
      Не каждая серая масса имеет что-то общее с мозгом (с) Станислав Ежи Лец
        Цитата ^D^ima @
        вот и спрашиваю в каких случаях это будет лучше чем просто написать переменную в var?

        Наверное если хочешь сломать себе голову.. И тому кто будет читать исходник потом :D


        Цитата jack128 @
        Если XmlDoc вынести в блок var, то пиковое потребление памяти вырастит, потому что XmlDoc уничтожится только в конце процедуры.

        Т.е код ни в коем слу­чае случае нельзя написать так?

        ExpandedWrap disabled
          ...
          var
            XmlDoc: ....
          begin
            if ... then
            begin
              XmlDoc := LoadXmlDocument(Filename);
              DoWork(ParseXml(XmlDoc));
              XmlDoc.Free;
            end;
            ...


        Эх.. теперь то с "inline variables" заживём!
          А скоупы, судя по всему, будут в неявный try-finally оборачиваться? Просадка по производительности однако.
          Codero ergo sum
          // Программирую — значит, существую
            Кто рано встает, тому целый день спать хочется
              Объявление переменных по ходу крайне не желательная вещь. Она реально нужна только для циклов.
              Лучше бы сделали это как пункт меню для рефакторинга.
              Компилятор должен автоматом распознавать тип. Так что тут они перемудрили.


              Да и автосборку мусора. Элементарно решается двух-связным списком и особым интерфейсом у которого автоматом вызывается метод Free. Все кому надо давно бы сделали. Но нет они вместо ARC ввели слабые ссылки да ещё через корявый синтаксис вместо использование атрибута или оператора.
              Правильный обед должен состоять из 5 блюд приготовленных из 33 ингредиентов.
                Цитата Pavia @
                Объявление переменных по ходу крайне не желательная вещь. Она реально нужна только для циклов.
                Не согласен! А именно: когда пишу сложную функцию по обработке чего-то большого, то в одном месте i-целая переменная (для пробежки в массиве), в другом - плавающее число из тетрадки с записями, в третьем - вообще комплексное число. Таких случаев действительно не много, но они есть; и объявления "по-ходу" выглядят крайне полезными. :yes:
                  Цитата Pavia @
                  Объявление переменных по ходу крайне не желательная вещь.

                  Наоборот. Лучше бы, конечно, сделали let-блоки с переменными, а ля ML:
                  ExpandedWrap disabled
                    let var x := 1;
                        var y := 2
                    in begin
                        WriteLn(x + y);
                    end;


                  Цитата Pavia @
                  Да и автосборку мусора.

                  Не понял фразы. В Делфи добавляют сборку мусора? Или ты хотел бы, чтобы добавили?

                  В любом случае
                  Цитата Pavia @
                  Элементарно решается двух-связным списком и особым интерфейсом у которого автоматом вызывается метод Free

                  нет, не решается. Сборщик мусора, несмотря на название, не трогает недостижимые («мёртвые») объекты, а сохраняет достижимые («живые»), перемещая их в другую область памяти.
                  И вообще, устройство GC несколько сложнее, чем «двусвязный список» и «особый интерфейс».

                  Вот, рекомендую к просмотру, хоть там и Java:
                  https://www.youtube.com/watch?v=JBaZ4lK6OBk

                  Цитата Pavia @
                  Но нет они вместо ARC

                  Так, стоп, GC и ARC — принципиально разные алгоритмы со своими плюсами и минусами (отличными друг от друга в т.ч.), и в Делфи, насколько я помню, как раз реализован ARC для интерфейсов. Т.е., достаточно унаследоваться от TInterfacedObject вместо TObject, и вот тебе объекты с ARC, для которых не нужно вызывать Free вручную. jack128 же написал об этом выше.

                  Или я тебя не понял.
                  Сообщение отредактировано: korvin -
                  “Object-oriented design is the roman numerals of computing.” — Rob Pike
                  All software sucks
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,1308 ]   [ 17 queries used ]   [ Generated: 17.11.18, 13:27 GMT ]