На главную
ПРАВИЛА 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_
  
> TList, непонятки с приведением типа
    По маненьку изучаю Дельфи :D
    Да-да не удивляйтесь! Зачем? Подкинули мне одну програмулину на Делфи 7 надо ее перенести на Mac OSX и iOS :D
    ExpandedWrap disabled
      program Project1;
       
      {$APPTYPE CONSOLE}
       
      {$R *.res}
       
      uses
        System.SysUtils,
        System.classes;
       
      type
        
        TPerson = class
          Name: string;
          Age: byte;
          constructor Create(Name: string; Age: byte);
          function ToString: string;
        end;
       
        TFakePerson = class
          Name: string;
          constructor Create(Name: string);
        end;
       
      { TPerson }
       
      constructor TPerson.Create(Name: string; Age: byte);
      begin
        self.Name:= Name;
        self.Age:= Age;
      end;
       
      function TPerson.ToString: string;
      begin
        Result:= Name + ', ' + IntTostr(Age);
      end;
       
      { TFakePerson }
       
      constructor TFakePerson.Create(Name: string);
      begin
        self.Name:= Name;
      end;
       
       
      var
        persons: TList;
        p: TPerson;
        i: integer;
       
      begin
        persons := TList.Create;
        try
          persons.Add(TPerson.Create('Gregory', 42));
          persons.Add(TPerson.Create('Julia', 27));
          persons.Add(TFakePerson.Create('Moron'));
       
          for I := 0 to persons.Count-1 do
          begin
            p := persons.Items[i]; //<-- тут по идеи должен рантайм эрор
            Writeln(p.ToString); //<-- или тут, но его нет я хз все работает
          end;
        finally
          persons.Free;
        end;
       
        Readln;
      end.

    Выхлоп
    ExpandedWrap disabled
      Gregory, 42
      Julia, 27
      Moron, 0

    Вопрос почему нет ошибки рантайма? :D
    Непорядок :D

    ПС. Delphi 10.3 Rio
    "What I cannot create, I don't understand" Richard Feynman.
    https://github.com/Cfon/
    :D
      Быть может, всё преобразуется к первому типу, попавшему в список. А тогда Fake в нормальный хорошо "ляжет". Попробуйте чутка наоборот: сделайте Fake с другими полями (расходящимися с TPerson), и гляньте на выхлоп.

      Добавлено
      А, нет, всё ж гораздо проще!
      Наверняка преобразование тупо идёт как:
      a := b; // оригинал
      *((типА*)&a) = *((типА*)&b); // Си-шный вид
      Так что получается норм!
        Цитата Cfon @
        <-- тут по идеи должен рантайм эрор

        Pointer совместим с любыми типами указателей
        а выделение памяти происходит с шагом 8 байт (afair)

        используй TList<TPerson>
        Что бы ни происходило, убедись, что ты чист. Обращай внимание на следы, результаты дают только чистые операции. Ощутив необходимость, проконтролируй себя и раз, и два. Будь чист, пусть это станет законом.
          Цитата Славян @
          Попробуйте чутка наоборот: сделайте Fake с другими полями (расходящимися с TPerson), и гляньте на выхлоп.

          Бинго! Изменил тип поля Name в TFakePerson на integer и все накрылось медным тазом, акцес виолейшн в действии! :D
          Акцес виолейшн происходит при обращении полю Name в методе p.ToString.
          Ну а что с p := persons.Items[i]? Там все в порядке это просто запись адреса на память :D

          Добавлено
          Цитата Shaggy @
          используй TList<TPerson>

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


          Рейтинг@Mail.ru
          [ Script Execution time: 0,0996 ]   [ 15 queries used ]   [ Generated: 19.08.19, 06:20 GMT ]