Ещё с Делфи осталось ощущение, что все свойства канвы доступны лишь очень продвинутым кодерам, коим я не являюсь даже близко ))
По примерам из разных форумов и блогов создал в модальном окне следующую процедуру размещения изображений из файлов на форме:
- Код: Выделить всё
procedure TFormSetLoc.DrawPictLoc(LocRow: Integer);
var
S: string;
PictRect, TempRect: TRect;
begin
S:= CurrDir+'/images/'+StringGridLoc.Cells[1, LocRow]+'.bmp';
TempRect:= Rect(0, 0, 48, 32);
if DirectLoc then
PictRect:= Rect(48, 32 * (LocRow - 1), 0, 32 * LocRow)
else
PictRect:= Rect(0, 32 * (LocRow - 1), 48, 32 * LocRow);
Try
if FileExists(S) then
ImgTmp.Picture.LoadFromFile(S)
else
ImgTmp.Picture.PNG.Canvas.CopyRect(TempRect, ImageLoc0.Picture.Bitmap.Canvas, TempRect);
ImgLoc.Picture.PNG.Canvas.CopyRect(PictRect, ImgTmp.Picture.Bitmap.Canvas, TempRect);
ImgLoc.Repaint;
except
ShowMessage(MessagePictLocNotFound+#$D#$A+S);
end;
end;
Позже слегка модифицировал и повторил в главном окне, изображения во временный имидж читались, но далее ничего не происходило (сверху кусочек главного окна, где ожидались картинки, остальное модальное):

Фрагмент кода (естественно пробовал копировать и напрямую в любой имидж на главной форме, без поиска):
- Код: Выделить всё
ImgTmp.Picture.PNG.Canvas.CopyRect(TempRect, ImageLoc0.Picture.Bitmap.Canvas, TempRect);
(Findcomponent('ImageLoc'+IntToStr(PictNum+8)) as TImage)
.Picture.PNG.Canvas.CopyRect(PictRect, ImgTmp.Picture.Bitmap.Canvas, TempRect);
После плясок с бубном получил такой рабочий код:
- Код: Выделить всё
procedure TFormMain.DrawPictLocs(PictNum, LocRow: Integer);
var
S: string;
PictRect, TempRect: TRect;
begin
S:= CurrDir+'/images/'+FormSetLoc.StringGridLoc.Cells[1, LocRow]+'.bmp';
TempRect:= Rect(0, 0, 48, 32);
if DirectLoc then
PictRect:= Rect(48, 0, 0, 32)
else
PictRect:= Rect(0, 0, 48, 32);
Try
if FileExists(S) then
ImgTmp.Picture.LoadFromFile(S)
else
ImgTmp.Canvas.CopyRect(TempRect, ImageLoc0.Canvas, TempRect);
(Findcomponent('ImageLoc'+IntToStr(PictNum+8)) as TImage)
.Canvas.CopyRect(PictRect, ImgTmp.Canvas, TempRect);
(Findcomponent('ImageLoc'+IntToStr(PictNum+8)) as TImage).Repaint;
except
ShowMessage(MessagePictLocNotFound+#$D#$A+S);
end;
end;
И результат:

Попробовал в модальной форме упростить ImgTmp.Picture.PNG.Canvas.CopyRect до ImgTmp.Canvas.CopyRect и получил закрашенный чёрным имидж:

То есть более длинный путь к холсту работает в модальном окне, но не работает в главном, а более короткий - наоборот. Или тут какая-то другая причина, о которой даже не подозреваю?
Как бы выход (на костылях) найден, но если кто сможет, раскройте пожалуйста глубинную сущность данного метода (можно ссылкой на почитать про нюансы).