くだすれ.NET(超初心者向け)

このエントリーをはてなブックマークに追加
934932:2009/01/24(土) 00:00:01
>>933
pin_ptrについて調べてみます。
ありがとうございました。
935デフォルトの名無しさん:2009/02/01(日) 15:21:56
.NETぢゃないライブラリならアプリと同梱して自動でインストールできるのに、
.NETってMSのサイトからDLして別途インストールさせないといけませんよね?
これ、自分で勝手にファイル配れるようになってればまだマシだったのに、
いろいろなバージョンをDL、インストールしないといけない現状はいかがなものかと思います。

.NETって騒ぎ始めたあともMS謹製のOfficeは.NETじゃなかったと思うんですが、
やはりうざすぎて嫌われるのを予知していたのでしょうか
936デフォルトの名無しさん:2009/02/01(日) 15:25:43
配れます
937デフォルトの名無しさん:2009/02/01(日) 16:19:52
勝手に.net最新版をインストールしても、他のアプリケーションに悪影響を及ぼすことは
ありませんか?
あるいは他のひとに違うバージョンとかパッチをインストールされても動作が変わったり
する恐れはありませんか?
938デフォルトの名無しさん:2009/02/01(日) 16:23:53
ない
勝手に適当に選んでくれる
939デフォルトの名無しさん:2009/02/01(日) 16:45:00
そうでもない。
2.0以降は大丈夫だが。
1.0-1.1以降
1.1-2.0以降
は動作は保障されない。
940デフォルトの名無しさん:2009/02/01(日) 16:47:20
>>939
どうせ書くなら「まともな」日本語で頼む。
941デフォルトの名無しさん:2009/02/01(日) 16:49:19
理解できないの?ハハッワロス
942デフォルトの名無しさん:2009/02/01(日) 16:56:13
>>939
最新版をインストールしても古いのが使われるよ
943デフォルトの名無しさん:2009/02/01(日) 22:14:36
逆に新しいので使わせたかったら、
古いのをアンインストするか、
構成ファイルでバージョン指定
<configuration><startup>
   <supportedRuntime version="v2.0.50727"/>
   <supportedRuntime version="v1.1.4322"/>
944デフォルトの名無しさん:2009/02/06(金) 09:04:47
945デフォルトの名無しさん:2009/02/23(月) 16:37:18
ttp://nicoae.if.land.to/index.php?%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3
C++/CLIでプラグインを作るのってどうするんですか?
C++の知識はそこそこありますが、C++/CLIとC#の知識が殆どなく
何からはじめたらいいのか分かりません。
946デフォルトの名無しさん:2009/02/23(月) 21:32:47
クラスライブラリ(dll)作る
プラグイン用に用意されたdllを参照してその中のクラスを継承するパターンが多い
プラグインだからと言って特別なことは何もない
947デフォルトの名無しさん:2009/02/24(火) 22:48:52
mscoree.libってどこにあるん?
948デフォルトの名無しさん:2009/02/25(水) 05:54:29
Windows SDKに入ってるから入れてやれば
C:\Program Files\Microsoft SDKs\Windows\{Version}\Lib あたりにあるとおも
949デフォルトの名無しさん:2009/02/27(金) 23:58:50
String::Format()関数を使って文字列をlabelコンポーネントで表示しているのですが、
タブが表現できず困っています。
"\n"はちゃんと反映されて改行されるのですが、"\t"としても、sprintfのようにタブが表示されません。
どのようにすればタブが反映されるのでしょうか?
950デフォルトの名無しさん:2009/02/28(土) 05:13:19
System.Windows.Forms.LabelがOS標準のLabelを使ってないせいでタブの扱いなどに互換がない。
その文字列をMessageBox.Showで表示したらタブが処理されているのが分かる。
951949:2009/03/01(日) 01:55:44
>>950
そういうことでしたか。
ありがとうございました。
952デフォルトの名無しさん:2009/03/01(日) 13:36:16
ビットマップのメモリリークで困っています。

pictureBoxコンポーネントをフォームに配置し、プログラム上で以下のような記述で描画しています。

// pictureBoxコンポーネントからBitmapを抽出する
Bitmap bmp = pictureBox->Image;

// 描画
bmp.SetPixel( 10, 10, Color::FromArgb( 255, 255, 255 ) );

