ファイルの書き出し VC++

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

ファイルの書き出し VC++

#1

投稿記事 by 西 » 16年前

VisualStadio2005AE
XP 詳しくわからないのですがVC++?

テキストボックスに書かれている内容を書き出したいのですが
どのようにすればよいのでしょうか?
現在コメント(※1)になっているところに処理を入れようとしておりま。
困っているのはテキストボックスの情報をどうやって取ってくるかということです、

※1 //write->WriteLine(this->textBox1->

どうかよろしくお願いします。

ファイルの書き出し VC++
#pragma once


namespace Memo {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::IO;


	/// <summary>
	/// Form1 の概要
	///
	/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
	///          マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
	///          変更する必要があります。この変更を行わないと、
	///          デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
	///          正しく相互に利用できなくなります。
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: ここにコンストラクタ コードを追加します
			//
		}

	protected:
		/// <summary>
		/// 使用中のリソースをすべてクリーンアップします。
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::TabControl^  tabControl1;
	protected: 
	private: System::Windows::Forms::TabPage^  tabPage1;
	private: System::Windows::Forms::TabPage^  tabPage2;
	private: System::Windows::Forms::TabPage^  tabPage3;
	private: System::Windows::Forms::TabPage^  tabPage4;
	private: System::Windows::Forms::TextBox^  textBox1;
	private: System::Windows::Forms::MenuStrip^  menuStrip1;
	private: System::Windows::Forms::ToolStripMenuItem^  menuFile;
	private: System::Windows::Forms::ToolStripMenuItem^  menuOpen;
	private: System::Windows::Forms::ToolStripMenuItem^  menuAsSave;

	private:
		/// <summary>
		/// 必要なデザイナ変数です。
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
		/// コード エディタで変更しないでください。
		/// </summary>
		void InitializeComponent(void)
		{

			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(1, 6);
			this->textBox1->Multiline = true;
			this->textBox1->Name = L"textBox1";
			this->textBox1->Size = System::Drawing::Size(628, 414);
			this->textBox1->TabIndex = 0;

			// 
			// menuStrip1
			// 
			this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(1) {this->menuFile});
			this->menuStrip1->Location = System::Drawing::Point(0, 0);
			this->menuStrip1->Name = L"menuStrip1";
			this->menuStrip1->Size = System::Drawing::Size(640, 24);
			this->menuStrip1->TabIndex = 1;
			this->menuStrip1->Text = L"menuStrip1";
			// 
			// menuFile
			// 
			this->menuFile->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(2) {this->menuOpen, this->menuAsSave});
			this->menuFile->Name = L"menuFile";
			this->menuFile->Size = System::Drawing::Size(51, 20);
			this->menuFile->Text = L"ファイル";
//////////略			

// 
			// menuOpen
			// 
			this->menuOpen->Name = L"menuOpen";
			this->menuOpen->Size = System::Drawing::Size(152, 22);
			this->menuOpen->Text = L"開く";
			// 
			// menuAsSave
			// 
			this->menuAsSave->Name = L"menuAsSave";
			this->menuAsSave->Size = System::Drawing::Size(152, 22);
			this->menuAsSave->Text = L"上書き保存";
			this->menuAsSave->Click += gcnew System::EventHandler(this, &Form1::menuAsSave_Click);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(640, 480);
			this->Controls->Add(this->tabControl1);
			this->Controls->Add(this->menuStrip1);
			this->MainMenuStrip = this->menuStrip1;
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
			this->tabControl1->ResumeLayout(false);
			this->tabPage1->ResumeLayout(false);
			this->tabPage1->PerformLayout();
			this->menuStrip1->ResumeLayout(false);
			this->menuStrip1->PerformLayout();
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion
	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
			 }
	private: System::Void menuAsSave_Click(System::Object^  sender, System::EventArgs^  e) {
				 StreamWriter^ write = gcnew StreamWriter("text_01.txt");
				 //write->WriteLine("aaa");
				 //write->WriteLine(this->textBox1->
				 write->Close();
				 MessageBox::Show("ファイルに書き込みました");
			 }
};
}

pooka

Re:ファイルの書き出し VC++

#2

投稿記事 by pooka » 16年前

詳しくありませんがtextBox1->Textでいけませんか?

西

Re:ファイルの書き出し VC++

