• 締切済み

BCBでフォームの印刷

Borland C++ Builder 5(Pro)を使っています。 TForm上にTImageを乗せ、そこにPolyline等で図形を描いています。 それを印刷したいのですが、TImageにはPrintメソッドがないので、 TFormのPrintメソッドを呼び出していますが、印刷できません。 プリンタのジョブを監視していると、何も印刷せずに「印刷済」になっています。 印刷ボタン、印刷設定ボタンのOnClickは以下のようになっています。 間違い等ありましたらご指摘ください。 // 印刷ボタン void __fastcall TGraphForm::PrintButtonClick(TObject *Sender) {   if(PrintDialog->Execute()){     GraphForm->Print();   } } // 印刷設定ボタン void __fastcall TGraphForm::PrtSetupButtonClick(TObject *Sender) {   PrinterSetupDialog->Execute(); }

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

これが、スタンダードな方法かどうかは知らないのですが、 ずっと昔に作ったプログラムを見てみると 別のフォームとイメージに、元のDCを使ってBitBltしてからPrintしていました。 参考になれば

関連するQ&A

  • bmpやImageの配列を関数の引数で渡す

    C++BuilderXE2starterです。 ビットマップ(bmp)やTImage を配列で定義し、関数の引数として渡したいのですが よくわからないまま、次のようにすると、色んな不正な使い方らしきエラーとなります。 正しい使い方を教えてください。 なお配列でないbmpを渡すことはできます。ImageはIDEで定義するのではなく、プログラムから生成させる積もりです。 最終的にやりたいスタイル。 void __fastcall TForm1::onclick(TObject *Sender) { int n; Graphics::TBitmap *bmp[10]; TImage::Image *Imagenum[10]; for(n=0;n<10;n++){ bmp[n]=new Graphics::TBitmap(); Imagenum[n]=new TImage::TImage; // bmp,Imagenum のサイズ位置の設定 Imagenum[n]->Top= 値; Imagenum[n]->Left= 値; } sub(bmp,Imagenum); Free(bmp); // for でまわす要あり? Free(Image); } //--------------------------------------------------------------------------- void TForm1::sub2(Graphics::TBitmap *bmp[], TImage *Imagenum[]) { Image[0]->Canvas->Draw(0,0,bmp[0]); Image[1]->Canvas->Draw(0,0,bmp[1]); } unit.h class TForm1 : public TForm { __published: // IDE で管理されるコンポーネント TButton *Button1; void __fastcall onclick(TObject *Sender); private: // ユーザー宣言 void TForm1::sub(Graphics::TBitmap **bmp, TImage **Image); public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); };

  • VB.net 割り込みの禁止

    Borland C-Builder++の内容をVB.net 2010に書き換えて居る者です。 TextBox等の割り込みを一時的に禁止したいのですが、良い方法はありませんでしょうか。 無ければフラグを用いて、フラグが立っている時のみ処理をバイパスさせる事を考えて居ます。 Builder では ComboBox1->OnChange = NULL ; とコーディングする事により、 void __fastcall TForm1::ComboBox1Change(TObject *Sender) { Edit1->Text = ComboBox1->Text; } への割り込みを禁止出来、 ComboBox->OnChange = ComboBox1Change; とコーディングする事により割り込みを再開出来ました。 これを void __fastcall TForm1::ComboBoxChange(TObject *Sender) {     ComboBox1->OnChange = NULL ; Edit1->Text = ComboBox1->Text;     ComboBox->OnChange = ComboBox1Change; } とコーディングする事により、2重割り込みを防止していました。 VBでこの様にイベント割り込みを一時的に禁止にする方法はありますでしょうか。 宜しくご回答下さい。

  • AVIファイルを読み込む方法

    C++でプログラミング中の者です。 使っているコンポーネントはanimate、MediaPlayer、Edit、Botton、OpenDialogです。 OpenDialogで選択したファイル名をEditに表示させ、Mediaplayerを使ってAnimateに表示させるプログラミングをしたいと思っています。 なかなかうまくいかないので、アドバイスお願いいたします。 次のは現在のプログラムです。 #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //OpenDialog1->DefaultExt = "AVI"; //OpenDialog1->FileName = "*.avi"; if(OpenDialog1->Execute()==true){ // ファイル名が選択されたときに実行する処理  Edit1->Text=OpenDialog1->FileName; //Edit1に選択したファイル名を表示 //Animate1->Active=LoadFromFile(OpenDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit1Change(TObject *Sender) { MediaPlayer1->Open(); MediaPlayer1->Play(); } //---------------------------------- よろしくお願いします。

  • 動的に作ったリッチエディットのイベント

    toshi_ynと申します。 動的に作ったRichEditのサイズを調整できるようにOnResizeRequestイベントを 設定したつもりなのですが、コンパイルでエラーがでます。 いろいろなTipsを見ながら作ったので、どこが間違っているのか 分からず困っております。 こちらの環境はWIn98, Borland C++Builder Ver.4です。 どなたか、助けをお願いします。 [C++ エラー] Calender1.cpp(1092): E2034 Cannot convert 'void (_fastcall * (_closure )(TObject *,TRect &))(TObject *,TRect &)' to 'void (_fastcall * (_closure )(TObject *,const TRect &))(TObject *,const TRect &)'. //--コード-- Unit.h private: // ユーザー宣言 void __fastcall TForm1::Redit_ResizeRequest(TObject *Sender,TRect &Rect); Unit.cpp //----------- Redit[Num] =new TRichEdit(Owner); Redit[Num]->Parent = pnl[Num]; Redit[Num]->BorderStyle=bsNone; Redit[Num]->ScrollBars=ssNone; Redit[Num]->ReadOnly=true; Redit[Num]->Tag=Num; Tag=Num; Redit[Num]->Width=10; Redit[Num]->Height=10; Redit[Num]->PlainText=false; Redit[Num]->Cursor=crArrow; Redit[Num]->OnMouseDown=Redit_MouseDown; Redit[Num]->OnDragOver=Redit_DragOver; Redit[Num]->OnResizeRequest=Redit_ResizeRequest; ←ここでエラー //------------- void __fastcall TForm1::Redit_ResizeRequest(TObject *Sender,TRect &Rect) { Redit[Tag]->BoundsRect = Rect; } //------------

  • OpenDialogからテキストファイルの読み込み

    void __fastcall TForm1::N1Click(TObject *Sender) {     FILE *fp;      if(OpenDialog1->Execute()) { FNN1 = ExtractFilePath(OpenDialog1->FileName)         fp = fopen(FNN1.c_str(), "r" );              fread(txtdata,2,360,fp); } } [C++ エラー] Unit1.cpp(52): E2034 'AnsiString' 型は 'void *' 型に変換できない というエラーがでます。 解決方法を教えてください。

  • C++builderにおけるwhile()の使い方

    はじめまして、当方プログラムの初心者ですのでわかりづらい質問をしていますかもしれませんがよろしくお願いします. (質問)Borland C++ Builderを使っています。現在困っている点は単純に説明します.プログラムではウィンドウ上のボタンを押したというイベントが起きるとwhile()の無限ループに入るようになっています.このままだと実行したときにフリーズしてしまうのでwhile内にApplication->ProcessMessageを入れてあります. void __fastcall TMain_Form::Button1Click(TObject *Sender) {  while(1){ Application->ProcessMessage .............. } } このようなwhile突入ボタンがひとつのときはいいのですが、複数のボタンを作って、それぞれに対応するwhileを実行したいのですが、どうしてもひとつだけ動いて他が止まってしまいます. どなたか無限ループをマルチスレッドで複数、回らせる方法を教えてください. また、なんでもかんでもProcessMessageをいれてやればWINMAINに処理が移って、マルチスレッドになると思って使っているのですが間違いでしょうか? よろしくお願いします.

  • BorlandC++Builder5.0でリンカエラー

    現在A/D変換ボードの制御をしようとしています。 ボードのインストールも行なったのですが、以下のエラーが出て困っています。 外部シンボル 'AdOpen' が未解決(C:\PROGRAM FILES\BORLAND\CBUILDER5\PROJECTS\MAG\MAIN.OBJ が参照)と出てしまいます。 mainはシンプルなのですが... void __fastcall TForm1::OpenDevClick(TObject*Sender) { device_handle = AdOpen("FBIAD1"); if(device_handle == INVALID_HANDLE_VALUE){ ShowMessage("Err : デバイスのオープンに失敗"); return; } } そもそもこのエラーはなぜ出るのですか?

  • テキストボックスに数値を入力できない。

    TStatickTextというツールを StaticText1 StaticText2 StaticText3 3つ使用して、StaticText1 ,StaticText2に入れた数字の合計をStaticText3に代入するため void __fastcall TForm1::Button1Click(TObject *Sender) { int test_total=0; int x = StaticText1->Caption.ToInt(); int y = StaticText2->Caption.ToInt(); test_total = x + y; StaticText3->Caption = test_total; } このようにプログラムを作ってデバッグをしました。そのときに ”StaticText1->Caption”に数字を入力することができないのですが、入力するために必要な設定などありますでしょうか? 現在Code Gear C++ builder 2009でプログラムしています。 どうぞ教えて頂きますよう、よろしくお願いします。

  • イベントハンドラを削除したら、再度生成されない

    エンバカデロ Code Gear C++ Builder 2009という開発ソフトを使用しています。 TCheckBoxというチェックボタンのコンポ-ネットを追加して、フォーム画面でこのチェックボタンをクリックした場合の処理のCommaCheckBoxClickイベントハンドラが自動的にUnit1.cppというファイルに void //fastcall TTestForm::CommaCheckBoxClick(TObject *Sender) { } というので自動的に作成されるのですが、一度この文字を削除してしまい、再度チェックボタンのアイコンをダブルクリックで同じコードを生成使用としたのですが、 ”メソッド CommaCheckBoxClick の実現部が見つかりません。”というエラーメッセージボックスが表示されるようになってしまい、この文を再度自動的に生成できなくなってしまったのですが、 一度消してしまうと再度作成はできないのでしょうか?

  • C-Builderで数値(数字)以外を入力出来ない様にしたい。

    C-Builder V5 で数値(数字)を入力すべきところで、実行時に文字等を入力すると、システムからエラーメッセージが表示されるので、これを防ぐ為にEditで入力時に数字以外をはじきたいのですが、可能でしょうか。 以前C-Builder V4で作った時は出来た様な気がしたのですが、どの様にやったか思い出せないでいます。 ネットではC-Builderのサンプルが見つからず、Delphiのサンプルでは昔の記憶と同じ処理を行っていましたが、これだと文字判定以前にEditの枠に既に文字が入ってしまっており、文字の排除が出来ませんでした。 どなたか数字以外をはじく方法ご存知の方、お教え下さい。 // Edit1->ImeMode = imDisable; // 初期化部分で実行 void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key<48 || Key>57) { Key = 0; } }

専門家に質問してみよう