印刷

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

印刷

#1 投稿記事 by M.S. »

脱兎 様のトピックを見て、自分なりに考えてみましたが、
プリンタが起動するところまではいいのですが、
文字が印刷されずに紙が排出されるだけになってしまいます。

コードを載せておきますので、どこがいけないのか教えて下さい。

全体的には、「ActiveBasicfan」の、「印刷ダイアログと印刷の仕組み」を引用しました。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

肝心の印刷を行うPrintData関数が呼ばれていないようです。
StartPageとEndDocの間にPrintData(hDC)を追加したらどうでしょうか。

> wsprintf(VarPtr(buf), Text, i)
ところでこれはwsprintf(buf, Text, i)でも平気ですよ。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

#3 投稿記事 by M.S. »

イグトランス様、返信ありがとうございます。
IDM_PRINT のコードをイグトランス様のご指摘どおりに上記のように書き直し、
PrintData を下記のように書き直しました。
しかし、デバッグ中に印刷すると、アクセス違反が起きてしまいます。
(PrintData の EndSub がドラッグされた状態になります。)

一応、デバッガのメッセージを載せておきます。

コード: 全て選択

スレッド(&HBC8)はコード &H0 で終了しました。
スレッド(&H2C8)はコード &H0 で終了しました。
スレッド(&HA80)でアクセス違反がありました(EPI=&H44202020)。
何処がいけないのでしょうか?

教えて下さい、お願いします。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

これで解消するか分かりませんが

#4 投稿記事 by yu0627 »

※携帯のフルブラウザから返信しています。

これで解消するか分かりませんが、一つ怪しいところを見つけたので投稿します。

コード: 全て選択

Text=ZeroString(GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1)))
GetWindowText(GetDlgItem(hMainWnd,EditBox1),Text,GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1))+1)
ここが問題だと思います。上ではテキストのバイト分しかメモリを確保していませんが、下ではテキストのサイズ+1バイト分しか確保していません。だから、以下の用に修正して下さい。

コード: 全て選択

Text=ZeroString(GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1))+1)
GetWindowText(GetDlgItem(hMainWnd,EditBox1),Text,GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1))+1)
これでもアクセス違反が起きるならまた返信して下さい。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re: これで解消するか分かりませんが

#5 投稿記事 by M.S. »

> ここが問題だと思います。上ではテキストのバイト分しかメモリを確保していませんが、下ではテキストのサイズ+1バイト分しか確保していません。だから、以下の用に修正して下さい。

コード: 全て選択

Text=ZeroString(GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1))+1)
> GetWindowText(GetDlgItem(hMainWnd,EditBox1),Text,GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1))+1)
これでもアクセス違反が起きるならまた返信して下さい。
コードを書き直しましたが、またアクセス違反が起きてしまいます。
スレッド(&HDF0)はコード &H0 で終了しました。
スレッド(&HDD8)はコード &H0 で終了しました。
スレッド(&HFD4)でアクセス違反がありました(EPI=&H200A0D65)。
何故でしょうか?
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

Re: これで解消するか分かりませんが

#6 投稿記事 by yu0627 »

コード: 全て選択

wsprintf(buf,Text,i)
コードを見るとwsprintfの使い方が間違っていると思います。僕は印刷をしたことがないのでよくは分かりませんが、この関数の第二パラメータは変数を代入するところじゃないと思います。元々この関数は第一パラメータで指定した変数に第二パラメータで指定した書式で第三パラメータ以降の変数の内容を代入するんです。

例:
変数A:バイト型
変数B:Long型 値5
wsprintf(A, "%dページ", B)
変数Aの内容:5ページ

ですので、関数の書式を間違えたからだと思います。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

#7 投稿記事 by M.S. »

あれから大分経って、
新しいTextEditorを作っていたときに考えたのですが、
下のコードをどなたか試していただけないでしょうか?
家のプリンタのインクが無くなって出来ないので、
どなたか宜しくお願いします。
雷電
記事: 104
登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:

#8 投稿記事 by 雷電 »

