.netでのtextbox

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
S

.netでのtextbox

#1

投稿記事 by S » 16年前

VC.netで画面にtextboxを作りました。
ただ問題点が3つほどあります。

①Ctrl+Aですべてを選択ができる。
②Ctrl+Zでメモ帳のように一回だけUNDOするのではなく
  wordなどのように何回UNDOできるようにしたい。
③又、Escキーでアプリを終了させたい。(やはりWM_ESCみたいなのを書くのでしょうか?)

YuO

Re:.netでのtextbox

#2

投稿記事 by YuO » 16年前

(1) は質問ではないようなので飛ばします。

(2) は,自分で処理するしかないです。

Windows Forms の TextBox もメモ帳の入力欄も,どちらも元を正せば Win32 の EDIT コントロールです。
で,EDIT コントロール自体には一度分の UNDO 機能しかありません。
# WPF なら複数回の UNDO ができるのですが。

(3) キーが押された場合に閉じる処理は自分で書く必要があります。

Form の KeyPreview プロパティを true に設定し,
OnKeyDown 関数をオーバーライドするか,Form の KeyDown イベントで,
e->KeyData が Keys::Escape だった場合は Form の Close 関数を呼び出すようにします。

s

Re:.netでのtextbox

#3

投稿記事 by s » 16年前

ご回答ありがとう御座います。
すみません・・・1も質問です。
Ctrl+Aですべてを選択できるようにしたい。
が正しいです。
以上、ご確認よろしくお願いします。

YuO

Re:.netでのtextbox

#4

投稿記事 by YuO » 16年前

修正) KeyData => KeyCode

機能がないなら自分で書けばいいわけで……。

対象の TextBox の KeyDown イベントで,
・e->KeyCode が Keys::A
・e->Control が true
を満たしたら,SelectAll メソッドを呼び出せばよいです。

詳細は,以下のあたり。

