Win32でInputBoxを実装するには?

このQ&Aのポイント
  • Win32でInputBoxを実装する方法を教えてください。
  • PerlでGUIのメッセージボックスは実現できましたが、InputBoxのような機能は見つかりませんでした。
  • 自分で組み合わせて作成する必要があるのでしょうか?
回答を見る
  • ベストアンサー

Win32でInputBoxを実装するには?

Win2000+ActivePerl 5.8.7 の環境です。 PerlでGUIということで、メッセージボックスであれば、次のようにして実現できました。 ------------ use Win32; my $msg = $ARGV[0]; my $icon = $ARGV[1]; my $caption = $ARGV[2]; my $result = Win32::MsgBox($msg, $ico, $caption); print "$result\n"; ------------ これと同様に、InputBoxのようなこと -------------------------------- ダイアログウィンドウを表示し、文字列の入力を促して、 Enterすると、スクリプト内の関数戻り値として、その文字列を 取得できるようなもの。 -------------------------------- が出来ないでしょうか。 ネット上色々と探し回ってみましたが、単純には見つかりませんでした。 ( Haven't yet implemented function inputbox...) 何か自分で組み合わせて作成する必要があるのでしょうか? (DOS窓経由であれば、単純に、$txt=<STDIN>; で取れるのですが) よろしくご教示ください。

  • goku3
  • お礼率78% (97/123)
  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • SE-1
  • ベストアンサー率57% (26/45)
回答No.1

こんなんどうでしょう。 ちょっと長いですが、複数の情報を取得したり拡張性はあります。 use Tk; my $top = MainWindow->new(); my $ent_txt = "Enter your name."; my $entry = $top->Entry(-textvariable=> \$ent_txt, -width=>'20' ); $entry->pack(-side=>'left'); my $btn1 = $top->Button(-text=>'OK',-command=> [\&get_name,\$ent_txt] ); $btn1->pack(-side=>'left'); my $btn2 = $top->Button(-text=>'C',-command=> sub{$ent_txt='';} ); $btn2->pack(-side=>'left'); MainLoop; sub get_name{ $top->destroy(); my $ref_input = shift; my $input = $$ref_input; print "Your name is $input."; }

goku3
質問者

お礼

そうです、こんな感じのやつを求めていました。 use Tk;・・・使えるのかなと思ったら、あっさり動きました。 ActivePerlもv5.xx辺りになると、ほとんど標準でPerl/Tk というのが付いてくるんですね。 今さら常識なのでしょうか、遅れていて恥ずかしい限りです。 ---- http://www.geocities.jp/m_hiroi/perl_tk/perltk_gui1.html からの引用で、 「Perl/Tk でプログラムを作成する場合、 Perl 5 で導入された機能「オブジェクト指向」と「リファレンス」の知識が必要になります・・・ ・・・これらの機能を理解していないと Perl/Tk を使いこなすことは難しいのですが・・・」 うわ、理解してないので、大変そうです。

goku3
質問者

補足

ご回答、大変ありがとうございました。 ちなみに、Perl/Tk というものを使わずに、 同様のことは出来るのでしょうか? (Perl/Tkが入っておらず、ネットにもつなげないような環境に 遭遇した時を想定してのことですが、無用な心配でしょうか・・・)

関連するQ&A

  • fgets関数を使用したときの文字あふれについて

    fgets関数を用いて文字列を入力し、その長さを測るプログラムを作っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main ( int, char *[] ); int main ( argc, argv ) int argc; char *argv[]; { char buf[( MAX )]; while ( 1 ){ memset ( buf, 0, sizeof( buf )); fgets ( buf, MAX, stdin ); if( fgets == NULL ){ break; } printf("入力した文字列の長さは%dです\n" ,strlen( buf )); } return 0; } このプログラムでは、256までしか文字列の長さを測ることができません。 もしこのプログラムで256を超える文字列を入力してしまうと、文字のあふれが発生し、 「入力した文字列の長さは256です」 「入力した文字列の長さは(あふれた文字列の長さ)です」 とこのようになってしまいます。 このプログラムで256以上の文字を読み捨てて、 「入力した文字列の長さは(あふれた文字列の長さ)です」 を表示しないようにできるのでしょうか? また読み捨てた文字列の長さを知ることはできるのでしょうか? もしかしたらfgets関数を使用すると不可能なのではないか?と思っています。 分かる方が居ましたらどうか教えて下さい。 よろしくお願いします。

  • IEのアドレスバー等の非表示について

    お世話になります。 1点教えていただきたい事があります。 JSPファイルにて、画面立ち上げ時からアドレスバー等を表示したくないのですが、下記のロジックのようなHTAを使用してもアドレスバー等が非表示になりません。 HTAはJSPでは使用できないのでしょうか? <環境> OS:Win2k、ブラウザ:IE6.0 <ロジック> <HTA:APPLICATION ID="DEMO"  APPLICATIONNAME="win_demo"  BORDER="none"  CAPTION="no"  ICON="/demo.ico"  SHOWINTASKBAR="no"  SINGLEINSTANCE="yes"  SYSMENU="no"  WINDOWSTATE="maximize">

  • [WinAPI]フォルダ上に表示されるアイコン

    プログラム内でアイコンを2つ使っているのですが 1つはWNDCLASSEX構造体のhIconメンバに渡して 2つめはDrawIconExで描画用に使っています。 しかし、1つめのアイコンはタスクバー上のアイコンとしては表示されるのですが (ウィンドウ自体はリージョンウィンドウで作成したのでタイトルバーはありません。また、タスクトレイと勘違いしてるわけでもないです。) 作成した.exeファイルには2つめのアイコンが表示されてしまいます。 リソースから2つめのアイコンを消すと1つめのアイコンが.exeのアイコンとして表示されるようですが、 2つめのアイコンを使わないわけにはいきません。 リソースファイルには ICON1 ICON "Icon1.ico" ICON2 ICON "Icon2.ico" とだけ指定してあります。 アイコンのロードにはLoadImageで第2引数にはTEXT("ICON1")のように文字列で指定しています。 ウィンドウクラス構造体に指定したアイコンがそのまま、.exeファイルのアイコンとして表示されるのだと認識しているのですが なぜ、描画用にしようしたアイコンが表示されてしまうのでしょう? 解決するための方法や参考になるサイトなどあればご教示ください。

  • strcompareでの「その他」の処理について

    お世話になります。 teratermマクロのstrcompareの使い方についての質問です。 Inputboxで入力した文字から一部の文字列をstrcopyで抜き出し、その抜き出した文字列に応じて処理を実行させたいのですが、 特定の文字以外の文字列を入力してしまった際の処理をどのように書けばいいのかが分かりません。 以下、現在作成中のコードです。 (NAMEは抜き出した文字列です) strcompare NAME 'aaa' if result=0 go to aaa strcompare NAME ' bbb' if result=0 go to bbb :aaa messagebox 'aaa' 'name' end :bbb messagebox 'bbb' 'name' end この場合例えば'xyz'という文字列を抜き取ってしまったときの制御が行えません。 if then elseで作り込めますでしょうか? よろしくお願いいたします。

  • ファビコンの設置についてミスを指摘してください

    ファビコンの設置についてはたくさんの対処法が書かれていますが、 昨日から試してみましたが、一向に改善できないので、 ちょっとしたミスかもしれないと思い質問させていただきます。 以下、設置の流れ。 1.16×16の画像を作成しました。 2. 作成した画像をファビコン用の形式に変換するソフトでfavicon.icoを自動作成。 3.サイトファイルのIndexが置いてある最上位にテキストモードでアップロードしました。 4.トップページindexのhtmlに<link rel="shortcut icon" href="favicon.ico" >を書き込みました。 どこが間違っているのか指摘していただければ幸いです。 「indexの内容」 <META name="description" content="○○○○"> <META name="Keywords" content="○○○○"> <TITLE>○○○○</TITLE> <link rel="shortcut icon" href="favicon.ico" > <LINK rel="stylesheet" type="text/css" href="hpb9tm08_7.css" id="hpb9tm08_7"> <STYLE type="text/css"> ちなみに、アップロードしたfavicon.ico「/home/○○○/www/favicon.ico」の詳細を見ると、 「読み込み文字コード・シフトJIS」で「臼NGIHDR 泚祿 PLTE`9 qN,キヲ浮・・・・・」という文字列が出ます。 ひょっとすると、favicon.icoの自動作成ツールの問題なのでしょうか?

  • ブラウザにリアルタイムに情報を表示したい

    サーブレット初心者です。入力フォームの画面から値を入力してクリックするとデータベースに値を書き込み、ある文字列を画面に表示するところまでは出来ました。以下のようなイメージです。 public class ServletTest extends HttpServlet { private String Msg; public void doGet(..) ... int result = 独自JDBC処理 if(result) { Msg=...} else { Msg=null; } ... 上記のやり方で、画面にアクセスした本人のブラウザ上では期待した情報を表示出来ます。 次にやりたいのは、他人がブラウザから情報を更新した場合に、全端末にその情報を、出来ればリアルタイムで表示したいです。色々な方法があるかも知れませんが、アドバイスを頂きたいです。具体的なコードで示して頂けると大変助かります。

    • ベストアンサー
    • Java
  • split

    $msg = "aa,bb,cc"; という文字列から真ん中だけを取り出したいとき、 正規表現で、$2という風に取り出すのと、splitを使って my($t1,$t2,$t3) = split(/\,/$msg); として$t2で取り出すのとでは、処理の速度やメモリ使用率においてどちらが効率がいいのでしょうか? また、この場合は、$t1と$t3に無駄な代入が起こってしまいますが、これを解消する手立てはありますでしょうか?

    • ベストアンサー
    • Perl
  • 文字列でなくて数値として処理をしたい。

    年度があって、2008 ボタンをクリックすると1を足して2009としたいのですが、文字列として扱われ20081となってしまいます。 数値として処理するにはどのように修正したらいいのでしょうか? ご存知の方教えてください。 <script type="text/javascript"> function test(parts){ var result = document.getElementById('result'); nendo = document.tForm.y.value; if(nendo == ""){ document.tForm.msg.value = "2008"; } else {document.tForm.msg.value = nendo + 1; } } </script> </HEAD> <BODY> </p> <form name="tForm"> <p> <INPUT TYPE="text" NAME="msg" SIZE=20 id="y"> <br> <input type="button" name="" value="足し算" onClick="test(this)">

  • 正規表現で「円(価格)」文字列をマッチさせるには?

    お世話になります。 テキストファイル(UTF-8エンコード)内の、 12,345円(価格) という文字列内より、 正規表現(ActivePerl)で、 円(価格) 文字列だけをマッチさせようとしています。 たとえば、 my $Str = "12,345円(価格)"; if($Str =~ /.*\d円(価格)/){ # マッチOK処理 } または、 if($Str =~ /円(価格)/){ # マッチOK処理 } など、いろいろ試しましたが、 マッチしない状況です。 そこでご質問ですが、 どのようにすれば、マッチ出来ますでしょうか。 以上になります。 宜しくお願いいたします。

  • ドライブ文字からハードウェア名を取得する方法

    タイトルの通り、ドライブ文字からハードウェア名(Win32_DiskDriveのCaptionで取得できるSAMSUNG HD103UJ ATA Deviceのような文字列)を取得する方法はないでしょうか? CD-ROMデバイスならWin32_CDRomDriveのDriveでドライブ文字が、Captionでハードウェア名が取得できるので対応付けができるのですが、ハードディスクやUSBメモリは対応付けができなくて困ってます。 QueryDosDeviceでドライブ文字から作成される文字列とsetupapiのSetupDiGetDeviceRegistryProperty(SPDRP_PHYSICAL_DEVICE_OBJECT_NAME)で取得される文字列を比較してデバイスを特定する方法も試してみたのですが、SetupDiGetDeviceRegistryPropertyではハードウェア名(フレンドリー名?)が取得できないようでした。 他にもGetVolumeNameForVolumeMountPointで取得したGUIDをレジストリで強引に検索して HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\CPC\Volume\{GUID}\Data内のデータからWMIでハードウェア特定に使えないかと考えたりしましたが、フォーマットも分からず万能ではなさそうでした。 どなたか、ドライブ文字からハードウェア名を取得する方法をご存じでしたら教えてください。 よろしくお願いします。

専門家に質問してみよう