試してみましたが、エラーが出ますね・・・
MainWnd.sbp(724) - "DC" メンバは定義されていません
MainWnd.sbp(724) - "pd.DC" 無効な識別子です
MainWnd.sbp(151) - "DrawText" のパラメータ指定が間違っています
MainWnd.sbp(151) - "DT_CALCRECT" 無効な識別子です
MainWnd.sbp(151) - "rc" 型が違います
PrintDataの方はグローバルに書きましたが、無理ですね・・・
何か定義が抜けているようです・・・
===============================
MyHomePage;; raiden.no.land.to/
===============================
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

#9 投稿記事 by M.S. »

返信遅くなってしまってすいません。

この前の投稿は、PC の画面を見ながら写して、
携帯からものなので、どこかが抜けていたのだと思います。

では、改めて投稿したいと思います。
よろしくお願いします。
雷電
記事: 104
登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:

#10 投稿記事 by 雷電 »

印刷ボタンを押したときにデバッガーが止まったので、何で止まるんだろう・・・?と思いながらProjectEditorを見たら、アクセス違反で止まってました・・・。

コード: 全て選択

StartDoc(hDC,docinfo)
この部分で、デバッガーがアクセス違反だとしています。
コンパイル時のエラーはなくなりましたが、デバッグしたときにまだエラーが出ますね・・・
===============================
MyHomePage;; raiden.no.land.to/
===============================
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

今度は「猫でもわかるプログラミング」を参考にしました

#11 投稿記事 by M.S. »

これで印刷をやってみたら、
リリースコンパイルのほうは何の反応もなく、
デバッグ実行のときだけ印刷されましたが、
印刷される文字は改行もされず、
紙の右端まで行くと文の途中にも関わらず印刷が終わってしまいます。

自分ではこれが精一杯ですので、
どなたか力を貸してください。
お願いします。

AB: 4.24.00

参考ページ: 猫でもわかるプログラミング 第78章同 第79章
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

Re: 今度は「猫でもわかるプログラミング」を参考にしました

#12 投稿記事 by tak »

> 印刷される文字は改行もされず、
> 紙の右端まで行くと文の途中にも関わらず印刷が終わってしまいます。

印刷可能領域をはみ出しているのではないでしょうか。
TextOut() が使われていますが、同様の方法でプリンタではなくウィンドウにテキストを描画しても、はみ出した部分は表示されませんよね。
自分で改行付加の処理を追加しないと表示されないはずです。
これがまた面倒なのですが、WinAPI に便利なオプションとかないんですかね?


> リリースコンパイルのほうは何の反応もなく、
> デバッグ実行のときだけ印刷されましたが、

こっちの問題はわかりません。
これに限らず、リリース版とデバッグ版とで挙動が異なる場合があるようですが、自分はそういう現象に遭遇したことはないです。
あとで空いた時間にこのプログラムを実行して確かめてみようと思います。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 今度は「猫でもわかるプログラミング」を参考にしました

#13 投稿記事 by NoWest »

> > 印刷される文字は改行もされず、
> > 紙の右端まで行くと文の途中にも関わらず印刷が終わってしまいます。
>
> 印刷可能領域をはみ出しているのではないでしょうか。
> TextOut() が使われていますが、同様の方法でプリンタではなくウィンドウにテキストを描画しても、はみ出した部分は表示されませんよね。
> 自分で改行付加の処理を追加しないと表示されないはずです。
> これがまた面倒なのですが、WinAPI に便利なオプションとかないんですかね?
DrawText関数は改行にも対応してませんでしたっけ?
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re: 今度は「猫でもわかるプログラミング」を参考にしました

#14 投稿記事 by M.S. »

> DrawText関数は改行にも対応してませんでしたっけ?

コード: 全て選択

	StartDoc(hdc, docinfo)
	StartPage(hdc)
	TextOut(hdc, 20, 20, buffer, length)
の部分を、

コード: 全て選択

	StartDoc(hdc, docinfo)
	StartPage(hdc)

	Dim rc As RECT

	DrawText(hdc,buffer,length,rc,DT_CALCRECT)
	rc.left=20
	rc.top=20
	rc.right=rc.left+rc.right
	rc.bottom=rc.top+rc.bottom
	DrawText(hdc,buffer,length,rc,DT_LEFT)
に変更してみると、テキストの改行がうまくいきました。
NoWest さん、ありがとうございます。

しかし、はみ出した部分の改行ができません、
どうすれば良いのでしょうか?
返信する