MSDN: Control.KeyDown イベント (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... ydown.aspx
MSDN: KeyEventHandler デリゲート (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... ndler.aspx
MSDN: KeyEventArgs クラス (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... targs.aspx
MSDN: KeyEventArgs.KeyCode プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... ycode.aspx
MSDN: Keys 列挙体 (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... .keys.aspx
MSDN: KeyEventArgs.Control プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... ntrol.aspx
MSDN: KeyEventArgs.Handled プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... ndled.aspx
MSDN: TextBoxBase.SelectAll メソッド (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... ctall.aspx

S西

Re:.netでのtextbox

#5

投稿記事 by S西 » 16年前

YuOさん
回答ありがとうございます。
e->KeyCode
このインスタンス?がないようです・・・。
KeyStateというものがあり似たようなものをWindowsAPIでつかった記憶があります。
またtextboxについてなのですが特殊な作り方をしていて
3つのことをおやりたい場合私の場合どうやって書けばよろしいのでしょうか?
ソースを載せさせていただきます。

バグ

Re:.netでのtextbox

#6

投稿記事 by バグ » 16年前

Yuoさんがほとんど答えを書かれていますが…(^_^;)

一番手っ取り早いのはテキストボックスを継承して、機能追加すればよいでしょう。

S西

Re:.netでのtextbox

#7

投稿記事 by S西 » 16年前

すいません・・・
私の勘違いでできなかったようです・・・。
エラーで動かなかったのですがリビルドしたらできました・・・。

2について挑戦してみます。

S西

Re:.netでのtextbox

#8

投稿記事 by S西 » 16年前

2番についてはなんとかできそうです。

現在考えているのは
例)30回戻れるようにする場合

String型で配列を30定義します。
int型でCntを定義します

テキストボックスに変更がある度にCntを+1し
Str[Cnt] = ~->text;
if(Cnt > 30){

}

Ctrl+Zなら
Cntを-1
~->text = Str[Cnt];

if(Cnt > 30){

}

みたいに書こうかと考えております。
みづらくてすみません。
時間がないので明日、試しますが
これでは無理そうでしょうか?

またメモ帳のようにテキストボックスにスクロールバーを付けたいです。
どうにかしてできないでしょうか?

S西

Re:.netでのtextbox

#9

投稿記事 by S西 » 16年前

申し訳ないのですが追加で質問です
C++みたいにグローバル変数を宣言したいのですが
どこに書けばグローバル扱いになるのでしょうか?

int UndoCnt = 0;
array<String^>^ UndoString = gcnew array<String^>(UNDO_MAX);

上記の物をグローバル変数として使いたいです。
質問ばかりですみません。

バグ

Re:.netでのtextbox

#10

投稿記事 by バグ » 16年前

変数名からなんとなくやりたい事は推測できますが、グローバルにする必要は無いのでは?(^_^;)
おそらく、フォーム内でしか使わないでしょうから、フォームクラスのメンバとして追加してやればいいと思いますよ。
どうしても外部からのアクセスが必要であれば、publicにするか、アクセッサ(ゲッターもしくはセッター)からアクセスできるようにしてやればよいでしょう。

YuO

Re:.netでのtextbox

#11

投稿記事 by YuO » 16年前

> またメモ帳のようにテキストボックスにスクロールバーを付けたいです。
> どうにかしてできないでしょうか?

MSDN 見ればちゃんと載っていますが……。
MSDN: TextBox.ScrollBars プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library ... lbars.aspx

S西

Re:.netでのtextbox

#12

投稿記事 by S西 » 16年前

>>バグs
フォームクラスのメンバ~
これって何処にどうかけばよろしいのでしょうか?
private: System::Windows::Forms::int^ cnt;
と書いたら当たり前ですがエラーが起きました

>>Yuos
すみません・・・できました><
VC.netでの開発は初めてで
使っている本には載っていなかったので・・・
ありがとうございます

S西

Re:.netでのtextbox

#13

投稿記事 by S西 » 16年前

refのところに書いたらできました><
すみませんご迷惑をおかけしました。

バグ

Re:.netでのtextbox

#14

投稿記事 by バグ » 16年前

解決したようですが、C#で書いてみましたので参考になれば…
実は普段はC#.NETでコーディングしているので、こちらの方が慣れているんですよね(^_^;)

UndoMaxというプロパティの数値を変更すると、アンドゥできる回数が変更できます。
TextBoxを継承して作成してますので、他はTextBoxと同じ用に使用できます。
アンドゥ用の文字列は(アンドゥは後入れ先出しなので)Stackクラスへ格納しています。

S西

Re:.netでのtextbox

#15

投稿記事 by S西 » 16年前

ご質問が3点御座います。
多くて申し訳ないのですが助けていただけますと幸いです。

A
タブのテキストをダブルクリック、もしくわF2変えられるようにしたいのですが、
ダブルクリックの取得方法を含め、どのように処理をすればよいかわかりません・・・

現在、画面右上にテキストボックスを配置しそこに文字をうち左上ファイルから
「タブ名を変換」をクリックしていただくと変わる仕様となっております。
これだと使わない人にとっては邪魔かと思います。
使うときにだけテキストボックスをダイアログみたい(F2を押すと直接?入力できるようになるでもOK)にでていただけると助かります。

説明が下手ですみません
何かアドバイスをいただけないでしょうか?


B
またUNDO機能なのですがTextBox本来のUNDOが先に働いてしまって
不具合が生じます。これを切ることはできないのでしょうか?
こちらについてもアドバイスを頂けますと助かります。


C
ファイルの保存のとき実行ファイルから見たフォルダの位置に保存する。
現在は"text_01"等と書いてあってexeと同じ場所に保存されてしまいます。
これをexeと同じディレクトリにあるSaveフォルダに入れたいです。
"Save\test_01.txt"と書いたらエラーは起こらないのですが保存するとエラーが起こります。

お忙しい中、ご確認よろしくお願いします。

バグ

Re:.netでのtextbox

#16

投稿記事 by バグ » 16年前

A:別のフォームクラスを作成して、F2が押された際にそのフォームを表示するとよいです。

B:前述の私のソースを御覧ください。かなり詳しくコメントしてありますので…。C#でもC++でも方法自体は同じです。

C:ApplicationクラスのStartupPathというプロパティが便利です。

バグ

Re:.netでのtextbox

#17

投稿記事 by バグ » 16年前

おっと、1つ忘れてました。
ダブルクリック時のイベントの追加はリソースエディタから行えます。
イベントハンドラを追加したいコントロールにフォーカスを合わせて、プロパティウインドウの雷マークをクリックし、DoubleClickと書かれてあるところでダブルクリックするとハンドラが追加されます。

S西

Re:.netでのtextbox

#18

投稿記事 by S西 » 16年前

バグ様
ご返答が遅くなり申し訳ありませんでした。
自分なりに書いてみたのですがやはりできませんでした。

A
新しいフォームの作成について調べてみたのですがイマイチやり方がわかりません。
2つのフォームが操作できる方法と片方しかできなくやり方があることぐらいまでは
何とか理解できました。

B
スタック型について調べ、
後入れ先出しという意味は理解できました。
ただ.net環境での開発は今回が初めてですので
C#のソースを読むことができません・・・。
折角わかりやすく書いていただいているのに申し訳ないです。
if(e->Control == true){
	if(e->KeyCode == Keys::Z){	//Z
		this->UndoString[this->UndoCnt] = this->textBox[this->tabControl1->SelectedIndex]->Text;
		if(this->UndoCnt < UNDO_MAX){
			this->UndoCnt++;
		}
		this->textBox[this->tabControl1->SelectedIndex]->Text = this->UndoString[this->UndoCnt];
	}else if(e->KeyCode == Keys::Y){	//Y
		if(this->UndoCnt > 0){
			this->UndoCnt--;
		}else{
						 
		}
		this->textBox[this->tabControl1->SelectedIndex]->Text = this->UndoString[this->UndoCnt];
	}
}
C
こちらについてパスの取得はできました。
しかし指定したフォルダがないとエラーが起こるので
この処理を入れる必要があるみたいです・・・。

ダブルクリックについてのイベントは追加できました><
ありがとうございます。

pooka

Re:.netでのtextbox

#19

投稿記事 by pooka » 16年前

Aについてちょっと作ってみました。

参考になりそうな所
ttp://msdn.microsoft.com/ja-jp/library/39wcs2dh(VS.80).aspx
ttp://msdn.microsoft.com/ja-jp/library/y2xxdce3(VS.80).aspx

S西

Re:.netでのtextbox

#20

投稿記事 by S西 » 16年前

pookaさん

フォーム作れました><
ありがとうございます。


問題がまたでてきてしまいまして
フォーム2でTextboxで書いた内容をフォーム1に受け渡す時ってどうするのでしょうか?
this->とかは書けないですよね・・・externとかするのでしょうか?

Form2.h
フォーム1側のテキスト              フォーム2側のアイテム
tabPage[this->tabControl1->SelectedIndex]->Text = this->nameTextBox->Text;

バグ

Re:.netでのtextbox

#21

投稿記事 by バグ » 16年前

ゲッター、セッター、アクセッサ、プロパティ…辺りをキーワードにググってみてください。

逆に質問なのですが、VC++での開発は初めてだという事ですが、他の言語(といっても、VC++もC++ですけど…)の経験はありますか?
どうも、オブジェクト指向というか、クラスについて理解できていない印象を受けるのですが…

S西

Re:.netでのtextbox

#22

投稿記事 by S西 » 16年前

いままでDOS上のCを扱ったことはあります。
その為、クラスという概念が理解できていません。(やってることはなんとなくわかります)
とある処理でつかう変数や関数をパッケージ化してるのですよね?

また以前はCOBOLで会計関係のシステムを作っておりました。
その為、若干とっつきにくいです。

S西

Re:.netでのtextbox

#23

投稿記事 by S西 » 16年前

すみません。

フォーム自体ののテキストは参照できました。
tabPage[this->tabControl1->SelectedIndex]->Text = nameForm->Text;

ただそのフォーム内のアイテムをかくとエラーになります。
tabPage[this->tabControl1->SelectedIndex]->Text = nameForm->nameTextBox->Text;

バグ

Re:.netでのtextbox

#24

投稿記事 by バグ » 16年前

あぁ、なるほど、それでですか。

えっと、ちょっと回答が前後しますが、UndoTextBoxをVC++で書き直してみました。
コンポーネントクラスとして書いていますので、コンポーネントクラスの追加の仕方から説明しておきます。

1:VisualStudio2005を起動する
2:プロジェクトを読み込む
3:ツールバーの「プロジェクト」をクリックする
4:「新しい項目の追加」をクリックする
5:「コード」をクリックする
6:「コンポーネントクラス」をクリックする
7:「ファイル名」を適当に入力する(UndoTextBoxとか)
8:「追加」をクリックする

これでコンポーネントクラスが追加されますので、追加されたファイルへ添付ファイルの中身をコピーしてください。

これで一度ビルドすれば、リソースエディタからUndoTextBoxを貼り付けることが出来るようになります。

うーん、VC++.NETは面倒ですね。C#やVBの方が分かり易いんじゃないかなぁ?

S西

Re:.netでのtextbox

#25

投稿記事 by S西 » 16年前

バグさん

お忙しい中、ありがとうございます。
なんとかUNDOについて、できました><
UNDO機能もMAXをいじり調整ができました。
本当に助かります。

S西

Re:.netでのtextbox

#26

投稿記事 by S西 » 16年前

連レスすみません。

>>フォーム自体ののテキストは参照できました。
>>tabPage[this->tabControl1->SelectedIndex]->Text = nameForm->Text;
>>ただそのフォーム内のアイテムをかくとエラーになります。
>>tabPage[this->tabControl1->SelectedIndex]->Text = nameForm->nameTextBox->Text;

こちらのエラーコードを書かせていただきます。

1>c:\documents and settings\hayato\デスクトップ\コピー ~ コピー ~ kanadememo\kanadememo\Form1.h(402) : error C2248: 'Sample::Form2::nameTextBox' : private メンバ (クラス 'Sample::Form2' で宣言されている) にアクセスできません。
1> c:\documents and settings\hayato\デスクトップ\コピー ~ コピー ~ kanadememo\kanadememo\Form2.h(45) : 'Sample::Form2::nameTextBox' の宣言を確認してください。
1> c:\documents and settings\hayato\デスクトップ\コピー ~ コピー ~ kanadememo\kanadememo\Form2.h(22) : 'Sample::Form2' の宣言を確認してください。

バグ

Re:.netでのtextbox

#27

投稿記事 by バグ » 16年前

Form2.hをインクルードしてない…とか?(^_^;)

バグ

Re:.netでのtextbox

#28

投稿記事 by バグ » 16年前

あ、よく読んでなかった…失礼しました。
Form2のnameTextBoxというオブジェクトはprivate属性ですので、Form2クラス内でしか参照できません。
ですので、外部クラス(今回の場合はForm1かな?)からアクセスできるnameTextBoxのTextを取り出す為の関数(これが先に書き込みしたアクセッサとかゲッターと呼ばれるものです)を作ってやらなければいけません。

例えば…ですが、Form2内にpublic属性で

public: String^ GetTextBoxText()
{
return nameTextBox->Text;
}

みたいな関数を作成して、この関数を介してテキストボックスに入力された文字列を取り出してみては如何でしょうか?

閉鎖

“C言語何でも質問掲示板” へ戻る