tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB6.0 SCALE MODE 4 の印刷について
記事No11629
投稿日: 2016/03/02(Wed) 10:45
投稿者SUZUKI
VB6.0からVB2005に変換挑戦中のSUZUKIです
VB2005の印刷機能を使って変換しようとしているのですが
なかなかうまく行きません どうしたらよいかまたよろしくお願いします

下記は線を書こうとしています
VB6.0
     KURO = RGB(0, 0, 0)
     Printer.ScaleMode = 4
     Printer.Line (10, 9)-(10, 57), KURO

VB2005 の印刷は花ちゃん下記を参考にしています

hanatyan.sakura.ne.jp/vb2005/vb2013print08.htm

VB2005
     Using blackPen As New Pen(Color.Black, 0.2)  
        Dim br As Brush = Brushes.Black
        'ミリメートルを長さの単位に指定します。
        g.PageUnit = GraphicsUnit.Millimeter
       g.DrawLine(blackPen,  g.PageUnit = GraphicsUnit.Millimeter
   g.DrawLine(blackPen, 10*120/1440*25.4,2*9*120/1440*25.4,10*120/1440*25.4, 2*57/1440*25.4)


エラー    1
縮小変換しないで呼び出される、アクセス可能な 'DrawLine' がないため、
オーバーロードの解決に失敗しました:

'Public Sub DrawLine(pen As System.Drawing.Pen,
x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)':
パラメータ 'x1' と一致する引数は 'Double' から 'Integer' へ縮小変換します。

'Public Sub DrawLine(pen As System.Drawing.Pen,
x1 As Single, y1 As Single, x2 As Single, y2 As Single)':
パラメータ 'x1' と一致する引数は 'Double' から 'Single' へ縮小変換します。


疑問点ですが

1.  Printer.ScaleMode = 4に相当するのはVB2005では無くなったのでしょうか?
2. g.PageUnit = GraphicsUnit.Millimeter
   で定義すると小数点は許されないのでしょうか

  10*120/1440*25.4 は自分で算出した位置変換式です
   整数なら問題ないので微調整出来ないという事でしょうか?

時代遅れの質問で申し訳ありません

[ツリー表示へ]
タイトルRe: VB6.0 SCALE MODE 4 の印刷について
記事No11630
投稿日: 2016/03/02(Wed) 12:20
投稿者shu

>
> 疑問点ですが
>
> 1.  Printer.ScaleMode = 4に相当するのはVB2005では無くなったのでしょうか?
なくなりました。
hhttps://msdn.microsoft.com/ja-jp/library/system.drawing.graphicsunit(v=vs.110).aspx


> 2. g.PageUnit = GraphicsUnit.Millimeter
>    で定義すると小数点は許されないのでしょうか
>
>    10*120/1440*25.4 は自分で算出した位置変換式です
>    整数なら問題ないので微調整出来ないという事でしょうか?
>
> 時代遅れの質問で申し訳ありません
10*120/1440*25.4 の結果はDoubleになりますが
DrawLineの引数はIntegerかSingleなので
DoubleからSingleに変換出来ませんというものです。
各数値の後ろに!を付加するとよいかと思います。