#3

投稿記事 by 西 » 16年前

できました><
ありがとうございます。

ただただ先ほど気づいた問題点が1つあります。
ウインドウ上部をダブルクリックすると最大化するじゃないですか?
でもサイズ変えたからってテキストボックスとかのサイズが変わってくれないんです・・・。
当たり前なんですけど・・・

System::Drawing::Size(628, 414);

とかを直接値をいじらないといけないのでしょうか?
何か良い方法はないでしょうか?

バグ

Re:ファイルの書き出し VC++

#4

投稿記事 by バグ » 16年前

Anchorというプロパティを変更してやれば、フォームサイズの変更に合わせて変わってくれますよ。

西

Re:ファイルの書き出し VC++

#5

投稿記事 by 西 » 16年前

バグ様できました><
ありがとうございます。
またまた質問で申し訳ありません・・・

いろんなサイトを見ながら作っているのですが自分では解決できなかったので
再度質問させていただきます。

大方の処理はできたのですが読み込み?(開く)のファイル名を指定する場合
.txtファイルを呼ぶと文字化けしてしまいます。
また dlg->Filter = "すべてのファイル(*.*)|*.*";
の最後の*.*を.txtに変えてもテキストのみの読み込み指定?ができませn・・・

どのようにすればよいのでしょうか?

OpenFileDialog^ dlg = gcnew OpenFileDialog();
			 dlg->Filter = "すべてのファイル(*.*)|*.*";
			 if(dlg->ShowDialog() != System::Windows::Forms::DialogResult::OK){
				 return;
			 }
			 //this->textBox1->Text = dlg->FileName;
			 
			 StreamReader^ reader = gcnew StreamReader(dlg->FileName);
			 this->textBox1->Text = reader->ReadLine();
			 reader->Close();
			 MessageBox::Show("ファイルに読み込みました");

pooka

Re:ファイルの書き出し VC++

#6

投稿記事 by pooka » 16年前

>.txtファイルを呼ぶと文字化けしてしまいます。
Shift-JISなら
StreamReader^ reader = gcnew StreamReader(dlg->FileName,System::Text::Encoding::GetEncoding(932));
こんなかんじでいけると思います。

>また dlg->Filter = "すべてのファイル(*.*)|*.*";の最後の*.*を.txtに変えてもテキストのみの読み込み指定?ができませn・・・
こちらはちょっとわかりません。
dlg->Filter = L"テキストファイル(*.txt)|*.txt";
のようにすれば、ダイアログを表示したとき、
テキストファイルだけ表示されると思うのですが、それとは違うのでしょうか?

西

Re:ファイルの書き出し VC++

#7

投稿記事 by 西 » 16年前

ご回答ありがとうございます。

dlg->Filter = L"テキストファイル(*.txt)|*.txt";

でいけました・・・。
dlg->Filter = L"テキストファイル(*.txt)|.txt"
こう書いておりました・・・。

StreamReader^ reader = gcnew StreamReader(dlg->FileName,System::Text::Encoding::GetEncoding(932));
については一応読み込めたのですが1行だけしか見ることができません・・・どうすればよいでしょうか?

pooka

Re:ファイルの書き出し VC++

#8

投稿記事 by pooka » 16年前

>this->textBox1->Text = reader->ReadLine();

this->textBox1->Text = reader->ReadToEnd();
これで最後まで読み込めると思いますよ^^

西

Re:ファイルの書き出し VC++

#9

投稿記事 by 西 » 16年前

pooka様

問題なくできました。


今回初めてVCを触ったのでとっつきにくいところがかなりありますが頑張ります。

現在
this->textBox1->Text
の文字数を取得する
というところで戸惑っております。

こちらに関してはstrlenみたいな関数はないのでしょうか?
this->textBox1->Text->に Length というものがあったので
これをどうにかして使うのでしょうか?

pooka

Re:ファイルの書き出し VC++

#10

投稿記事 by pooka » 16年前

Lengthで文字数を取得することができます。
this->textBox1->Text->Length
でOKです。

バグ

Re:ファイルの書き出し VC++

#11

投稿記事 by バグ » 16年前

.NETライブラリは慣れると便利なことこのうえないですよ(^-^)
ただし、欲しい機能がほとんど揃っているので、自分で組もうとする意欲が削がれるのが難点といえば難点です(笑)

