ラベル VB6 の投稿を表示しています。 すべての投稿を表示
ラベル VB6 の投稿を表示しています。 すべての投稿を表示

2011年9月18日日曜日

VB6のプログラミング一覧

※参考度は個人的は評価です。(助かった度かも?)

VB6のvsFlexGridで複数選択したセルの色を一括で変える方法
参考度:★★☆☆☆

VB6 と FlexGridでセルを結合(マージ)する方法
参考度:★☆☆☆☆

VB6 と FlexGridでCell(セル)内の文字の配置を設定する方法
参考度:★☆☆☆☆

VB6 と FlexGridで改行表示させる方法
参考度:★☆☆☆☆

VB6 & CrystalReport6で手動で積算合計を作る方法
参考度:★★★★★

VB6でIPアドレスを取得する方法
参考度:★★★★☆

VB6で文字数でなくバイト数で文字操作をする方法
参考度:★★☆☆☆

VB6での改行文字調査
参考度:★★☆☆☆

---------------------------------------------------------------------
その他

VB6での改行コード表示違い。XP , 2000

---------------------------------------------------------------------
Microsoft VB6 CrystalReport FlexGrid

2011年9月17日土曜日

VB6のvsFlexGridで複数選択したセルの色を一括で変える方法

FillStyleの値をデフォルトの flexFillSingle → flexFillRepeat
に変更するだけです。

使用例:
With vsFlexGrid
'複数選択モードにする
.FillStyle = flexFillRepeat
.Select row1, col1, row2, col2
.CellBackColor = &H80FFFF
'単体選択モードに戻す。
.FillStyle = flexFillSingle
End With


---------------------------------------------------------------------
Microsoft VB6 FlexGrid

VB6 と FlexGridでセルを結合する方法(マージ)

ヘルプより

機  能 内容の同じセル間のグリッド線を削除し、複数のセルを1つのセルにまとめます(マージします)。

書  式 [form.]FlexGrid.MergeCells[= Style%]

0 flexMergeNever        マージしない(デフォルト)
1 flexMergeFree         セル単位
2 flexMergeRestrictRows    行方向
3 flexMergeRestrictColumns  列方向
4 flexMergeRestrictAll      行と列
5 flexMergeFixedOnly      固定セルのみ
6 flexMergeSpill      隣へはみだす


MergeCellsプロパティを使って内容の同じセルを1つにまとめると、表が非常に見やすくなります。
セルをまとめる機能(マージ機能)を有効にするには、以下の設定が必要です。

1,MergeCellsプロパティを0以外の値に設定する。
2,マージしたい行や列のMergeRowプロパティやMergeColプロパティをTrueに設定する。
 (「6-隣へはみだす」を使用しているときには、最後の操作は必要ありません)

これで操作は完了です。指定した行や列のセルの内容が同じであれば、それらのセルは1つにまとめられ、セルの中身が変更された場合には、新しい内容に従ってセルが新たにまとめられます。

「0-マージしない」以外の値に設定すると、コントロール上の選択範囲はHighLightプロパティの設定値に関係なく常に非表示となります。これはマージしたセルの一部が選択範囲内に、残りは選択範囲外に分断されてしまう可能性があるためです。

設定値「Free(1)」と「Restricted(2、3、4のいずれか)」は、同一内容を持つセルをすべてマージするか(Free)、隣接するセルのみをマージするか(Restricted)という点で異なります。

「5-固定セルのみ」は、列(行)のタイトルだけをマージし、その列(行)のデータはマージしたくないときに便利です。

「6-隣へはみだす」は他の設定と少し異なっています。というのは、この設定だけはMergeColプロパティとMergeRowプロパティの設定を必要とせず、他と同じやり方ではセルをマージできないからです。その代わり、隣のセルが空である限り、長いエントリも隣のセルにはみ出して表示できます。この機能は、アウトラインを作成するときに非常に有効です。まず、グループのタイトルを表示できるだけの狭い列を作成しておき、必要に応じて右側のセルにはみ出して表示するように設定できるからです。

------------------------------------------------------
VB6 FlexGrid

VB6 と FlexGridでCell(セル)内の文字の配置を設定する方法

FlexGridで文字の配置を設定するには下記の通りでさる。

ヘルプより
機  能 カレントセルまたは指定範囲の
     セルのどの位置にデータを表示するかを設定します。

書  式 FlexGrid.CellAlignment[= Setting%]

設 定 値 整数型(列挙型)

      0 flexAlignLeftTop   左上
      1 flexAlignLeftCenter  左中央
      2 flexAlignLeftBottom  左下
      3 flexAlignCenterTop   中央上
      4 flexAlignCenterCenter 中央中央
      5 flexAlignCenterBottom 中央下
      6 flexAlignRightTop   右上
      7 flexAlignRightCenter 右中央
      8 flexAlignRightBottom 右下
      9 flexAlignGeneral    標準(デフォルト:
                    文字列の場合は左中央、数値の場合は右中央)

------------------------------------------------------
VB6 FlexGrid

VB6 と FlexGridで改行表示させる方法