[ツリー表示へ]
タイトルRe: VB6.0 SCALE MODE 4 の印刷について
記事No11631
投稿日: 2016/03/02(Wed) 13:06
投稿者魔界の仮面弁士
> g.DrawLine(blackPen,  g.PageUnit = GraphicsUnit.Millimeter

閉じ括弧が無いですよ。

それに、「g.PageUnit = GraphicsUnit.Millimeter」は『比較式』なので、
これは Boolean 値を意味しますよね。

DrawLine メソッドには、Boolean 型の引数を持ったオーバーロードがありません。


> g.DrawLine(blackPen, 10*120/1440*25.4,2*9*120/1440*25.4,10*120/1440*25.4, 2*57/1440*25.4)
この呼び出しの場合、各パラメータは
 第1引数: Pen
 第2引数: Double
 第3引数: Double
 第4引数: Double
 第5引数: Double
と解釈されます。
https://msdn.microsoft.com/ja-jp/library/system.drawing.graphics.drawline.aspx

DrawLine のオーバーロードで、5 つの引数を持つオーバーロードは
 DrawLine(Pen, Integer, Integer, Integer, Integer)
 DrawLine(Pen, Single, Single, Single, Single)
の 2 種類があります。

どちらのオーバーロードが使われるにせよ、Double → Integer あるいは Double → Single への
「縮小変換」が必要になります。そのため、コンパイルに失敗しています。
座標指定は、Integer 型または Single 型でなければならないのです。(もしくは Point/PointF 型)


今回のケースでは、「25.4」の代わりに「25.4F」または「25.4!」と記述してください。

小数リテラルは、基本的に Double 型を意味しますが、
末尾に F あるいは ! を付けた場合、Single 型の表記になります。



> 2. g.PageUnit = GraphicsUnit.Millimeter
>    で定義すると小数点は許されないのでしょうか
可能です。
ただし先述したように、「Single 型」の精度で指定する必要があります。


> 1.  Printer.ScaleMode = 4に相当するのは
VB6 であっても、普通は「4」というマジックナンバーではなく、
「vbCharacters」という定数を使うべきところですね。


> VB2005では無くなったのでしょうか?
一応、互換クラスでは残っています。このクラスは VB2010 以降に搭載されています。
https://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.powerpacks.printing.compatibility.vb6.printer.scalemode.aspx

この互換クラスを VB2005/2008 で使う場合は、追加インストールが必要です。
https://msdn.microsoft.com/ja-jp/vstudio/bb219077.aspx
http://www.atmarkit.co.jp/fdotnet/vblab/vbwizard_04/vbwizard_04_03.html


また、互換ライブラリの Printer クラスに頼らず、Graphics クラスで対処するなら、
ScaleTransform メソッドを使うことで、スケーリングを変更することができます。

VB6 でスケーリングを指定する場合、
 .ScaleMode = [ScaleModeConstants定数]
の方法よりも柔軟な座標指定の手段として
 .Scale (x1, y1)-(x2, y2)
のステートメントが使えましたが、それに相当するのがこの ScaleTransform メソッドです。
http://dobon.net/vb/dotnet/graphics/pageunit.html

[ツリー表示へ]
タイトルRe^2: VB6.0 SCALE MODE 4 の印刷について
記事No11632
投稿日: 2016/03/02(Wed) 13:29
投稿者SUZUKI
shu 魔界の仮面弁士さん アドバイスありがとうございます
視界が開けたように感じます
難しい箇所もありますのでじっくり読ませていただきます

下記は花ちゃんサイトにある例題ですが
下記のコード読めませんでした

'--------------- 下記の機能は、Framework 2.0 からの機能です。---------------------
    '印刷余白(印刷開始位置)を取得(.NET Framework version 2.0 からの機能です)
    Dim lm As Integer = CInt(0.254! * PrintDocument1.DefaultPageSettings.HardMarginX)
    Dim tm As Integer = CInt(0.254! * PrintDocument1.DefaultPageSettings.HardMarginY)
'----------------------------------------------------------------------------------
!の意味、縮小変換のエラー知りましたので
もう一度お勉強します

[ツリー表示へ]
タイトルRe^3: VB6.0 SCALE MODE 4 の印刷について(解決)
記事No11633
投稿日: 2016/03/03(Thu) 16:57
投稿者SUZUKI
>閉じ括弧が無いですよ。

一部コピー間違いがあり、ご迷惑をおかけしました
当初、 Printer.ScaleMode = vbCharacters を
ミリ変換しなければいけないと思い
挫折しての質問でした
shuさんの指摘から、他の選択肢を選んで試した所
(GraphicsUnit.Point)
同じように印刷する事が出きました

   g.DrawLine(blackPen, 10 * 6, 9 * 12, 10 * 6, 57 * 12)

こんな感じに6倍と12倍すればほぼ一致する事がわかりました
微調整無しはほんと感激です
文字印刷、ページチェンジと道のりは長いのですが
大変助かりました
ありがとうございました

[ツリー表示へ]