西

Re:ファイルの書き出し VC++

#12

投稿記事 by 西 » 16年前

文字カウントのPGを作っております。

pooka様それだと型の問題でテキストに入れることができませんでした。
下記のようにキャストをしてみたのですが無理みたいです。
どのようにすればよろしいのでしょうか?
this->label1->Text = (String ^)this->textBox1->Text->Length;

また
this->label1->Text = "文字 = ";
~処理
this->label1->Text = "文字 = ○"; //丸には文字数が入ります。
にしたいです。

ただこれを表示することに問題がありまして、今までゲームを作ってきた関係で
アプリケーションで常に値をかえるのにどこでwhileを書くか迷っております。

一層、ボタンを作って押したときにだけ表示させようかなとも思っております。
こちらについては
MessageBox::Show("文字数 = %d","確認");
みたいにできないのでしょうか?

質問ばかりで本当にすみません。

pooka

Re:ファイルの書き出し VC++

#13

投稿記事 by pooka » 16年前

とりあえず
>型の問題でテキストに入れることができませんでした。
textBox1->Text->Length.ToString()
としてみてください。

>this->label1->Text = "文字 = ";
>~処理
>this->label1->Text = "文字 = ○"; //丸には文字数が入ります。
>にしたいです。
例えば
this->label1->Text = "文字 = ";
こうあったとすると
this->label1->Text += this->textBox1->Text->Length.ToString();
とすれば文字 = ○のように表示できるかと。

>>バグさん
>ただし、欲しい機能がほとんど揃っているので、自分で組もうとする意欲が削がれるのが難点といえば難点です(笑)
私はC#でやっていて、たいしたものは作れませんけど分かるようなきがします^^;

バグ

Re:ファイルの書き出し VC++

#14

投稿記事 by バグ » 16年前

書式指定ならば、String.Formatを使うといいですよ(o^-')b

pooka

Re:ファイルの書き出し VC++

#15

投稿記事 by pooka » 16年前

ちょっと作ってみました。(間違ってる可能性がありますが)
やりたいことと違ってたらごめんなさいm(_ _)m
私はVisualStudio2008 PEで作ってるので、2005で開けるように直したつもりですが、開けないかもしれません…

>ただこれを表示することに問題がありまして、今までゲームを作ってきた関係で
>アプリケーションで常に値をかえるのにどこでwhileを書くか迷っております。
おそらくテキストボックスで文章を書いたりしたとき、文字数の表示も一緒に変化させたいのかなと思ったので、
テキストボックスのTextChangedというイベントを使いました。

あとString::Format使ったことなかったので使ってみました。

西

Re:ファイルの書き出し VC++

#16

投稿記事 by 西 » 16年前

>>バグさん、pookaさん
返信ありがとうございます。

>>pookaさん
ソース見せていただきました。
やりたいことはそれです!!
私の方でも試してみたのですがラベルが変更されませんでした・・・。

ファイル置場となります。
ttp://momiji0210.web.fc2.com/web_test/test.zip

また、それ以外にも
問題が2つありまして
1、ソースを見ていただければわかるかと思うのですが
  かなり非効率なやり方でタブの取得をおこない表示している

2、リリースで作ったアプリをほかのPCで起動できない。
  アプリケーションの初期化ができないエラーが起こります。
  もしかしたらリビルドしないでビルドで吐き出したものを持っていったからかもしれません。
  お互いXPです。

pooka

Re:ファイルの書き出し VC++

#17

投稿記事 by pooka » 16年前

>私の方でも試してみたのですがラベルが変更されませんでした・・・。
textBox1であれば
this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);

