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

    +105

    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
    type
      THackImage = class(TGraphicControl)
      public
        property Canvas;
      end;
    
    procedure TColorPicker.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      {$IFDEF HACKS}
      Assert(Sender is TImage, 'в Sender всегда передается экземпляр класса TImage');
      FSelectedColor := THackImage(Sender).Canvas.Pixels[X, Y];
      {$ELSE}
      (* то, что было лень писать сразу *)

    Говнистая работа с библиотекой VCL. Не притрагивался к проекту около года, потом загрузил и почти час втыкал, за каким этот грёбаный хак здесь нужен.

    Запостил: bugmenot, 07 Сентября 2010

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

    • Нда, особенно угарнуло создание нового типа объекта с всего лишь одним свойством. ЗАЧЕМ??????????????
      Ответить
      • Враппер же.
        Ответить
        • из данного куска не видно, оправдано ли его использование )
          Ответить
      • одно свойство, однократно используется, между объявлением класса и методом тоже одна пустая строка. тенденция!
        спойлер нужен зачем так сделано?
        Ответить
    • очень хакерский говнокод )))
      Ответить
    • А чем
      FSelectedColor := TImage(Sender).Canvas.Pixels[X, Y];
      не понравилось?
      Ответить
      • Спойлер: у TImage неправильный Canvas
        При том что TImage может масштабировать и центрировать - пришлось прилично кнопки потоптать ради преобразования координат к нужным.
        Ответить
        • Чё-то я не подумал даже, что в ColorPicker должен подгружаться какой-нибудь Picture...
          Ответить
        • Хотя тут таки можно извернуться через родителя, например так:
          FSelectedColor := TForm(TControl(Sender).Parent).Canvas.Pixels[
            X + TControl(Sender).Left, Y + TControl(Sender).Top
          ];
          Попахивает, чувствую :)
          Ответить
          • угу, лишь бы до контекста где уже отрисованное добраться...
            иначе через такую жопу значение пиксела доставать...
            Ответить
    • Ну работать-то оно будет :) в смысле, безопасно. Причина в реализации классов, их полей, методов и проперти в Delphi.
      Странно, что в VCL не предусмотрен нормальный доступ к уже нарисованной картинке...
      вариант
      FSelectedColor := TForm(TControl(Sender).Parent).Canvas.Pi xels[
      X + TControl(Sender).Left, Y + TControl(Sender).Top
      ];
      хуже тем, что картинка должна лежать на форме, ее уже не положить на панельку, табу или еще куда-нибудь.

      А код действительно вводит в заблуждение %)
      Ответить
      • В конце концов, оно неочевидным путем сводится к visibility hack`у (или как оно правильно называется создание потомка для вытаскивания protected мемберов в текущую область видимости), т.е. затронуты только атрибуты мемберов. Должно работать.

        С родительской канвой я не пробовал, потому что у меня там скроллбокс и в итоге расчетов не меньше, чем при получении прямо из битмапа
        Ответить
        • А можно попробовать выключить масштабирование/центрирование, и рисовать картинку на Image с помощью StretchDraw(). Тогда координаты на Image будут работать, но потребуется временный Bitmap + обработка какого-нибудь OnResize.
          Ответить

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