VB6 と FlexGridで改行表示させる方法

FlexGridのプロパティの
WordWrapをTrueにするとセルの長さに合わせて改行される
※半角続きの場所では改行されないので注意が必要
セルのCol高さを大きくしないと改行された値は表示されない。

バージョンは下記の通り
 VS-FLEXGRID Pro Ver.6.0

------------------------------------------------------
VB6 FlexGrid

VB6 & CrystalReport6で手動で積算合計を作る方法

VB6.0およびCrystalReport6で
「グループごとにまとめて表示」にチェックを入れ、
積算合計フィールドを使用して合計表示を行うと
集計値がおかしくなる不具合がある。

その為、積算合計フィールドを使用する場合は
「グループごとにまとめて表示」するのをあきれめる必要があるが、
どうしても、見栄え等でグループの途中で改行が入るのが嫌な場合は、
別途、手動で積算合計をする必要がある。

無論、.NETおよび最新のCrystalReport(CR)に移行すれば問題無いと思われるが、
.NETに移行するにはマンパワーが足りないので現状は棚上状態なので…。

本題に戻して、
手動で積算合計を使用する場合は、
[レポートヘッダー]に変数宣言と初期化の処理を行う。

グループ毎の小計を出力する場合は
 [グループヘッダー]に小計の初期化の処理を入れる。
 (小計が必要ない場合は省略可能)

[詳細]で小計及び総計の演算処理を行う。

[グループフッター]に小計表示の数式を配置
 (小計が必要無い場合は省略可能)

[レポートフッター]に総計表示の数式を配置

※①~⑤はすべて式フィールドで作成し各場所に配置する。
※[ページヘッダー]および[ページフッター]は使用しない。


使用例は下記の通りです。
----------------------------------------------------------------------------

①[レポートヘッダー]
 総計変数宣言 ←式の名前

 ↓式の内容はここから -----------------------------------------------------
  Shared numberVar TOTAL :=0 ; ←変数宣言および初期化
  "";              ←空白の文字列を返す
                  (レポート上に何も表示させない為)
 ↑式の内容ここまで -------------------------------------------------------

 [レポートヘッダー]上の好きな所に総計変数宣言を配置する。

②[グループヘッダー]
 小計変数宣言 ←式の名前

 ↓式の内容はここから -----------------------------------------------------
  Shared numberVar SUBTOTAL :=0 ; ←変数宣言および初期化
  "";               ←空白の文字列を返す
                    (レポート上に何も表示させない為)
 ↑式の内容ここまで ------------------------------------------------------
 
 [グループヘッダー]上の好きな所に総計変数宣言を配置する。

③[詳細]
 演算処理 ←式の名前

 ↓式の内容はここから -----------------------------------------------------
 Shared NumberVar TOTAL;      ←変数宣言のみ
 Shared NumberVar SUBTOTAL ;    ←変数宣言のみ

 WhilePrintingRecords;       ←書いていた方が良い(動作内容はヘルプで)
 TOTAL:= TOTAL+{指示書.数量};    ←総計の足し込み処理
 SUBTOTAL:= SUBTOTAL+{指示書.数量}; ←小計の足し込み処理

 "";                ←空白の文字列を返す
                    (レポート上に何も表示させない為)
 ↑式の内容ここまで -------------------------------------------------------
 ※{指示書.数量}はレポート上の数量の意味

 [詳細]上の好きな所に総計変数宣言を配置する。

④[グループフッター]
 HSUBTOTAL ←式の名前

 ↓式の内容はここから -----------------------------------------------------
 Shared NumberVar SUBTOTAL ;    ←変数宣言のみ

 SUBTOTAL;             ←小計を表示する
 ↑式の内容ここまで ------------------------------------------------------

 [グループフッター]の小計を表示させたい場所に配置する。

⑤[レポートフッター]
 HTOTAL ←式の名前

 ↓式の内容はここから -----------------------------------------------------
 Shared NumberVar TOTAL ;      ←変数宣言のみ

 TOTAL;               ←総計を表示する
 ↑式の内容ここまで ------------------------------------------------------

 [レポートフッター]の総計を表示させたい場所に配置する。
----------------------------------------------------------------------------

VB6 Crystal Report

2011年9月16日金曜日

VB6でIPアドレスを取得する方法

IPアドレスを取得するには下記の通りですある。

' 前処理----------------------------------------------------
Option Explicit

Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription As String * 257
szSystemStatus As String * 129
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type

Private Type hostent
h_name As Long
h_aliases As Long
h_addrtype As Integer
h_length As Integer
h_addr_list As Long
End Type

Private Declare Sub vbMemMove1 Lib "kernel32" Alias "RtlMoveMemory" & _
(dst As Any, ByVal src As Long, ByVal num As Long)
Private Declare Sub vbMemMove2 Lib "kernel32" Alias "RtlMoveMemory" & _
(dst As Long, ByVal src As Long, ByVal num As Long)