#pragma&#160;region&#160;Windows&#160;Form&#160;Designer&#160;generated&#160;code
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;<summary>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;デザイナ&#160;サポートに必要なメソッドです。このメソッドの内容を
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;コード&#160;エディタで変更しないでください。
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;</summary>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;void&#160;InitializeComponent(void)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//省略

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;textBox1
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->AllowDrop&#160;=&#160;true;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->Anchor&#160;=&#160;static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top&#160;|&#160;System::Windows::Forms::AnchorStyles::Bottom)&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;System::Windows::Forms::AnchorStyles::Left)&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;System::Windows::Forms::AnchorStyles::Right));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->Location&#160;=&#160;System::Drawing::Point(1,&#160;6);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->Multiline&#160;=&#160;true;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->Name&#160;=&#160;L"textBox1";
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->Size&#160;=&#160;System::Drawing::Size(628,&#160;414);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->TabIndex&#160;=&#160;0;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->DragDrop&#160;+=&#160;gcnew&#160;System::Windows::Forms::DragEventHandler(this,&#160;&Form1::textBox1_DragDrop);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->DragEnter&#160;+=&#160;gcnew&#160;System::Windows::Forms::DragEventHandler(this,&#160;&Form1::textBox1_DragEnter);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this->textBox1->TextChanged&#160;+=&#160;gcnew&#160;System::EventHandler(this,&#160;&Form1::textBox1_TextChanged);//[color=red>ここ[/color]

に追加すれば変更されると思います。

ただ、私はデザイナー画面?(添付画像)のプロパティウィンドウのイベントの所で設定したほうがいいかなと思います。

>問題が2つありまして
>1、ソースを見ていただければわかるかと思うのですが
>  かなり非効率なやり方でタブの取得をおこない表示している
とありますが、数が多くなる予定であれば配列にした方がいいかなと思います。

VisualC++で作り慣れていないのでいろいろ試行錯誤しながら作ってみました。(次に添付します)
なのでこれでいいのかわかりませんm(_ _)m
配列にするなら自分でいろいろ書かないといけないので、少し面倒でした^^;

>2、リリースで作ったアプリをほかのPCで起動できない。

こちらはちょっとわかりません。

pooka

Re:ファイルの書き出し VC++

#18

投稿記事 by pooka » 16年前

上でも書いたとおり自分でもきちんと理解してるわけではないので、コメント部分が少ないです。
あとファイルの読み込みや保存などの処理はコメントにしてあります。(仕様によってかわると思うので)

バグ

Re:ファイルの書き出し VC++

#19

投稿記事 by バグ » 16年前

.NETライブラリがインストールされていない環境では動きません。例えばSPのインストールされていないスッピンのXPなら駄目でしょうね。
VS2005で組んだのであれば、.NET2.0ですね。XPであればSP3がインストールされていれば間違いなく入っているはずですが…

西

Re:ファイルの書き出し VC++

#20

投稿記事 by 西 » 16年前

>>pookaさん
色々とありがとうございました!!
VC.netは基本C言語みたいなのですが配列の定義がjavaとかに似ていますね。
またprintfとかで使える%dなどは{0:00}みたいに書くのですねw

基本が全く分かっていないので勉強していきます。
助かりました。ありがとうございます。

>>バグさん
XPSP3なのですが初期化エラーが出ます。
明日もう一度試してみますね。

バグ

Re:ファイルの書き出し VC++

#21

投稿記事 by バグ » 16年前

>>pookaさん
私だったら、テキストボックスとラベルを1つのクラスとしてしまいますね。
今回みたいに、.NETを使用したものならば、ユーザーコントロールというのを使うといいですよ。
ソースを添付しておきますね(^-^)

>>西さん
うーん、謎ですね(^_^;)

pooka

Re:ファイルの書き出し VC++

#22

投稿記事 by pooka » 16年前

>>バグさん
ありがとうございます><
ビルドしてみたところInputBox.hがないというエラーがありましたが、
該当箇所をコメントアウトしたところ起動できました。
ユーザーコントロールというのを初めて知りました。
確かに今回のような場合はまとめて扱ったほうがいいかもしれませんね。
今まで作ってきたソフトもいろいろ改良できそうです。
勉強になりました。m(_ _)m

バグ

Re:ファイルの書き出し VC++

#23

投稿記事 by バグ » 16年前

>>ビルドしてみたところInputBox.hがないというエラーがありましたが…

あ、失礼しました(^_^;)
途中でWRboxという名前に変更したのですが、修正しきれてなかったみたいですね、申し訳ないっすm(__)m
ユーザーコントロールはC#やVBでも使えますんで、使ってみてください(^0^)

pooka

Re:ファイルの書き出し VC++

#24

投稿記事 by pooka » 16年前

>ユーザーコントロールはC#やVBでも使えますんで、使ってみてください
はい、ぜひ使ってみたいと思います^^

閉鎖

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