// BitamapをpictureBoxコンポーネントにセットする
pictureBox->Image = Image::FromHbitmap( bmp.GetHbitmap() );

この処理をタイマーで定期的に行うのですが、処理を行う度に抽出したビットマップ分の
メモリが増加していき、しまいにはメモリが足りないと言われてプログラムが落ちます。

bmp.Dispose()はプライベート関数なので呼べず、Deleteも効きませんでした。
そもそも、自動変数的に宣言しているので、スコープ(タイマー処理関数内)を抜けたら
自動的に解放されるのでは、とも思います。

どのように対処すればよいでしょうか?
953デフォルトの名無しさん:2009/03/01(日) 13:40:43
だいぶ誤解があるようだけどその前に
pictureBox->Image = bmp;じゃダメなのか
954デフォルトの名無しさん:2009/03/01(日) 17:48:38
>>952
とりあえずコードに関する事だと、
pictureBox->Image を直接編集するように変更すればいい

次に忠告、
C++/CLIはC++と.NETの両方に精通した者が使う言語
というか、そうじゃないとまともに使えん(取り扱い注意)

>>953
bmp が Bitmap^ じゃないからそれじゃダメだ
そもそも、Bitmap^ なら再代入いらないんだが
955954:2009/03/01(日) 17:50:20
以下、余談 (一応、>>952の説明)

・bmpはスコープ抜けるときにDisposeされる
・GetHbitmap()で作ったHBITMAPは解放されない(これが直接の原因。DeleteObject() せよ)
・元のpictureBox->Imageも直ぐにはDisposeされない (delete すべし)

それ以前に自分がやってることの珍妙さを理解してるのか疑問

1. pictureBox->Image の中身を bmp にコピー
2. bmp から HBITMAP (GDI) を作成 (コピーされる)
3. 2で作成した HBITMAP (GDI) から Image (CLI) を作成 (コピーされる)
956デフォルトの名無しさん:2009/03/01(日) 18:04:39
>>954
PictureBoxから直接Bitampを取り出すのってできたっけ?
まあBitmapにしないで、Graphics.FromImageを使えばいいはずだけど。
957デフォルトの名無しさん:2009/03/01(日) 18:26:37
普通にキャスト(C++/CLIだとsafe_cast)すればいいと思うよ
Bitmap であることを保証するのはプログラマの仕事
(プロパティには自分で代入してるはずでしょ?)
958デフォルトの名無しさん:2009/03/01(日) 21:06:55
PictureBox.ImageってBitmap^型じゃなかったか?
それをそのまま使えばいいだけじゃないのかと
あと勘違いしてるみたいだけど,C++/CLIではBitmap^とBitmapはどちらもハンドル型だよ
959デフォルトの名無しさん:2009/03/01(日) 21:38:18
>>958
いやいやいや、名前通りImage^型だよ。
あと、^なしのBitmapだとスコープを抜けるときにDisposeが呼ばれるから、
単純に同じと言いきったらまずいだろ。
960952:2009/03/02(月) 00:10:30
みなさん、ありがとうございます。
ちゃんと勉強してから組まないといけませんね(汗)

ありがとうございました。
961デフォルトの名無しさん:2009/03/02(月) 02:03:18
>>960
とりあえず、.NET使いたい/勉強したいだけならC#に行くといい
一番重要なのは、コンパイルが早いことと、インテリセンス、スニペット使い放題なこと
962945:2009/03/04(水) 22:14:29
>>946
しかしメソッドの宣言で挫折しました
ttp://uproda.2ch-library.com/lib110688.zip.shtml
ProcessingImageとかアクセッサの書き方が分かりません・・
System.Drawingが参照追加したはず?なのに使えません。
963デフォルトの名無しさん:2009/03/04(水) 23:33:33
ソース公開されてるプラグイン見れ
あとそれPASSが設定されているわけだが
964デフォルトの名無しさん:2009/03/09(月) 18:14:13
panel1の中にpictureBox1を配置して
panel1.AutoScroll = true;としたのですが
スクロールバーの表示が何か変です。

