Błąd może polegać na tym, że w momencie wywoływania procedury Create dla formularza obiekt Canvas jeszcze nie jest dostępny (zostanie utworzony później). Teoretycznie więc powinno pomóc wywołanie w którejś z procedur: FormShow, FormActivate albo FormResize. Powinno, ale niestety również nie działa.
U mnie działa tylko, gdy wywołam te procedury bezpośrednio przed rysowaniem po Canvas-ie
procedure TForm1.Button1Click(Sender: TObject);
begin
SetMapMode(Canvas.Handle, MM_LOMETRIC);
SetViewPortOrgEx(Canvas.Handle, ClientWidth div 2, ClientHeight div 2, nil);
Canvas.LineTo(100, 100);
end;
Jest to jakieś rozwiązanie, choć nie do końca zadowalające (dodatkowo linia jest trochę krótsza)