VisualStudio Tips
HOME > VisualStudio Tips

VB・VC作成の便利情報


ここではSurvey.DLLを利用するとコーディングが楽になる事例を紹介します。

・文字列の中にダブルクォーテーションを使いたい
・左右の端のダブルクォーテーションを削除したい
DLLでVBからVC、VCからVBで文字列のやり取りをしたい
・多角形の面積と重心を求める

・文字列の中にダブルクォーテーションを使いたい
「CSV形式で文字列をダブルクォーテーションで囲みたい」とかよくありますね。
ダブルクォーテーションは特殊文字なので扱いがなかなか面倒です。
通例:
その1:ひたすらダブルクォーテーションで囲む
Dim SS$
ss = """A"""

その2:Chr関数を利用する。
Dim SS$
SS="A"
ss = Chr$(&H22) + SS + Chr$(&H22)

Survey:dQuoAround関数を利用
Dim ss$
ss = "A"
ss = dQuoAround(ss)

・左右の端のダブルクォーテーションを削除したい
通例:
その1:毎回やるのは面倒
Dim SS$
SS = """ABC"""
SS = Mid(SS, 2, Len(SS) - 2)

Survey:TrimLR関数を利用
Dim ss$
ss = "ABC"
ss = dQuoAround(ss)
ss= TrimLR(ss,Chr$(&H22))

DLLでVBからVC,VCからVBで文字列のやり取りをしたい
よく受ける相談なので、Surveyとは関係ありませんが取り上げてみました。
ここでは、@の文字列をダブルクォーテーションで囲むの実際のコーディングを掲載しておきます。
【VB側】
Declare Function dQuoAround Lib "survey.dll" (wstr$) As String

【VC側】
/*****************************************************************************
文字列をダブルクォーテーションで囲む:dQuoAround
******************************************************************************/
extern "C" __declspec(dllexport) BSTR __stdcall dQuoAround(CString *wstr)
{
BSTR Bbuf;
CString Cbuf;
CString Arg1;
// VBから受け取った文字列の最後にNullがあるため  //
Arg1 = (*wstr).Left(strlen(*wstr)) ;
// ダブルクォーテーションで囲む
Cbuf = "\"" + Arg1 + "\"";
// VBの文字型で戻す
Bbuf = SysAllocStringByteLen(Cbuf, strlen(Cbuf));
return(Bbuf);
}
【解説】
注意するところは以下の3点です。
(1)C側の受け取りには、CStringクラスを使用する。
(2)受け取った文字列からNullを削除
(3)SysAllocStringByteLenでBSTRクラスに変換してVBへ戻す。


・多角形の面積と重心を求める
数学Tipsにある多角形の面積と重心を求めるをVB6.0で書いたものです。
面積、重心がそれぞれA,XG,YGに対応しています。

Dim x#(3), y#(3)
Dim N&, i&
N = 3
x(1) = 30
x(2) = 100
x(3) = 120

y(1) = 40
y(2) = 100
y(3) = 80

Dim A#, XG#, YG#, TX#, TY#
A = 0
XG = 0
YG = 0
TX = 0
TY = 0

For i = 1 To N
i1 = i + 1
If i1 > N Then i1 = 1

A = A + (x(i1) - x(i)) * (y(i1) + y(i))
XG = XG + ((x(i1) ^ 3 - x(i) ^ 3) * (y(i1) - y(i)) / 3 _
+ (x(i1) ^ 2 - x(i) ^ 2) * (x(i1) * y(i) - x(i) * y(i1)) / 2) _
/ (x(i1) - x(i))
YG = YG + ((y(i1) ^ 3 - y(i) ^ 3) * (x(i1) - x(i)) / 3 _
+ (y(i1) ^ 2 - y(i) ^ 2) * (x(i) * y(i1) - x(i1) * y(i)) / 2) _
/ (y(i1) - y(i))
TX = TX + x(i)
TY = TY + y(i)
Next i

A = Abs(A * 0.5)
XG = XG / A
YG = -YG / A
TX = TX / 3
TY = TY / 3
Debug.Print A, XG, YG, TX, TY


 

GIS開発本舗は、GIS開発やJGD2000,SHPなどのファイル変換のサポートをします。