Printer.PaintPicture LoadPicture(ファイル名)

このように画像を印刷しようとする時、ファイルがJPEG形式だと、スプーラに送られる容量が実際のファイルの6~7倍になってしまいます。
おそらくビットマップに展開してから、送っているのだと思います。
プリンタにビットマップ展開の機能があるので、JPEGのまま転送したいのです。
ネットワークプリンタであるため、転送時間が大変掛かってしまうのでなんとかしたいのです。
何か良い方法はないでしょうか。
市販のソフトやコンポーネント、ライブラリなどを使ってもいいです。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>プリンタにビットマップ展開の機能があるので、JPEGのまま転送したいのです。



その機能は初耳です。
ちなみに機種は何ですか?
もしかして、その機種独自の方式でJPEGで転送するのでは?
そうなら、印刷とは全く違う話です。
# メーカーのHPに情報はありませんか?

この回答への補足

回答ありがとうございました。
すみませんが、私も、人に聞いた程度なので確かなことはわかりません。
プリンタはリコーの製品で、プリンタの機種などは今はちょっと確認出来ないんです。
要点としましては、同じJPEGファイルをExcellやAccessなどで印刷する場合と転送時間が全然違うということです。
容量的に、VBからだとビットマップ展開をしてから転送し、Office製品はJPEGのまま転送しているのではないかと、推測したのですが。
そもそもJPEGのまま転送することは出来るのでしょうか?

補足日時:2002/02/22 12:14
    • good
    • 0
この回答へのお礼

遅くなりましたが、ポイント発行させてもらいます。
とりあえず、別の方法を考えてみます。
ありがとうございました。

お礼日時:2002/02/26 17:07

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QPicture box の サイズを変更

お世話になります。 VB6 でform1 上に Picture1 を貼付け
ボタンを押すとPicture Boxのサイズを変更したいのですが
上手くサイズが変更されません。何か根本的な間違いでしょうか
よろしくお願いします。
例:
Yoko = 600
Tate = 480

Private Sub Command1_Click()
With Picture1
.ScaleMode = 3 '
.Width = Yoko
.Height = Tate
End With
End Sub

Aベストアンサー

ピクチャボックスそのもののサイズを変更したいのであれば
ピクチャボックスのScaleModeではなく、ピクチャボックスのコンテナであるフォームのScaleModeを変更してからWidth/Heightpropertyを設定しましょう

Private Sub Command1_Click()
  Dim org
  org = Me.ScaleMode
  Me.ScaleMode = 3
  With PictureBox1
    .Width = Yoko.Text
    .Height = Tate.Text
  End With
  Me.ScaleMode = org
End Sub
といった具合です

Qコードでオブジェクトを最前面に

小4のKunpaです。
 前はレースゲームと言っていたのに今度はRPGと来て・・
いろんなジャンルに変えてスミマセン。
 ところで、オブジェクトを常に最前面に出すことは
出来ますが、コードに書くと、どうなるのでしょうか。
その前に、コードにかけるのですか。
教えて下さい。

Aベストアンサー

オブジェクトの ZOrderメソッドを使うとデザイン画面の
「最前面へ移動」「最背面へ移動」ができるようです。

(例) テキストボックス
Text1.ZOrder (0) '前方移動
Text1.ZOrder (1) '後方移動

QVB Printerオブジェクトに関して

ご回答が頂けないようですので再投稿です。
今回応答がない場合は違うサイトを探します。。


Printerオブジェクトを使用して伝票出力をします。
出力文字列の表示位置に関してご教授願います。

Printer.CurrentX = (縦位置)
Printer.CurrentY = (横位置)
Printer.Print (出力文字)
※単位はミリメートルです。
※伝票(縦:114、横:210)

Printer.CurrentXの指定方法が分かりません。
テストで指定して実装してみたのですが私の勝手な
推測ですが余白??の関係で私が意図した位置に表示
されません。CurrentXの指定は余白分を考慮して
設定しないといけないのでしょうか?

ご教授のほどよろしくお願いします。

Aベストアンサー

まず、社外向けなら、再配布可能な、他社のアドオンをお勧めします。
社内向けなら、努力してください。
VB6のプリンターコマンドはまったく出鱈目です。
また、プリンタードライバーは、マシンの差を吸収してくれません。LAN経由になるともっとひどいです。
と言いつつ、サイズから行くと宅急便の送り状のように見えますが、ひとつの方法として

FORM に CommonDialog1 貼り付け
印刷コマンドに
PRINTER_SET
Printer.ScaleMode = 0
Printer.height = 7350 '7300 '紙が 厚いので 理論値より大きい
Printer.width = 19500
Printer.Scale (0, 0)-(300, 127)

