フォームとそのフォーム上にあるMSFlexグリッドの
ハードコピーを、やはりそのフォーム上に設けたコマンド
ボタンのクリック一発で行えるようにしたいのです。

下記の構文で、PrintFormメソッドを使ってやってみましたが、
MSFlexグリッドの部分が真っ黒に印刷されてしまいます。

With Printer
.PaperSize = vbPRPSA4
.Orientation = vbPRORLandscape
End With

Form_Ichiran.PrintForm
 
どなたかご存知の方、よろしくお願いします。

A 回答 (2件)

どもども田吾作7です。



どうやらOCXのコントロール類はPrintFormの対象になってくれないようですね。
実験して初めて知りました。(-ロ-;グハッ
ですので、フォームのデバイスコンテキストを使用したら、うまくいったみたいなので、ご報告いたします。


With Me
'フォームのスケールモードをピクセルにします。
.ScaleMode = vbPixels
'Printerオブジェクトのスケールをピクセルにします。
Printer.ScaleMode = vbPixels


'Printerオブジェクトの出力を促します。
Printer.Print
'Printerオブジェクトへフォームを描画します。
Call StretchBlt(Printer.hdc, 0, 0, Printer.ScaleWidth, Printer.ScaleHeight, .hdc, 0, 0, .ScaleWidth, .ScaleHeight, vbSrcCopy)
'Printer オブジェクトに送っているドキュメントを終了し、印刷デバイスやスプーラに出力処理の制御を渡します。
Printer.EndDoc

End With


ってな感じでしょうか?
あらかじめフォームをピクセルにしておいたら一行省略できると思います。
StretchBltで、Printオブジェクトのサイズに、フォームを描画しているので、あらかじめPrinterオブジェクトのWidth/Heightを設定してあげると、間延びした印刷にはならないと思います。

でわでわ
    • good
    • 0

再度、田吾作7です。



返事が無いところを見ると、解決したのかな?
それともわからなくて困ってるのかな?
もしそうだとしたら、遠慮なく質問してくださいね。
    • good
    • 0
この回答へのお礼

お礼が大変に遅れてしまいました。
本当に助かりました。どうもありがとうございます。
客先に10日以上も詰めて、火を噴いたプロジェクトの
納品作業をやっており、まったく時間がありませんでした。

おかげさまで今日の夜には帰れそうです。
どうもありがとうございました。
また、なにかあった時にはよろしく御教授ください。

お礼日時:2001/07/25 16:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qグリッドを更新した時のグリッドの表示の仕方

WINDOWS2000、VB6.0(SP5)で開発しています。

データベースをグリッドに表示して、
追加や更新、削除などはテキストボックスに入力して、
コマンドボタンで処理すようにしています。

例えば行を追加したとき、並び替えをして表示させたいので、
Refreshします。そうするとカレントレコードの位置が最初の行になります。
これを追加した行に来るようにしたいです。
Move.Nextとかでその行まで移動させたら出来るのですが、
レコードが100件あって、50番目のレコードを追加したとき、
Move.Nextで移動させると、どんな場合でも画面上一番下の方に表示されてしまいます。
50番目のレコードが一番上に表示されるように、
スクロールバーを調節して追加しても、一番下になってしまいます。
うまく説明できないのですが、ご理解いただけましたら、
ご教授お願いいたしますm(_ _)m

Aベストアンサー

Move メソッドを使う
recordset.Move 移動数, 開始位置

Bookmark プロパティを使う
var = recordset.Bookmark
recordset.Refresh
recordset.Bookmark = var

詳しくはヘルプを参照してください。
テストできる環境がなかったので、ご希望の動作をするかちょっと確認できませんでした(^^;

Q[VB.NET]3つ以上のフォームを一つずつ表示し、最後のフォームを閉じた時に最初のフォーム以外のフォームを閉じる

VB.NETを学んでいるのですが、現在3つ以上のフォームを表示していくものを作ろうとして躓いたことがあったのでこちらに書き込みました。
内容としては、ボタンを押して次のフォームを表示していくものです。

動作の流れは以下のように考えています(フォームはA、B、Cの3つとする)
1.Aを表示
2.Aでボタンを押してBを表示し、Aは隠す
3.Bでボタンを押してCを表示し、Bは隠す
4.Cでボタンを押してBとCを閉じ、隠していたAを表示

隠すのはHideを用いてできたのですが、4.でCのボタンでBとCを一緒に閉じてAを表示させる方法がわかりませんでした。

1~4のように動作させるにはどうすればいいか教えてください

Aベストアンサー

まとめて考えるのではなく、分けて考えた方がコーディングもしやすくなります。

[ FormA の処理 ]
1. ボタンを押したら FormB を開き、自身を Hide する。
2. FormB が閉じられたら、自身を Show する。

[ FormB の処理 ]
3. ボタンを押したら FormC を開き、自身を Hide する。
4. FormC が閉じられたら、自身を Close する。

[ FormC の処理 ]
5. ボタンを押したら、自身を Close する。

ポイントは、親フォーム側で子フォームのFormCloseを捕らえるところです。FormBからFormAを、とか、FormCからFormAとFormBを・・・と考えるとややこしくなります。上記のように処理すれば、FormBはFormAの動作を気にする必要はありませんし、FormCもFormBやFormAの動作を気にする必要はありません。子フォームのFormCloseはWithEvents宣言すれば捕らえられます。

以下、簡単なコードを。ボタン配置が面倒だったので、フォームのクリックで動作します。


' [ FormA の処理 ]
Public Class FormA
Inherits Form

Public Sub New()
Me.Text = "FormA"
End Sub

Private WithEvents frmFormB As FormB

' 1. ボタンを押したら FormB を開き、自身を Hide する。
Private Sub FormA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
frmFormB = New FormB
frmFormB.Text = "FormB"
frmFormB.Show()

Me.Hide()
End Sub

' 2. FormB が閉じられたら、自身を Show する。
Private Sub frmFormB_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles frmFormB.FormClosed
frmFormB = Nothing
Me.Show()
End Sub

End Class

' [ FormB の処理 ]
Public Class FormB
Inherits Form

Private WithEvents frmFormC As FormC

' 3. ボタンを押したら FormC を開き、自身を Hide する。
Private Sub FormB_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
frmFormC = New FormC
frmFormC.Text = "FormC"
frmFormC.Show()

Me.Hide()
End Sub

' 4. FormC が閉じられたら、自身を Close する。
Private Sub frmFormC_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles frmFormC.FormClosed
frmFormC = Nothing
Me.Close()
End Sub

End Class

' [ FormC の処理 ]
Public Class FormC
Inherits Form

' 5. ボタンを押したら、自身を Close する。
Private Sub FormC_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
Me.Close()
End Sub

End Class

※VB2005で書いたコードなので.NETでそのまま動くかは不明・・・。

なお、あくまで考え方のひとつなので、他にも方法はあります。

まとめて考えるのではなく、分けて考えた方がコーディングもしやすくなります。

[ FormA の処理 ]
1. ボタンを押したら FormB を開き、自身を Hide する。
2. FormB が閉じられたら、自身を Show する。

[ FormB の処理 ]
3. ボタンを押したら FormC を開き、自身を Hide する。
4. FormC が閉じられたら、自身を Close する。

[ FormC の処理 ]
5. ボタンを押したら、自身を Close する。

ポイントは、親フォーム側で子フォームのFormCloseを捕らえるところです。FormBからFormAを、とか、FormC...続きを読む

Qアクセス フォームが存在するかを一発で取得したい

フォームが50個くらいあるのですが
該当のフォームが存在するかvbaで取得したいのですが
If CurrentProject.AllForms("フォーム1").IsLoaded Then
のように、一発で取得する方法はありますか?

今は
Sub Sample1()
Dim DB As DAO.Database
Dim f As DAO.Document
Set DB = CurrentDb
Dim strForm As String
Dim flg As Boolean

strForm = "Fメインメニュー"

For Each f In DB.Containers!Forms.Documents
If strForm = f.Name Then
flg = True
Exit For
End If
Next

If flg = False Then
MsgBox strForm & "は存在しません"
End If

End Sub
のような感じで、すべてのフォームをループしているのですが
無駄が多い気がします。
改善策があればお願いします。

フォームが50個くらいあるのですが
該当のフォームが存在するかvbaで取得したいのですが
If CurrentProject.AllForms("フォーム1").IsLoaded Then
のように、一発で取得する方法はありますか?

今は
Sub Sample1()
Dim DB As DAO.Database
Dim f As DAO.Document
Set DB = CurrentDb
Dim strForm As String
Dim flg As Boolean

strForm = "Fメインメニュー"

For Each f In DB.Containers!Forms.Documents
If strForm = f.Name Then
flg = True
Exit For
End If
Next

If flg = False Then
Ms...続きを読む

Aベストアンサー

おそらくそういった方法でループしてチェックするしかないと思います。
50個というと多いような気がしますが、コンピュータにとっては一瞬の処理ですからそれほど気にしなくてもよいかと思います。

おわかりのことかもしれませんが、その処理を関数化すれば
If CurrentProject.AllForms("フォーム1").IsLoaded Then
と同じように使えますよ。

以下の関数を作る

Public Function ExistsForm(ByVal formName As String) As Boolean
Dim f As Object

For Each f In CurrentProject.AllForms
If f.Name = formName Then
ExistsForm = True
Exit Function
End If
Next
End Function

これを
if ExistsForm("フォーム1") then
のように呼びだせば、フォームの存在をチェックできます。

おそらくそういった方法でループしてチェックするしかないと思います。
50個というと多いような気がしますが、コンピュータにとっては一瞬の処理ですからそれほど気にしなくてもよいかと思います。

おわかりのことかもしれませんが、その処理を関数化すれば
If CurrentProject.AllForms("フォーム1").IsLoaded Then
と同じように使えますよ。

以下の関数を作る

Public Function ExistsForm(ByVal formName As String) As Boolean
Dim f As Object

For Each f In CurrentProject.AllForms
If ...続きを読む

QVB2008 デバッグを実行すると作成したフォームとは違い、Form1が表示されます

VB2008をはじめたばかりの初心者です。
ファイル入出力のプログラムを書いて、フォームも作成(OpenFileDialogなどを使用)しました。

デバッグを実行すると、フォームでファイル入出力ができるようになる予定なのですが、
「Form1」という何もないフォームがでてきます。
(はじめに手を加えていない、Form1というものがなぜか表示されます。もちろんボタン等もありません)

実際に作成したフォームは、frmWav.vbというプログラムのため、フォームの名前もfrmWav.vb[デザイン]となっています。

デバッグ自体はエラーとはならないため、原因がわかりません。どうかご回答おねがいします!!

Aベストアンサー

1.ソリューションエクスプローラの「My Project」をクリック
2.アプリケーションタブをクリック
3.スタートアップフォームがForm1になっていませんか?
  これをfrmWavに変更してください。

また、不要なフォームは削除しておくといいですよ。
ソリューションエクスプローラでForm1を右クリック、削除を選択してください。

QForm2の変数をForm1にも

あるプロジェクト内で「Form2.vb」を作成して、そこで変数(例えば X=1)を作り
それを「Form1.vb」や、「Form3.vb」などで共有するにはどうすればいいでしょうか。

ご回答よろしくお願いします。

Aベストアンサー

Declarationsの部分でPublic指定します。
Form1
Public X As Long

Form2
MsgBox Form1.X '←このように使う


人気Q&Aランキング

おすすめ情報