Private Declare Function gethostname Lib "wsock32.dll" & _
(ByVal Name As String, ByVal namelen As Long) As Long
Private Declare Function gethostbyname Lib "wsock32.dll" (ByVal Name As String) As Long
Private Declare Function WSAStartup Lib "wsock32.dll" & _
(ByVal wVersionRequested As Integer, lpWSAData As Any) As Long
Private Declare Function WSACleanup Lib "wsock32.dll" () As Long
Private Declare Function WSAGetLastError Lib "wsock32.dll" () As Integer
' 前処理 ここまで-------------------------------------------------


' IPアドレスを取得----------------------------------------------------
Public Function GetIpAddress() As String

Dim wsa As WSADATA
Dim sName As String * 65
Dim he As hostent
Dim p As Long
Dim b(3) As Byte

If WSAStartup(&H101, wsa) <> 0 Then Exit Function

If gethostname(sName, 64) = 0 Then
p = gethostbyname(sName)
If p <> 0 Then
vbMemMove1 he, p, 16
vbMemMove2 p, he.h_addr_list, 4
vbMemMove1 b(0), p, 4
GetIpAddress = b(0) & "." & b(1) & "." & b(2) & "." & b(3)
End If
End If

WSACleanup

End Function
'-----------------------------------------------------------------------
VB6 IPアドレス

VB6で文字数でなくバイト数で文字操作をする方法

通常のMid()、Left(),Right()関数ではバイト数に関係なく、文字数で文字操作が行われてします。
半角(1バイト)、全角(2バイト)の区別ありません。

バイト単位で文字操作を行いたい場合は、MidB(),LeftB(),RightB()を使用します。
ただ、MidB()関数は通常通り使用できません。
一旦 、StrConvでvbFromUnicodeに変換して仕様します。
使用方法は下記の通りです。
StrConv(MidB(StrConv(."ブログF2", vbFromUnicode), 1, 6), vbUnicode)
※ブログがかえされる。

---------------------------------------------------------------------------
Mid()関数とMidB()関数の違い

Dim astr as String

astr = "ブログはFC2"

MsgBox Mid(astr,1,6) '「ブログはFC」と表示される
MsgBox StrConv(MidB(StrConv(astr, vbFromUnicode), 1, 6), vbUnicode)
'「ブログ」と表示される

'※MidBを使用する場合はStrConvを使用してvbFromUnicodeに変換する必要があります。
'  ただし、vbFromUnicodeのままでは文字化けするので、
'  再度、StrConvを使用して vbUnicodeにする必要があります。
'  LenB()、RightB()関数の使用方法も同様です

---------------------------------------------------------------------------
補足
バイト単位の文字数の確認はLenB()関数を使用します。

使用方法は

LenB(StrConv("ブログはFC2", vbFromUnicode)) ' 11 がかえされる

Len("ブログはFC2") '7 がかえされる

---------------------------------------------------------------------------

VB6 関数

2011年9月12日月曜日

VB6での改行コード表示違い。XP , 2000

VB6においてWINDOWS XPと2000によって
vsFlexArray(vsFlexGrid)上の改行コードの表示が違います。

表示が違うというか、XPの場合は改行コードを表示しません。
よって改行コードが入っているかどうか確認できません。
WINDOWS 2000の場合は下記のような表示になります。
[・ABCDE]
[・XYZXA]
改行が[・]で表示されますが、
WINDOWS XPの場合は
[ABCDE]
[XYZXA]
となにも表示されないので、改行が入っているかどうか分からないので、
帳票のよっては先頭に改行が入って入るために表示されない不具合が発生します。

WINDOWS 2000の場合は [・]が表示されるため、画面上でおかしいなと分かるのですが、
XPの場合は[・]が表示されないため、マスター上は問題無いのに帳票に表示されないのはなぜ?
っとなってしまいました。

2000では[・]でおかしいと判断できるので、ユーザー側でかって修正するのですが、
XPではユーザー側で不具合箇所が特定できないため、連絡が入ります。
VBの開発環境はWINDOWS 2000のままなので、たまたま発覚しましたが・・・。

不具合の回避策を色々と探したのですが、
改行を[・]と表示する WINDOWS 2000自体がバグである為、
XPで[・]表示することは不可能でした。

よって、取りあえずの回避策として以下の2点の実施です。
・先頭に改行が入る場合は、ExcelからvsFlexArrayに貼付けを行なった場合に発生。
 よって、貼付けを行なう時に先頭に改行コードが入って入れば削除して貼付けを実施
VB6での改行文字調査
・現状、改行が先頭に入っているのを確認する為、SQL文を発行し該当分を修正
 SQLでの改行文字調査

で、取りあえずは回避です。

XPと2000では微妙に動きが違ったりと修正が必要だったりします。

.NETに移行もしたいのですが、マンパワーが圧倒的に足りません。

------------------------------------------------------
VB6 FlexArray 改行

VB6での改行文字調査

VB6での改行文字を指定する方法は、下記の通りです。

アスキーコードに変換して調べます。
改行コードはアスキーコードで 10 となります。

If  Asc(left(文字列, 1)) >= 10 Then
   MsgBox "改行コードです。"
End If


例は一文字目に改行コードが入っている場合です。

Microsoft VB6