2016-01-04 2 views
-4

Dans Delphi 10 Seattle, j'ai besoin d'insérer une image dans une ImageList. L'image est dans un descendant de TGraphicControl (voir le code source ci-dessous). L'insertion semble fonctionner. Cependant, je ne reçois que un rectangle blanc dans le ImageList:Mon code avec TGraphic.Draw (Canvas, Rect) ne fonctionne pas

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; 

Je soupçonne que le bogue est dans le dessin sur la toile bitmap?

+0

Je me demande aussi ce qui est arrivé avec http://stackoverflow.com/questions/34139196/saveto-stringhelper et http://stackoverflow.com/questions/34559867/exception- avec-allemand-umlaut-caractères-dans-tmeminifile-créer et http://stackoverflow.com/questions/29077977/how-to-get-the-data-from-a-shelllink-even-when-the-link- target-does-not-exists-an et http://stackoverflow.com/questions/24288185/tbutton-deficiencies Je pense que ces questions, et probablement plus, pourraient utilement être complétées –

+2

Les commentaires n'allaient pas dans une direction productive , et étaient une méta-discussion sur la pertinence de la question, pas le sujet lui-même. Ils ont été retirés une fois que les insultes ont été lancées et que les drapeaux ont commencé à s'accumuler. Si vous souhaitez en discuter davantage, vous pouvez poser des questions à ce sujet sur [Meta.SO] (http://meta.stackoverflow.com). –

+0

@DavidHeffernan Alors signalez ce que vous pensez devoir être retiré et nous allons jeter un coup d'œil. Avec un drapeau nous avons un record, nous pouvons vérifier facilement, avec des commentaires que nous n'avons pas. –

Répondre

1

La manière correcte de dessiner ici est d'appeler Draw sur le canevas du bitmap de destination, en passant le graphique source. La méthode que vous appelez est déclarée protected dans TGraphic, ce qui indique que vous n'êtes pas censé l'appeler à partir du code consommateur.

Ainsi, au lieu de

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

Vous devez utiliser

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

Cela simplifie grandement la fonction puisque vous ne avez plus besoin de la variable TRect. En outre, il ne sert à rien d'attribuer Result plus d'une fois. La fonction entière peut être:

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

Évidemment, la méthode 'Draw' a été rendue publique pour permettre le dessin. Pourquoi considéreriez-vous cela comme un bug? – user1580348

+0

Ce n'est pas public dans 'TBitmap', et cette classe fonctionne bien. Cela réfute ce que vous dites être "évident". C'est protégé parce que les consommateurs ne sont pas censés l'appeler. Il est destiné uniquement à être appelé à partir de classes dérivées. Donc, je considère que c'est public comme un bug. Le [documentation] (http://docwiki.embarcadero.com/Libraries/fr/Vcl.Graphics.TGraphic.Draw) dit, * Descendants de TGraphic devrait remplacer cette fonction avec une implémentation de rendu spécifique. * –

+0

Avez-vous regardé le source de 'WebPicture'? Si non, pourquoi supposez-vous qu'il n'a pas une implémentation de rendu spécifique? – user1580348