2016-01-04 2 views
-4

В Delphi 10 Seattle мне нужно вставить изображение в ImageList. Изображение находится в потоке TGraphicControl (см. Исходный код ниже). Вставка, похоже, работает. Тем не менее, я получаю только белый прямоугольник в ImageList:Мой код с TGraphic.Draw (Canvas, Rect) не работает

function InsertCloudImageIntoImageList(AdvCloudImage1: TAdvCloudImage): Integer; 
// TAdvCloudImage = class(TGraphicControl) 
// WebPicture is TCloudPicture = class(TGraphic) 
var 
    TempBitmap: TBitmap; 
    R: TRect; 
begin 
    Result := 0; 
    TempBitmap := TBitmap.Create; 
    try 
    TempBitmap.SetSize(16, 16); 
    R.Width := 16; 
    R.Height := 16; 
    R.Top := 0; 
    R.Left := 0; 

    AdvCloudImage1.WebPicture.Draw(TempBitmap.Canvas, R); 
    Result := Form1.ImageList1.Add(TempBitmap, nil); 
    finally 
    TempBitmap.Free; 
    end; 
end; 

Я подозреваю, что ошибка в чертеже на растровом холсте?

+0

Я также интересно, что случилось с http://stackoverflow.com/questions/34139196/saveto-stringhelper и http://stackoverflow.com/questions/34559867/exception- с-german-umlaut-characters-in-tmeminifile-create и http://stackoverflow.com/questions/29077977/how-to-get-the-data-from-a-shelllink-even-when-the-link- target-does-not-exist-an и http://stackoverflow.com/questions/24288185/tbutton-deficiencies Я думаю, что эти вопросы, и, возможно, еще немного, могут быть полезны для завершения –

+2

Комментарии не шли в продуктивном направлении , и были мета-дискуссией о пригодности вопроса, а не самой теме. Они были удалены после того, как начали раздаваться оскорбления и начали накапливаться флаги. Если вы хотите обсудить это дальше, вы можете узнать об этом на [Meta.SO] (http://meta.stackoverflow.com). –

+0

@DavidHeffernan Итак, флаг, который, по вашему мнению, нужно удалить, и мы посмотрим. С флагом у нас есть запись, которую мы можем легко проверить, с комментариями мы этого не делаем. –

ответ

1

Правильный способ рисования здесь - вызвать Draw на холсте растрового изображения, передав исходный графический файл. Выбранный метод объявлен protected в TGraphic, что указывает на то, что вы не собираетесь называть его из потребительского кода.

Таким образом, вместо

AdvCloudImage1.WebPicture.Draw(TempBitmap.Canvas, R); 

Вы должны использовать

TempBitmap.Canvas.Draw(0, 0, AdvCloudImage1.WebPicture); 

Это значительно упрощает функцию, так как вам больше не нужна переменная TRect. Кроме того, нет смысла назначать Result более одного раза. Вся функция может быть:

function InsertCloudImageIntoImageList(AdvCloudImage1: TAdvCloudImage): Integer; 
var 
    TempBitmap: TBitmap; 
begin 
    TempBitmap := TBitmap.Create; 
    try 
    TempBitmap.SetSize(16, 16); 
    TempBitmap.Canvas.Draw(0, 0, AdvCloudImage1.WebPicture); 
    Result := Form1.ImageList1.Add(TempBitmap, nil); 
    finally 
    TempBitmap.Free; 
    end; 
end; 
+0

Очевидно, что метод 'Draw' стал общедоступным, чтобы разрешить рисование. Почему вы считаете это ошибкой? – user1580348

+0

Это не публично в 'TBitmap', и этот класс отлично работает. Это опровергает то, что вы заявляете как «очевидное». Он защищен, потому что потребители не хотят его называть. Он предназначен только для вызова из производных классов. Поэтому я считаю, что это публично, как ошибка. [Документация] (http://docwiki.embarcadero.com/Libraries/en/Vcl.Graphics.TGraphic.Draw) говорит: * Потомки TGraphic должны переопределять эту функцию с помощью конкретной реализации рендеринга. * –

+0

Вы посмотрели на источник 'WebPicture'? Если нет, то почему вы предполагаете, что у него нет конкретной реализации рендеринга? – user1580348

Смежные вопросы