Printer.Print ’プリント開始

Dim tate_y As Integer
Dim yoko_x As Integer
tate_y = -5  誤差調整
yoko_x = 0
Printer.FontName = "P明朝"

If Data1.Recordset!郵便番号 = "" Or IsNull(Data1.Recordset!郵便番号) = True Then

Else
Printer.FontSize = 20
X = 0
Do While Len(Data1.Recordset!郵便番号) > X
If X > 2 Then
Printer.CurrentX = yoko_x + 44 + X * 10 '38-7
Else
Printer.CurrentX = yoko_x + 40 + X * 10 ' 35-7
End If
Printer.CurrentY = tate_y + 7
Printer.Print Mid(Data1.Recordset!郵便番号, X + 1, 1)
X = X + 1
Loop
End If
*
*
*
*
*
Printer.FontSize = 14
Printer.CurrentX = yoko_x + 40
Printer.CurrentY = tate_y + 160
Printer.Print 自社名

Printer.EndDoc  1枚終わり
///////
Public Sub PRINTER_SET()
For I = 0 To Printers.Count - 1
If Printers(I).DeviceName = RENPURIDRV Then
Set Printer = Printers(I)
Exit For
End If
Next I
End Sub

まず、社外向けなら、再配布可能な、他社のアドオンをお勧めします。
社内向けなら、努力してください。
VB6のプリンターコマンドはまったく出鱈目です。
また、プリンタードライバーは、マシンの差を吸収してくれません。LAN経由になるともっとひどいです。
と言いつつ、サイズから行くと宅急便の送り状のように見えますが、ひとつの方法として

FORM に CommonDialog1 貼り付け
印刷コマンドに
PRINTER_SET
Printer.ScaleMode = 0
Printer.height = 7350 '7300 '紙が 厚いので 理論値...続きを読む

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qピクチャーボックスの大きさに合わせて画像を表示

縦に長い画像をピクチャーボックスに表示したいのですが、
エクスプローラーの縮小表示と同じように
縦長の場合は左右に余白が出来て、画像の縦横比は
変更しないですべてを表示したいのですが、
どのようにしたら良いでしょうか。
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
を使うと全部入るのですが、左右に余白がないように
引き伸ばしてしまうので、何の画像なのか分かりにくくなってしまいます。
よろしくおねがいします。m(__)m

Aベストアンサー

今表示しようとしているImage のHeight と Width を調べて
高さが大きければPictureBox の幅を(縦横比に合わせて)変更し
幅が大きければPictureBox の高さを(縦横比に合わせて)変更する
そしてPictureBox 自体の位置をサイズの変更に合わせてセンタリングする位置に移動するようにすれば、StrechImage のままでいいと思う

QVB6でPNGファイルを扱うには?

VB6の標準コントロールであるPictureやImageでは、PNG(Portable Network Graphic)ファイルは表示できないと思いますが、これを表示する為の方法はないでしょうか?
よろしくお願いします。

Aベストアンサー

※明熊工房さん
http://www.akikuma.net/
より
TransG32.DLL
を利用する


※拡張コンポーネントを購入する
LeadTools
などなど

Qwinsock通信時エラーの回避

winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。

サーバー側(winsock部分)記述

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop

On Error Resume Next
Winsock1(Index).Listen
If Winsock1(Index).LocalPort <> 0 Then
Winsock1(Index).LocalPort = 0

End If

End Sub


質問の整理ですが、
表示板にはギミックが付いておりそのギミックは止まらないのでパソコンのフリーズでは無い様子です。
で問題は通信部分だと推測されるのですが、そのエラーを起こした通信を破棄してもいいので、サーバー側の点数加算を止めない方法はありませんでしょうか。
また上記のWinsock1_Errorコードの記述じゃおかしいのでしょうか。

winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。

サーバー側(winsock部分)記述

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

Winsock1(Index).Close '接...続きを読む

Aベストアンサー

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続してconnectすると発生しやすいようです。
ただ、このエラーが発生しても、特に異常が見られないので、このエラーを無視してはどうでしょうか?

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

If Index = 0 Then ' 受け付けるポートと接続するポートは処理が違う
If Number <> 10035 Then ' エラーコード10035は、無視
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
On Error Resume Next
Winsock1(Index).Listen
End If
Else
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
Unload Winsock1(Index)
closedSocks.Add Index
End If

End Sub

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続してconnectすると発生しやすいようです。
ただ、このエラーが発生しても、特に異常が見られないので、このエラーを無視してはどうでしょうか?

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

If Index = 0 Then ' 受け付けるポートと...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング