[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/11/18(Thu) 21:13
投稿者名:太一
Eメール:
URL :
タイトル:
変数に設定する特定の文字に色を付ける
データベースから取得した値を、変数にデータを設定して
コンボボックスに表示しています。

そこで、変数に設定した特定の文字のみを赤色にして表示
したいのですが、そのようなことは可能なのでしょうか。

DEL_DATE の日付の値をに色をつけたいのですが。

Dim objSess         As Object
Dim objDb           As Object
Dim objDs           As Object
Dim objCol          As Object
Dim str_SQL         As String
Dim I               As Integer
Dim Entry           As String

    データベースから取得処理

    Do Until objDs.EOF
       If Not IsNull(objDs("TO_CHAR(DEL_DATE,'YYYY/MM/DD')")) Then
           Entry = objDs("NAMAE").Value & " (" & objDs("TO_CHAR(DEL_DATE,'YYYY/MM/DD')") & ")"
       Else
           Entry = objDs("NAME").Value
       End If
       Combo1.AddItem Entry, I
       objDs.DbMoveNext
       I = I + 1
    Loop

投稿時間:2004/11/19(Fri) 06:46
投稿者名:jikoryuu
Eメール:
URL :
タイトル:
Re: 特定の文字
>特定の文字〜
ここが良く解らないのですが、コンボボックスリストから選択後のテキスト部全体の事でしょうか?
それなら、ChengeやClickイベント時にチェックしてForeColorを変更すれば出来ます。ただし、リストをドロップダウンした時にはリスト全体の文字の色はそのままですから、元の黒に戻すなどの処理をした方が良いでしょう。

コンボボックスのテキスト中の一部の色を変更する場合はかなり大変です。
ピクチャボックスに文字に色をつけて描画したものをコンボボックスの上に貼り付ける方法が簡単な方法だと思います。当然この方法はZOrderまたはVisibleで表示を切り替える処理が必要となります。ドロップダウン時のリストにも対応するならほとんどコントロールを自作することと同じくらい大変でしょうね。

もっと簡単にリスト項目を目印の代わりに使うと言う目的なら、イメージコンボでアイコンの切り替えで表現する方法もあるかと思います。

投稿時間:2004/11/20(Sat) 01:35
投稿者名:太一
Eメール:
URL :
タイトル:
Re^2: 特定の文字
データベースから名前と削除日を取得し、両方の値を
Combo1.AddItem にセットし、コンボックスに表示して
います。

Combo1.AddItem には、2つの値を&でくっけてセット
できないので、変数に一度入れてからセットしています。

特定の文字というのは、削除日が取得でき場合、削除日
に色をつけて、コンボックス上に表示したいのですが、
その方法を教えて頂きたいのです。

投稿時間:2004/11/20(Sat) 10:26
投稿者名:jikoryuu
Eメール:
URL :
タイトル:
リストビューとリッチテキストボックスを使用できるのなら
そのような標準でできない処理をする場合には、自作するのが基本です。
この場合はなんちゃってコンボボックスを作成します。
しかし作成できるからといって、度を越すとメンテナンスが大変なので、
あまり複雑になりすぎる事はあきらめることも大切なことも付け加えておきます。

この場合は、業務などで実装ギリギリの機能なのでサンプルをご覧になってください。

新しいプロジェクトに通常フォームとその上に
Combo1つ、RichTextBox1つ、Command1つ、ListView1つを貼り付けてください。
そのごサンプルコードを貼り付けてください。
また、サイズ調整などは自分で行ってください。

Private Sub Command1_Click()
  Dim oli As ListItem
  Dim oSi As ListSubItem
  Dim c1 As Single
  Dim c2 As Single
  Dim f As Single
  Dim i As Long
  With ListView1
    Combo1.Clear
    .ListItems.Clear
    f = Font.Size
    Font.Size = .Font.Size
    For i = 1 To 10
      Set oli = .ListItems.Add(, , "name1")
      If c1 < TextWidth(oli.Text) Then c1 = TextWidth(oli.Width)
      Set oSi = oli.ListSubItems.Add(, , Format(Now() + i, "yyyy/mm/dd"))
      oSi.ForeColor = vbRed
      If c2 < TextWidth(oSi.Text) Then c2 = TextWidth(oSi.Text) + 175
      If oli.Text & " " & oSi.Text = RichTextBox1.Text Then
        oli.Selected = True
      End If
      Combo1.AddItem oli.Text & " " & oSi.Text
    Next
    .ColumnHeaders(1).Width = c1 - 75
    .ColumnHeaders(2).Width = c2
    .Height = (i - 1) * .ListItems(1).Height
    Font.Size = f
    .Visible = True
    On Error Resume Next
    .SetFocus
  End With
End Sub

Private Sub Form_Load()
  With ListView1
    .BorderStyle = ccNone
    .View = lvwReport
    .FullRowSelect = True
    .GridLines = False
    .HideColumnHeaders = True
    .LabelEdit = lvwManual
    .Top = 1200
    .Left = 240
    .Visible = False
  End With
  With RichTextBox1
    .Left = 210
    .Top = 870
    .Width = 2745
    .Height = 345
  End With
  With Command1
    .Left = 2670
    .Top = 915
    .Width = 255
    .Height = 255
    .ZOrder 0
  End With
  With Combo1
    .Left = 1
    .Top = 300
    .Width = 2745
    .Height = 300
  End With
  Command1_Click
  ListView1.Visible = False
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  ListView1_LostFocus
End Sub

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
  RichTextBox1.Text = Item.Text & " " & Item.ListSubItems(1).Text
End Sub

Private Sub ListView1_LostFocus()
  ListView1.Visible = False
  RichTextBox1.SetFocus
End Sub

Private Sub ListView1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  ListView1_LostFocus
End Sub

Private Sub RichTextBox1_Change()
  Dim s As String
  Dim i As Long
  Dim j As Long
  With RichTextBox1
    s = .Text
    j = .SelStart
    .SelStart = 0
    .SelLength = Len(s)
    .SelColor = vbBlack
    .SelStart = j
    If s <> "" Then
      i = InStr(1, s, " ")
      If i > 0 Then
        .SelStart = i
        .SelLength = Len(s) - i
        .SelColor = vbRed
        .SelStart = j
      End If
    End If
  End With
End Sub

投稿時間:2004/11/20(Sat) 10:42
投稿者名:jikoryuu
Eメール:
URL :
タイトル:
Re: リストビューとリッチテキストボックスを使用できるのなら
修正です。
Form_Loadイベントに以下のコードを追加てください。

Command1.Font.Name = Marlett
Command1.Caption = 6
ListView1.ZOrder 0

投稿時間:2004/11/20(Sat) 12:07
投稿者名:太一
Eメール:
URL :
タイトル:
Re^2: リストビューとリッチテキストボックスを使用できるのなら
ありがとうございます。

Form_Loadイベントの
  With Combo1
    .Left = 1
    .Top = 300
    .Width = 2745
    .Height = 300
  End With
で、「実行時エラー383: Heightプロパティは値の取得のみ可能です。」
が表示されます。

Command1_Click()イベントの
  With ListView1
    .ColumnHeaders(1).Width = c1 - 75
    .ColumnHeaders(2).Width = c2
  End With
で、「実行時エラー35600: インデックスが範囲を超えています。」
が表示されます。

エラーになった箇所をコメントにして実行すると起動されのですが
Combo1とRichTextBox1が表示されます。

Combo1には、namae1と日付が表示されるのですが、色が付いていません。
RichTextBox1の右側に数字の「6」が表示され押下すると箱みたいなのが
表示されます。

そもそも、RichTextBox1、ListView1をどのよに使うのか理解していない
のもありますが、ご教授願います。

投稿時間:2004/11/20(Sat) 15:35
投稿者名:jikoryuu
Eメール:
URL :
タイトル:
Re^3: リストビューとリッチテキストボックスを使用できるのなら
これは失礼しました。不注意で一部のプロパティ設定を記載するのを忘れていたようです。
基本的な機能についてはヘルプやWeb等で調べてください。

以下の2つのイベントのコードを置き換えてください。

Private Sub Command1_Click()
  Dim oli As ListItem
  Dim oSi As ListSubItem
  Dim c1 As Single
  Dim c2 As Single
  Dim f As Single
  Dim i As Long
  With ListView1
    Combo1.Clear
    .ListItems.Clear
    f = Font.Size 'テキストの幅を取得する為、Formのフォントを変更(後に元に戻します。)
    Font.Size = .Font.Size
    For i = 1 To 10
      'リストビューにリストを追加します。ここではテキストの最大幅に合わせていますが、
      'テキスト幅を固定することができる場合などは調整してください。
      'この場合、プロパティで予め設定しておくことができます。
      'その場合は、ループ終了後の幅設定は必要ありません。
      Set oli = .ListItems.Add(, , "name1")
      If c1 < TextWidth(oli.Text) Then c1 = TextWidth(oli.Width)
      Set oSi = oli.ListSubItems.Add(, , Format(Now() + i, "yyyy/mm/dd"))
      oSi.ForeColor = vbRed
      If c2 < TextWidth(oSi.Text) Then c2 = TextWidth(oSi.Text) + 175
      If oli.Text & " " & oSi.Text = RichTextBox1.Text Then
        oli.Selected = True
      End If
      Combo1.AddItem oli.Text & " " & oSi.Text
    Next
    '上で述べている幅設定
    .ColumnHeaders(1).Width = c1 - 75
    .ColumnHeaders(2).Width = c2
    'リストアイテム数により高さを調節しています。
    '大きくなりすぎる場合はiが一定以上の行数にならないようにしてください。
    .Height = (i - 1) * .ListItems(1).Height
    Font.Size = f 'Formのフォントサイズを元に戻します。
    .ZOrder 0 '最前面にします。
    .Visible = True
    On Error Resume Next
    .SetFocus
  End With
End Sub

Private Sub Form_Load()
  With ListView1
    .BorderStyle = ccNone
    .View = lvwReport     'レポート形式(詳細表示)
    .FullRowSelect = True '行全体を選択
    .GridLines = False    '境界線を表示しない
    .HideColumnHeaders = True 'カラムヘッダ(列見出し)を表示しない
    .LabelEdit = lvwManual 'リストアイテム編集を手動()で指示する
    .ColumnHeaders.Add , , "" 'カラムヘッダ(列見出し)の追加
    .ColumnHeaders.Add , , "" 'もうひとつ追加
    .Top = 1200
    .Left = 240
    .Visible = False
  End With
  With RichTextBox1
    .Left = 210
    .Top = 870
    .Width = 2745
    .Height = 345
  End With
  With Command1
    .Left = 2670
    .Top = 915
    .Width = 255
    .Height = 255
    .Font.Name = "Marlett" 'Windowsのコントロール用フォント
    .Caption = 6 'コンボボックスのボタンの逆三角
    .ZOrder 0
  End With
  With Combo1
    .Left = 210
    .Top = 300
    .Width = 2745
  End With
  Command1_Click
  ListView1.Visible = False
End Sub

投稿時間:2004/11/21(Sun) 13:08
投稿者名:太一
Eメール:
URL :
タイトル:
ありがとうございます。
ありがとうございます。

サンプルコード確認しました。
動きました。

これを元に、サンプルコードを理解しながら、組み込んで見たいと思います。

ありがとうございます。