Google
 
Web itpro-blogger.blogspot.com
木曜日, 5月 22, 2008

[C#]構造体

▼質問
構造体(struct)で作成した変数を関数に渡してその中身をその関数の中で取得して
データを取得したいんだけど・・・うまく値がセットされないんだ!?

どうしてだい?

▼回答
C#のstructは、C/C++のstructとは違うものなんだ。

C#での構造体は、値型でクラスは、参照型なんだ。

値型とは、情報を引き渡すときに情報をコピーする方式のデータ型である。
参照型とは、データの実体がある場所を保存しておき、情報を引き渡す必要がある場合は、
データの本体をコピーせず、データの場所だけを伝えるという方式である。

構造体で参照渡しをしたい時は、関数の引数と呼び出し側の引数に「ref」を付けるんだ。

public struct ユーザ定義名
{
public int num;
public string name;
}

public void Test( ref ユーザ定義名 user )
{
user.num = 1;
user.name = "テスト";
}

ユーザ定義名 getUser;

Test( ref getUser );


■参考サイト
@IT:連載 改訂版 C#入門 第5章 C#のデータ型
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_005/cs2_005_03.html
青島のしま~Blue Islands~ : .NET Tips
http://www.takebay.net/~daigo-ao/paddlewiki.pl/title_2E4E45542054697073.html


水曜日, 5月 21, 2008

[C#]object型のキャスト

▼質問
次のプログラムで 「指定されたキャストは有効ではありません。」のエラーが出る。どうして?

string sql = "SELECT * FROM テーブル名";
OracleDataAdapter objAdapter;
objAdapter = new OracleDataAdapter(sql, objOraConn);

DataSet objOraDataSet;
objOraDataSet = new DataSet("objDataSet");

// Fill the DataSet
objAdapter.Fill(objOraDataSet, "テーブル名");

DataRow objRow = objOraDataSet.Tables[0].Rows[0];
int val = (int)objRow["フィールド名"]; ← ここでエラー

▼回答
次の2つを使い分けてやればOK?!
Convert.ToInt32(objRow["フィールド名"]);
((IConvertible)objRow["フィールド名"]).ToInt32(null);

■参考サイト
object型のキャストについて: DOBON.NETプログラミング掲示板過去ログ
http://dobon.net/vb/bbs/log3-16/9607.html


日曜日, 5月 18, 2008

[VB→C#]My.Computer.FileSystem関連

▼質問
「My.Computer.FileSystem」関連の処理をVBからC#に移植しようと思うんだが・・・。

うまくいかないんだ。

▼回答
「My.Computer.FileSystem」を「Microsoft.VisualBasic.FileIO」に変換すれば問題ないよ。

名前空間のインポートに「Microsoft.VisualBasic.FileIO」を宣言すると次のエラーになる。

「エラー 1 'FileSystem' は、'Microsoft.VisualBasic.FileIO.FileSystem' と 'Microsoft.VisualBasic.FileSystem'' 間のあいまいな参照です。 ファイルパス」

「'Microsoft.VisualBasic」と「Microsoft.VisualBasic.FileIO」は共存できないようだ。

そこで考えた。

名前空間のインポートに「using FileIO = Microsoft.VisualBasic.FileIO;」を宣言して、

「My.Computer」を「FileIO」に変換すれば問題ないことがわかった。


土曜日, 5月 17, 2008

[VB→C#]INIファイル関連(WIN32API)

▼質問
INIファイル関連の関数宣言を教えてくれ!

▼回答
サンプルを示しておくから参考にしてくれ!!

[VB]
' INIファイルから値を取得する関数の宣言
Public Declare Auto Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileString" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As StringBuilder, _
ByVal nSize As UInt32, _
ByVal lpFileName As String) As UInt32

' INIファイルから値を取得する関数の宣言
Public Declare Auto Function GetPrivateProfileInt Lib "kernel32" _
Alias "GetPrivateProfileInt" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal intDefault As Integer, _
ByVal lpFileName As String) As UInt32

' INIファイルに値を設定する関数の宣言
Public Declare Auto Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileString" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As UInt32

[C#]
// INIファイルから値を取得する関数の宣言
[DllImport("kernel32.dll")]
public static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
uint nSize,
string lpFileName);

// INIファイルから値を取得する関数の宣言
[DllImport("kernel32.dll")]
public static extern uint GetPrivateProfileInt(
string lpAppName,
string lpKeyName,
int nDefault,
string lpFileName);

// INIファイルに値を設定する関数の宣言
[DllImport("kernel32.dll")]
public static extern uint WritePrivateProfileString(
string lpAppName,
string lpKeyName,
string lpString,
string lpFileName);


[C#]VBからの移植でのエラー

▼質問
VBからC#に移植しているんだけど。

次のコードで、次のエラーが出るんだ。どういう意味なのかな?

DataSet objDataSet = new DataSet("objDataSet");
 ~ 略 ~
DataRow objRow = objDataSetOra.Tables(0).Rows(0);

「エラー 1 'System.Data.DataSet.Tables' は 'プロパティ' ですが、'メソッド' のように使用されています。 ファイルパス」

▼回答
VBとC#で配列の文法が違うから気を付けた方がいいよ。

DataRow objRow = objDataSetOra.Tables[0].Rows[0];


▼質問
次のエラーが出るんだ。

「エラー 1 'objRow' は '変数' ですが、'メソッド' のように使用されています。 ファイルパス」

▼回答
これも、上記の回答と同じだよ。


[C#]型変換(キャスト)

▼質問
次のプログラムで

public string cnvString(double data) {
return data.ToString();
}

下記のエラーになるんだ。どうしてなんだ?

「エラー 1 メソッド グループ 'ToString' を非デリゲート型 'string' に変換することはできません。このメソッドを呼び出すことはできません。 ファイルパス」

次の様にするとエラーは出なくなるんだ。何か違う気がする・・・。

public string cnvString(double data) {
string s = data.ToString();
return s;
}

▼回答
VBやC言語で言う共通関数(値を渡して結果を返すだけの処理)のようなものならstaticを
付けてあげれば問題ないと思うよ。

public static string cnvString(double data) {
return data.ToString();
}

静的変数・静的メソッドはクラスごとに唯一つの実体を持ち、すべてのオブジェクトの間で共有される。
また、数学関数や数学定数などのインスタンスを持つ必要のない関数を定義する場合にも使う。

クラス内に処理実態とデータが含む場合はstaticにしてはいけない。

■参考サイト
静的変数・静的メソッド(C# によるプログラミング入門)
http://ufcpp.net/study/csharp/oo_static.html


金曜日, 5月 16, 2008

[C#]Oracle参照エラー

▼質問
下記のエラーが出るんだ。どうしたらいいんだ?!
「エラー 1 型または名前空間名 'Oracle' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 ファイルパス」

▼回答
ソリューション エクスプローラの参照設定から次の手順で設定するんだ。

参照設定を選択し、プロパティウィンドウ(右クリック)から「参照の追加」を選択するんだ。

「.NET」タブからコンポーネント名「Oracle.DataAccess」を選んで「OK」をクリックして終了だ。

ODP.NETのインストールとバージョンに注意してくれ!

■参考サイト
Oracle 散策
http://www.okisoft.co.jp/esc/db/ora04.html


[C#]デファイン or インクルード

▼質問
デファイン(#define)を定義するインクルードファイル(ヘッダファイル)ってないの?

▼回答
C#には、拡張子が(.h)のようなヘッダファイル(インクルード)は存在しないよ。

■参考サイト
C# 言語と .NET Framework の概要
http://msdn.microsoft.com/ja-jp/library/z1zx9t92(VS.80).aspx


[C#]C#の日付型

▼質問
C#にDate型はないの?

▼回答
Date型はないけど日付型を扱うにはSystem名前空間にあるDateTime型を使うんだ。

使用方法には、次に上げる2通りがあるぞ!

プログラムの最初で「using System;」と宣言する方法と、

プログラムの中で「System.DateTime」とする方法だ。

前者の方が、プログラムがスッキリして一般的に使われる

方法だと思うから、その方法をお勧めするよ!


木曜日, 5月 15, 2008

[C#]VBからC#への移植方法

■VBからC#への移植方法
1.「’(シングルコーテイション)」を置換で「//(ダブルスラッシュ)」にする。

2.「Imports」を「using」に変換し、行の最後に「;(セミコロン)」を付ける。

3.「Public」を「public」に「Private」を「private」に置換する。

4.「Public Class クラス名 ~ End Class」を「public class クラス名 { ~ }」にする。

5.「Public Enum 列挙名 ~ End Enum」を「public enum 列挙名 { ~ }」にし、列挙子の間を
「,(カンマ)」で区切る。

6.「Public Structure 構造体名 ~ End Structure」を「public struct 構造体名 { ~ }」にし、
メンバの型を次の様に変換する。
  Public 変数名 As Integer → public int 変数名;
  Public 変数名 As String → public string 変数名;
  Public 変数名 As Long → public long 変数名;
  Public 変数名 As Double → public double 変数名;
  Public 変数名 As Boolean → public bool 変数名;
  Public 変数名 As Date → public System.DateTime 変数名;

7.コンストラクタ「Sub New() ~ End Sub」を「public クラス名() { ~ }」にする。

8.下記の様に置換する。
  「New」 → 「new」
  「True」 → 「true」
  「False」 → 「false」
  「.ToString」 → 「.ToString()」
  「Try ~ Catch ex As Exception ~ Finally ~ End Try」 → 
「try { ~ } catch (Exception ex) {  ~ } finally { ~ }」
  ※注意:using Systemが必要!
  「GoTo」 → 「goto」
  「Nothing」 → 「null」

9.「IsDBNull」関数を下記に置き換え実装する。
public static bool IsDBNull(object data)
{
これよくなかった!
if (data == null) return true;
return false;
return Microsoft.VisualBasic.Information.IsDBNull(data);
}

10.「Format」関数を下記に置き換え実装する。
public static string Format(object data, string format)
{
これ間違えだった!
return String.Format(format, data);
return Microsoft.VisualBasic.Strings.Format(data, format);
}

11.配列宣言の型を次の様に変換する。
  「Dim val(2) As Integer」 → 「int[] val = new int[2];」

12.「Select Case 」文を次の様に変換する。

Select Case 変数名
Case 値
Case Else
End Select

switch ( 変数名 ) {
case 値:
default:
}

13.「For」文を次の様に変換する。

For i as Integer = 0 To 10
Next i

for ( int i = 0 ; i <= 10 ; i++ ) { } 14.「& _」を使った文字列の連結を「+」に変換する。 15.下記に示すものを削除し、プログラムの処理を変更する。   「On Error GoTo」 16.「Err.Number」を「Microsoft.VisualBasic.Information.Err().Number」とするか次の様にする。    ソリューション エクスプローラの参照設定から「参照の追加」より「Microsoft.VisualBasic」を    追加し、「Err.Number」を「Information.Err().Number」とする。    このやり方ではエラーの取得は駄目みたい(>_<)

17.定数宣言を次の様に変更する。
  「Public Const 定数名 As Integer = 0」 → 「public const int 定数名 = 0」

18.VB定数を次の様に変更する。
  「Chr(13)」 or 「vbCr」 → 「\r」 : キャリッジリターン文字
  「Chr(10)」 or 「vbLf」 → 「\n」 : ラインフィード文字
  「Chr(13) + Chr(10)」 or 「vbCrLf」 or 「vbNewLine」 → 「\r\n」 : キャリッジリターンとラインフィードの組合せ
  「Chr(9)」 or 「vbTab」 → 「\t」 : タブ文字
  「Chr(0)」 or 「vbNullChar」 or 「vbNullString」 → 「\0」 : 値 0 を持つ文字
  「Chr(8)」 or 「vbBack」 → 「\b」 : バックスペース文字


土曜日, 5月 10, 2008

[VB2005]コントロールを名前で探す

▼質問
コントロールを名前で探すにはどうしたらいいんだい。

▼回答
次の様にすれば直接コントロールを操作できるようになるよ。

CType(Me.Controls.Find(名前, True)(0), コントロール名)

■参考サイト
VB.NET - フォーム内のコントロールを名前で探して取得する
http://jeanne.wankuma.com/tips/vb.net/form/findcontrol.html


金曜日, 5月 09, 2008

[VB2005]別ウィンドウ(別EXE)の最前面表示

▼質問
別ウィンドウ(別EXE)で起動したアプリを最前面に表示したいんだ。どうしたらよいのか?

▼回答
次のAPIを使えばできるぞ!

API名は『BringWindowToTop』だ。

次にサンプルを示しておくから参考にしてくれ!!

'ウィンドウを最前面に表示する関数宣言
Declare Function BringWindowToTop Lib "user32.dll" Alias "BringWindowToTop" (ByVal hWnd As Int32) As Int32

'最上位フォーム設定解除
Me.TopMost = False

'プロセスを起動する.
prs = Process.Start(起動EXEパス, パラメータ)

'最上位フォーム設定
BringWindowToTop(CInt(prs.MainWindowHandle))

prs.WaitForExit()
prs.Dispose()
prs.Close()

'最上位フォーム設定
Me.TopMost = True


木曜日, 5月 01, 2008

[VBA]QueryTable

▼質問
Oracleからのデータバックアップで次のプログラムで実行しているんだが・・・。

「Selection.QueryTable.Refresh BackgroundQuery:=False」

どうやってODBCやSQL文の設定をしているかわからん!?

教えてくれ~!!

▼回答
一度「外部データの取込み」をやると、その時の操作が設定してしまい

変更ができないみたいなんだ。

だから、汎用的にやるには次のプログラムがお勧めだよ!?

With Worksheets(シート名).QueryTables.Add(Connection:="ODBC;DSN=データソース名;UID=ユーザ名;PWD=パスワード名", Destination:=Worksheets(シート名).Range("A1"))
.Sql = Array("SELECT * FROM テーブル名")
.Refresh
End With


This page is powered by Blogger. Isn't yours?