初期状態ではpanel1.HorizontalScroll.Maximumや
panel1.VerticalScroll.Maximumの値が100で、
pictureBox1の位置とサイズをpanel1より大きくすると
Maximumの値がpictureBox1に合わせて広がりますが
その後pictureBox1の位置とサイズを小さくしても
Maximumの値が広がったままになっています。

その後panel1の中にpictureBox1が収まると
スクロールバーは縦横とも表示されないのですが、
横は収まってるけど縦に収まらない状況になると
本来なら縦スクバーだけ表示されるはずなのに
必要ない横スクバーまで表示されてしまいます。

panel1.HorizontalScroll.Visibleを確認するとfalseでした。
スクロールバーの稼動範囲はMaximumの値を基準に
しているようですが実際には反応しません。
Maximumの値は取得できても変更することはできなくて
ガバガバに広がっていく一方なのでスクロールバーを
締めなおすこともできません。どうしたもんでしょうか?

panel1.HorizontalScroll.LargeChangeとかは変更できるのに…
965デフォルトの名無しさん:2009/03/09(月) 19:58:12
>>964
一生懸命書いてるつもりかもしれんが文章が「日本語で書きください」過ぎる。

ただ、HScrollProperties.Maximumってどういう値かわかって操作してるのか?
Valueプロパティに関心がない限り、普通は触る必要がないはずの値だと思うんだが。。
966デフォルトの名無しさん:2009/03/10(火) 18:51:51
横にスクロールする必要がない状況でも
ScrollProperties.Maximumが大きいままなので
それが機能しないスクロールバーが表示される原因と
何か関係があるのではと思いました。

ScrollProperties.Maximumでスクロール可能な範囲の上限を
取得または設定しますとあるので適切な値を設定すれば
スクロールバーがバグって表示されることもないかと
panel1.HorizontalScroll.Maximum=100とかやってみても
Maximumの値は100になってくれません。

Maximumの値を自分で変更するにはどうすれば、もしくは
不要なスクロールバーを表示させないようにするには
どうすればいいのかで困っております。
967デフォルトの名無しさん:2009/03/10(火) 23:05:04
スクロールバーは一度AutoScrollをfalseにして
またtrueにすれば表示されなくなりました。

中途半端ですがとりあえず自己解決です。
968デフォルトの名無しさん:2009/03/13(金) 06:51:25
文字コードについての質問なんですが、
文字列に独自の文字コードを埋め込もうと思ってて

char first[3] = {0xef, 0x27, 0x00};
char second[10] = "・てすと";
char last[3] = {0xef, 0x28, 0x00};
char buforg[100];
ZeroMemory(buforg, sizeof(buforg));
strcat(buforg, first);
strcat(buforg, second);
strcat(buforg, last);

System::String^ strTest = gcnew String(buforg);

こんな感じでやって strTestには 0xef27・てすと0xef28 と入るのが理想なんですが
0x30fb・てすと0x30fb になってしまい 「・」が0x30fbなので区別がつかない状態になってしまいます。
Stringはおろかwchar_tなどのUnicode全般でこのような現象になってる気がするのですが、
この勝手に変換されちゃう現象どうにかする方法はないでしょうか?

WindowsXP SP3 VisualStudio2008Pro C++/CLI
969デフォルトの名無しさん:2009/03/13(金) 09:54:02
char second[10] = "00てすと";  // 0xfb30
second[0]=0x30, second[1]=0xfb; ではダメか?

ちなみに、ソースファイルの文字コードは何ですか?
(UTF-16(Unicode):UTF-8:S-JIS)
970デフォルトの名無しさん:2009/03/13(金) 18:10:00
>>969
0x30fb 0x30 0xfa1b 0xff84 'す' 'と' 0x30fb って感じになりました。
ソースコードは日本語(S-JIS) コードページ: 932です。

Unicode(UTF-8シグネチャつき)コードページ:65001
Unicode コードページ1200
Unicode(Big Endian) コードページ1201
で試してみましたが効果ありませんでした。

