1. Pascal / Говнокод #5260

    +97

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    TPicture = class(TInterfacedPersistent, IStreamPersist)
    ....
        property Bitmap: TBitmap read GetBitmap write SetBitmap;
        property Icon: TIcon read GetIcon write SetIcon;
        property Metafile: TMetafile read GetMetafile write SetMetafile;
    ....
    
    procedure TPicture.ForceType(GraphicType: TGraphicClass);
    begin
      if not (Graphic is GraphicType) then
      begin
        FGraphic.Free; // 0_0 йобаный стыд!!
        FGraphic := nil;
        FGraphic := GraphicType.Create;
        FGraphic.OnChange := Changed;
        FGraphic.OnProgress := Progress;
        Changed(Self);
      end;
    end;
    
    function TPicture.GetBitmap: TBitmap;
    begin
      ForceType(TBitmap);
      Result := TBitmap(Graphic);
    end;
    
    function TPicture.GetIcon: TIcon;
    begin
      ForceType(TIcon);
      Result := TIcon(Graphic);
    end;
    
    function TPicture.GetMetafile: TMetafile;
    begin
      ForceType(TMetafile);
      Result := TMetafile(Graphic);
    end;

    Взято из "ДНК", т.е. VCL от Delphi7. unit graphics.pas

    Методы get-аксессоры свойств Bitmap, Icon и Metafile вызывают ForceType(). Шутка в том, что если картинка у вас другого типа - то она будет ВНЕЗАПНО выпилена насовсем, стоит только прочитать(sic!) не то свойство объекта класса TPicture.

    Наступил сам на эти грабли и потратил драгоценный, час пока понял в чем дело.

    Запостил: StriderMan, 13 Января 2011

    Комментарии (21) RSS

    • логика интересная: три разных метода для одной вещи, если тип не тот - картинку не возвращаем, но и вообще она куда-то девается
      Ответить
    • > Шутка в том, что если картинка у вас другого типа - то она будет ВНЕЗАПНО выпилена насовсем

      Нет, она не будет выпилена. Она будет выпилена и создана заново.
      В ВЦЛ многое так: чтобы поменять свойство чего-либо, надо это что-либо уничтожить, а потом создать заново с новым значением свойства. Даже чтобы поменять пустяковое свойство.
      Поэтому в ВЦЛ+ОпенГЛ постоянно ДЦ теряется: форма всё время новая создаётся.
      Короче, я на ВинАПИ перешёл, обмазываюсь винапишными структурами, и своими говноструктурами тоже обмазываюсь.
      Ответить
      • Я имею ввиду картинку как контент - создана будет ПУСТАЯ картинка. И самое паршивое что это происходит, в get-аксессоре.

        Вот пример:
        закачиваем, например, иконку:

        picture.icon.LoadFromFile(....)

        ....делаем что-то...

        if picture.Bitmap..... //дальше можно не продолжать, иконки больше нет
        Ответить
        • Всё, я врубился. Мда, говнецо то ещё. Вместо конвертации картинка тупо уничтожается. Сделать конвертацию ботланд ниасилил.
          Ответить
        • а вы что, хотели чтобы геттер вам форматы преобразовывал и кофе варил? это вам не PHP!

          > Delphi7
          альзо, слоупок детектед
          Ответить
          • Да хер с ним с преобразованием, не убивал бы контент хотя бы при любом неосторожном взгляде.

            >>слоупок детектед
            у меня еще есть D3! Очень православная вещь! алсо RAD2007 и RAD2009 паралелльно. Разные проекты видите ли поддерживать приходится

            Заглянул ради интереса в graphics от 2009. Нихуя не изменилось. Зато с блэкджеком и шлюхами
            Ответить
            • nil можно возвращать если чужой тип спрашивают, в принципе. но некрасиво как-то.
              а ворочать миллионы пикселов в при вызове геттера это вообще сказочная хуйня.

              портабельность кстати внушает, если приходится замшелую версию из 1997 года держать

              > и RAD2009
              точно, слоупок :-D
              Ответить
              • по-хорошему нахуй не нужны эти проперти BitMap, Icon, Metafile. Достаточно абстрактного Graphics. Это видимо из разряда тех багов, которые тянут в новые версии для совместимости.

                >>если приходится замшелую версию из 1997 года держать
                каприз босса. Он на D3 в молодости этот проект сбацал. Теперь изредка отвлекается от директорства чтобы покодить для разминки надмозга. Кстати проект продается до сих пор неплохо, как "стабильная, проверенная годами версия"

                >>точно, слоупок :-D
                Я кстати им не пользуюсь почти. тормознутый он какой-то. Основной рабочий проект на D7. Вызывает конечно регулярное желание "взять и уебать" но что делать? полмиллиона строк...
                Ответить
              • нил может в крайнем случае. Вообще быть такого не должно, че за хуйня!
                Если юзеру надо, пусть сам уничтожает, или к типу нужному кастует. Оставлять такую медвежью услугу можно только при хорошо бросающемся в глаза комментарии. Лучше прямо в названии свойств)
                А если типов больше будет? "Всё хуйня Серёжа давай заново"
                вообще можно с шаблоном очень красиво написать.
                Ответить
                • А оставлено, может, для совместимости обратной
                  Ответить
                • дельфисты хоть когда нибудь в мануал заглядывают?
                  If Bitmap is referenced when the picture contains a Metafile or Icon graphic, the graphic won't be converted. Instead, the original contents of the picture are discarded and Bitmap returns a new, blank bitmap.
                  Ответить
                  • все равно же пиздец
                    Ответить
                    • ожидать, что геттер преобразует формат - пиздец не меньший
                      Ответить
                      • а кто ожидает? нормальным поведением было бы nil вернуть. Ну или нахуй послать в крайнем случае.

                        Ваще проблема в самом устройстве TPicture. Я уже писал, нахуй не нужны эти проперти BitMap, Icon, Metafile. Это костыли для убогих
                        Ответить
                        • nil
                          а вообще хер знает зачем так сделали
                          может какой сакральный смысл (кусок его: см. TImage.Canvas)
                          Ответить
                • А вы часто заглядываете в VCL в поисках комментов? Вобщем-то не нужны они, Delphi тем и прекрасен, что комменты не особо нужны, по коду все читается.
                  Ответить
                • Wow, that's a really clever way of thninikg about it!
                  Ответить
    • Это сделал борланд? Даже не верится... Они... ...очень очень злые...
      Ответить
    • - Сидим, пьём, а Артур Атарбекович в Лондоне важные переговоры ведёт. Если у него всё получиться, то для нас будет очень хорошо.
      Ответить

    Добавить комментарий