polylineをdirect2Dを使って,(少数の座標値を使って)描こうと,下記のようなコードを書きましたが,エラーが出ます。
hr := Ifact.CreatePathGeometry(crv);
のところでエラーが出るのですが,解決するにはどのようにすればよいのでしょうか。
この手の内容は,C++用にはたくさんあるのですが,Delphi用の解説はほとんどなくて困っています。
==============================================================
procedure CustomPolyline(points: array of TD2Dpoint2F);
var
iFact : Id2D1Factory;
crv : ID2D1pathgeometry;
isink : ID2D1GeometrySink;
hr : Hresult;
begin
if length(points) = 0 then exit;
hr := Ifact.CreatePathGeometry(crv);
if not secceeded(hr) then exit;
hr := crv.open(isink);
if not secceeded(hr) then exit;
isink.SetFillMode(D2D1_FILL_MODE_WINDING);
isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED);
isink.AddLines(@points[1],length(points)-1);
isink.EndFigure(D2D1_FIGURE_END_Closed);
isink.Close;
(以下省略)
==============================================================
polylineをdirect2Dを使って,(小数の座標値を使って)描こうと,下記のようなコードを書きましたが,エラーが出ます。
hr := Ifact.CreatePathGeometry(crv);
のところでエラーが出るのですが,解決するにはどのようにすればよいのでしょうか。
この手の内容は,C++用にはたくさんあるのですが,Delphi用の解説はほとんどなくて困っています。
==============================================================
procedure CustomPolyline(points: array of TD2Dpoint2F);
var
iFact : Id2D1Factory;
crv : ID2D1pathgeometry;
isink : ID2D1GeometrySink;
hr : Hresult;
begin
if length(points) = 0 then exit;
hr := Ifact.CreatePathGeometry(crv);
if not secceeded(hr) then exit;
hr := crv.open(isink);
if not secceeded(hr) then exit;
isink.SetFillMode(D2D1_FILL_MODE_WINDING);
isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED);
isink.AddLines(@points[1],length(points)-1);
isink.EndFigure(D2D1_FIGURE_END_Closed);
isink.Close;
(以下省略)
==============================================================
環境もエラーメッセージ/エラーコードも書かずに質問とな?
はともかく、なぜTDirect2DCanvasを使わないんです?
[ 194_線の端点形状の変更と Direct2D ] - Mr.XRAY
http://mrxray.on.coocan.jp/Delphi/plSamples/194_Direct2DBasic.htm
とか参考にしてはいかがですか?
不十分な質問内容で失礼しました。
環境は Windows10 + Delphi10.2pro です。
また,エラーメッセージは,
「モジュール'xxx.exe'のアドレス yyyyyyyy でアドレス 00000000 に対する読み取り違反がおきました。」
というものです。Breakpointを設置して調べてみたところ,
hr := Ifact.CreatePathGeometry(crv);
のことろで,エラーを生じているようです。
プログラムのコードは,この後,既存の bmp:Tbitmap に対して,direct2Dcanvas,DrawGeomwtry を用いて描画するつもりでした。
====================================================
procedure CustomPolyline(points: array of TD2Dpoint2F);
var
iFact : Id2D1Factory;
crv : ID2D1pathgeometry;
isink : ID2D1GeometrySink;
hr : Hresult;
Lcanvas : Tdirect2dCanvas;
begin
if length(points) = 0 then exit;
hr := Ifact.CreatePathGeometry(crv);
if not succeeded(hr) then exit;
hr := crv.open(isink);
if not succeeded(hr) then exit;
isink.SetFillMode(D2D1_FILL_MODE_WINDING);
isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED);
isink.AddLines(@points[1],length(points)-1);
isink.EndFigure(D2D1_FIGURE_END_Closed);
isink.Close;
LCanvas := TDirect2DCanvas.Create(bmp.Canvas, bmp.canvas.clipRect);
with LCanvas do
begin
BeginDraw;
drawgeometry(crv);
ENdDraw;
end;
LCanvas.Free;
end;
====================================================
Direct2dCanvs.Polyline では整数値の座標しか扱えないので,小数の座標を扱うために,geometry を作って DrawGeometry で描画を
試みた次第です。
エラーが出るのは、宣言しただけのiFactをいきなり使ってるからでしょう
MSDNとか見るとD2D1CreateFactoryを使用してID2D1Factoryを構築するみたいですけど詳しい事は判りません。
自作した
procedure CustomPolyline(points: array of TD2Dpoint2F);
というルーチンが期待通りに動作しないということですよね ?
僭越ではありますが,そういう時のすごい技をお教え致します.
それは「新規にプロジェクトを作成」して,その関数だけをテストするプログラムを書いてテストします.
この方法は,私が長年 Delphi を使っていて苦労の末に編み出した「技」です.
今回,特別に公開するものです.
例えば以下のようにします.
こうすると,以下のコードをコピペして,他の方もテスト可能になるというスゴイ「技」なのです.
implementation
{$R *.dfm}
uses
Direct2D, D2D1;
procedure CustomPolyline(points: array of TD2Dpoint2F);
var
iFact : Id2D1Factory;
crv : ID2D1pathgeometry;
isink : ID2D1GeometrySink;
hr : Hresult;
Lcanvas : Tdirect2dCanvas;
begin
iFact := D2DFactory();
if length(points) = 0 then exit;
hr := Ifact.CreatePathGeometry(crv);
if not succeeded(hr) then exit;
hr := crv.open(isink);
if not succeeded(hr) then exit;
isink.SetFillMode(D2D1_FILL_MODE_WINDING);
isink.BeginFigure(points[0],D2D1_FIGURE_BEGIN_FILLED);
isink.AddLines(@points[1],length(points)-1);
isink.EndFigure(D2D1_FIGURE_END_Closed);
isink.Close;
LCanvas := TDirect2DCanvas.Create(Form1.Canvas, Form1.canvas.clipRect);
// LCanvas := TDirect2DCanvas.Create(bmp.Canvas, bmp.canvas.clipRect);
with LCanvas do
begin
BeginDraw;
drawgeometry(crv);
ENdDraw;
end;
LCanvas.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
LPoints : array of TD2Dpoint2F;
begin
SetLength(LPoints, 3);
LPoints[0].x := 30.0;
LPoints[0].y := 30.0;
LPoints[1].x := 150;
LPoints[1].y := 80.0;
LPoints[2].x := 80.0;
LPoints[2].y := 130.0;
CustomPolyline(LPoints);
end;
iFact := D2DFactory();
が欠けていたということですね。
interface() の勉強不足でした。
ありがとうございました。
ツイート | ![]() |