971デフォルトの名無しさん:2009/03/14(土) 01:19:54
CLIでもデフォ文字コードってUnicodeでなかったか?
独自コード梅たいなら徹頭徹尾BYTE[]で扱わないとダメなんでないの
972デフォルトの名無しさん:2009/03/14(土) 10:17:37
どうやら外字領域の文字コードを使うとShiftJISの外字領域とUnicodeの外字領域が1対1で対応してるので
うまくいくぽいです。
なので一時的に 0xef27を外字領域の文字コードに置き換えるなどして対処してみます
ありがとうございました。
973デフォルトの名無しさん:2009/03/14(土) 18:13:02
>>968
初めからwchar_t使えばいいじゃない。
wchar_t first[] = {0xef27, 0x00};
wchar_t second[] = L"・てすと";
wchar_t last[] = {0xef28, 0x00};
wchar_t buforg[100];
ZeroMemory(buforg, sizeof(buforg));
wcscat(buforg, first);
wcscat(buforg, second);
wcscat(buforg, last);

System::String^ strTest = gcnew String(buforg);

"・てすと"をwchar_tにするのがいや?
だったら、first、second、lastみんなSystem::Stringにしてから連結するのが楽だよ。

>>969-970
ソースコード自体の文字コードは、プログラムには基本的に影響しないよ。
974969:2009/03/14(土) 18:46:03
>>973 その System::String にどうやって外字コードを埋め込むのかの問題。
 :
0x30fb --> "・" だから、Unicode-BE でソース書かないと。ただし、Visual Studio IDEで開くと文字化けする。
char型に 0xfe が代入出来てるのも気になった。
 :
テスト方法:
IO::StreamWriter^ sw = gcnew IO::StreamWriter("testCLI.txt", false, Text::Encoding::BigEndianUnicode );
sw->Write(strTest);
sw->Close();
975デフォルトの名無しさん:2009/03/14(土) 19:57:55
>>974
いや、ソースコードがいかなる文字コードだろうと、
char mbs[] = "・";はchar mbs[] = {0x81, 0x45, 0x00};と同じだし(日本語環境なら)、
wchar_t wcs[] = L"・";はchar mbs[] = {0x30fb 0x0000};と同じ。
そのテスト方法のコードで確かめてみれば分かる。

charの初期化で0xfeを指定している部分は警告レベルを上げると指摘される。
'\xfe'と書けばいい。
976974:2009/03/14(土) 22:16:46
>>975 そのとおりです。
> char second[10] = "・てすと";
> 「・てすと」になってしまい、「・」が0x30fbなので
初期化の時点では「・」は0x30fbでない。
977デフォルトの名無しさん:2009/03/15(日) 00:04:42
もしかして、"・てすと"の「・」ってその外字だったり独自のコードだったりするの?
978969:2009/03/15(日) 00:07:10
>>968
UCHAR first[3] = {0xef, 0x27, 0x00};
UCHAR second[10] = "・てすと";
UCHAR last[3] = {0xef, 0x28, 0x00};
TCHAR buforg[100];
などのように、変更する。
System::String((TCHAR*)buforg); に変えるだけでも同じ結果になる。
> strTestには 0xef27・てすと0xef28 と入るのが理想なんですが
979969:2009/03/15(日) 00:47:00
間違い。
TCHAR second[5] = L"・てすと";

> もしかして、"・てすと"の「・」ってその外字だったり独自のコードだったりするの?
違う、と思う。
980デフォルトの名無しさん:2009/03/15(日) 01:32:43
>>978
TCHARってだけ書かれてもUNICODEのときの話かそうでないのか分からない。
981969:2009/03/15(日) 02:07:02
あっそうだ WCHAR。
> char first[3] = {0xef, 0x27, 0x00};
> char last[3] = {0xef, 0x28, 0x00};
それと、このあたりのバイトオーダーも気になるから
UCHAR first[3] = {0x27, 0xef, 0x00};
UCHAR last[3] = {0x28, 0xef, 0x00};
> strTestには 0xef27・てすと0xef28 と入るのが理想なんですが
982973:2009/03/15(日) 17:50:52
>>977
マルチバイトの0xef27と「・」(0x8145)が Stringにしたときに同じ文字コードだよってのを確認するための「・」です。


最終的にStringインスタンス生成するときにUnicodeで渡せばエンコード入らないので
独自文字コードが変化しないって感じですか。
今回は出力する直前までbyte[]で保持し続けておいて出力する段階で外字領域に一時的に変換するって形で対応しちゃったんですが
とても勉強になりました。ありがとうございました。
983デフォルトの名無しさん
>>973 の人?