DOBON.NET DOBON.NETプログラミング掲示板過去ログ

クエリデザイナみたいなもの

環境/言語:[windows XP Visual Studio 2010 pro]
分類:[.NET]

はじめまして。レオパーです。

現在C#のWindows FormでAccessのクエリデザイナのような
UIのアプリを作ろうとしています。

しかし、どのように実現すればいいのか見当もつかず困っています。

何かヒントになるようなキーワードだけでもいいので
分かる方がいらっしゃれば教えて頂けないでしょうか?
■No29155に返信(レオパーさんの記事)

まずは1テーブルの単純Selectからどのように実装するか
考えてみてはどうでしょう?
質問がざっくりしすぎていてすいません。
聞きたかったのは以下です。

クエリデザイナでいうと追加したテーブル単位に
カラム名のリストボックスみたいなオブジェクトができて
マウスで移動させたり、大きさを変えたりできますよね?

あれって、どうやって作ればいいのですかね?

MDIフォームでやればいいのかな?
■No29161に返信(レオパーさんの記事)

> クエリデザイナでいうと追加したテーブル単位に
> カラム名のリストボックスみたいなオブジェクトができて
> マウスで移動させたり、大きさを変えたりできますよね?
>
> あれって、どうやって作ればいいのですかね?
>
> MDIフォームでやればいいのかな?
MDIでもSDIでもかまわないと思いますが、それぞれのカラムリストをフォーム
にすれば出来ないことはないです。Join時の線をどう表現するかですね。
■No29155に返信(レオパーさんの記事)
> 現在C#のWindows FormでAccessのクエリデザイナのような
> UIのアプリを作ろうとしています。

[A5:SQL Mk-2] http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/
[黒猫 SQL Studio] http://kuronekosoft.ewinds.net/sqlstudio.aspx

などのクエリデザイナーは、下記を利用しているようです。
http://www.activequerybuilder.com/
■No29164に返信(shuさんの記事)

やっぱりあれはFormでやってるんですかね?
全然別ソフトですがObject Browser ERとかはどうやってるんでしょうかね?
■No29165に返信(魔界の仮面弁士さんの記事)

返信ありがとうございます。
サードパーティのコントロールがあるんですね。

やはり自作は難しいのかなー
■No29167に返信(レオパーさんの記事)
> サードパーティのコントロールがあるんですね。
作図なら Visio VBA という話もありますが、
Visio ユーザーはそれほど多く無さそうですね。

> やはり自作は難しいのかなー
難しいと感じているのは、どの部分でしょうか?

クエリ解析? タイトルバー付きリストボックス?
ドラッグアンドドロップ? 描画処理?

わかる範囲でプロトタイプを作ってみて、その上で
どの部分で詰まってしまっているのかを投稿した方が、
具体的なアドバイスが得られるかと思います。


ただ、先のようなコントロール製品が自動的にやってくれることを
自分で作りこもうとすれば、それなりの手間はかかってしまうでしょう。


もっとも、ツールを使っただけで、すべての作りこみが
単純化されるかどうかは別問題ですけれどね。たとえば
RichTextBox を使ってワードパッド相当の機能を作りこむ場合でさえ、
いろいろとコードが必要になってきたりしますし。
■No29168に返信(魔界の仮面弁士さんの記事)

> 難しいと感じているのは、どの部分でしょうか?
>
> クエリ解析? タイトルバー付きリストボックス?
> ドラッグアンドドロップ? 描画処理?

プロトを作るにしても技術的にどのようにすればよいかが
スキル不足で分からないのです。

クエリデザイナでいうと追加したテーブル単位に
カラム名のリストボックスみたいなオブジェクトができて
マウスで移動させたり、大きさを変えたりできますよね?

あれって、どうやって作ればいいのですかね?

MDIフォームでやればいいのでしょうかね?

MDIの子フォームにMDIフォームを入れるとかできるのでしょうか?

それとも魔界の仮面弁士さんが仰られているように
ユーザコントロールでリストボックスを拡張したようなものを
作成して動的に動かすのでしょうか?
■No29172に返信(レオパーさんの記事)
> MDIフォームでやればいいのでしょうかね?
SDI で良いと思いますよ。
MDI フォームだと、むしろ制御しにくい気がしますし。
(クエリデザイナの個々のリストは、フォームではありません)

で、まずはこういう画面を作りたいのかな…と予想。
http://hanatyan.sakura.ne.jp/samplepic/vb6_151.htm


上記画像は VB6 のものですが、VB.NET だとこんな感じかな。

Partial Public Class Form1
    Inherits Form

    Private WithEvents ListBox1 As ListBox
    Private WithEvents ListBox2 As ListBox
    Private WithEvents ListBox3 As ListBox
    Private WithEvents ListBox4 As ListBox
    Private WithEvents ListBox5 As ListBox
    Private WithEvents ListBox6 As ListBox
    Public Sub New()
        InitializeComponent()
        Me.ListBox1 = New ListBox()
        Me.ListBox2 = New ListBoxEx(ListBoxEx.CaptionStyle.Normal, "可変サイズ", True)
        Me.ListBox3 = New ListBoxEx(ListBoxEx.CaptionStyle.Normal, "固定サイズ", False)
        Me.ListBox4 = New ListBoxEx(ListBoxEx.CaptionStyle.ToolTitle, "可変ツール", True)
        Me.ListBox5 = New ListBoxEx(ListBoxEx.CaptionStyle.ToolTitle, "固定ツール", False)
        Me.ListBox6 = New ListBoxEx(ListBoxEx.CaptionStyle.None, Nothing, True)

        Me.ListBox1.Items.Add("通常版")
        Me.ListBox2.Items.AddRange("可変,タイトルあり".Split(","c))
        Me.ListBox3.Items.AddRange("固定,タイトルあり".Split(","c))
        Me.ListBox4.Items.AddRange("可変,ツールタイトル".Split(","c))
        Me.ListBox5.Items.AddRange("固定,ツールタイトル".Split(","c))
        Me.ListBox6.Items.Add("リサイズ可能")

        Me.ListBox1.Location = New Point(0, 0)
        Me.ListBox2.Location = New Point(140, 0)
        Me.ListBox3.Location = New Point(0, 120)
        Me.ListBox4.Location = New Point(140, 120)
        Me.ListBox5.Location = New Point(0, 240)
        Me.ListBox6.Location = New Point(140, 240)

        Controls.Add(Me.ListBox6)
        Controls.Add(Me.ListBox5)
        Controls.Add(Me.ListBox4)
        Controls.Add(Me.ListBox3)
        Controls.Add(Me.ListBox2)
        Controls.Add(Me.ListBox1)
    End Sub
End Class

Partial Public Class ListBoxEx
    Inherits ListBox

    Public Enum CaptionStyle
        None
        Normal
        ToolTitle
    End Enum

    Private _captionType As CaptionStyle
    Private _caption As String
    Private _resizable As Boolean

    Public Sub New(ByVal style As CaptionStyle, ByVal caption As String, ByVal resizable As Boolean)
        _captionType = style
        If style = CaptionStyle.None Then
            _caption = Nothing
        Else
            _caption = caption
        End If
        _resizable = resizable
    End Sub

    Protected Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim p As CreateParams = MyBase.CreateParams
            Select Case _captionType
                Case CaptionStyle.Normal
                    p.Caption = _caption
                    p.Style = p.Style Or WindowStyles.WS_CAPTION Or WindowStyles.WS_BORDER
                Case CaptionStyle.ToolTitle
                    p.Caption = _caption
                    p.Style = p.Style Or WindowStyles.WS_CAPTION
                    p.ExStyle = p.ExStyle Or WindowStylesEx.WS_EX_TOOLWINDOW
                Case Else
                    p.Style = p.Style And Not WindowStyles.WS_CAPTION And Not WindowStyles.WS_BORDER
                    p.Caption = Nothing
            End Select
            If _resizable Then
                p.Style = p.Style Or WindowStyles.WS_THICKFRAME
            Else
                p.Style = p.Style And Not WindowStyles.WS_THICKFRAME
            End If
            Return p
        End Get
    End Property

    'https://sites.google.com/site/autohotkeyjp/reference/misc/Styles
    <Flags()> Private Enum WindowStyles
        WS_BORDER = &H800000
        WS_POPUP = &H80000000
        WS_CAPTION = &HC00000
        WS_DISABLED = &H8000000
        WS_DLGFRAME = &H400000
        WS_HSCROLL = &H100000
        WS_MAXIMIZE = &H1000000
        WS_MAXIMIZEBOX = &H10000
        WS_MINIMIZE = &H20000000
        WS_MINIMIZEBOX = &H20000
        WS_OVERLAPPED = &H0
        WS_OVERLAPPEDWINDOW = &HCF0000
        WS_POPUPWINDOW = &H80880000
        WS_SIZEBOX = &HF2C0
        WS_SYSMENU = &H80000
        WS_THICKFRAME = &H40000
        WS_VSCROLL = &H200000
        WS_VISIBLE = &H10000000
        WS_CHILD = &H40000000
        WS_GROUP = &H20000
    End Enum

    <Flags()> Private Enum WindowStylesEx
        WS_EX_DLGMODALFRAME = &H1
        WS_EX_NOPARENTNOTIFY = &H4
        WS_EX_TOPMOST = &H8
        WS_EX_ACCEPTFILES = &H10
        WS_EX_TRANSPARENT = &H20
        WS_EX_MDICHILD = &H40
        WS_EX_TOOLWINDOW = &H80
        WS_EX_WINDOWEDGE = &H100
        WS_EX_CLIENTEDGE = &H200
        WS_EX_CONTEXTHELP = &H400
        WS_EX_RIGHT = &H1000
        WS_EX_LEFT = &H0
        WS_EX_RTLREADING = &H2000
        WS_EX_LTRREADING = &H0
        WS_EX_LEFTSCROLLBAR = &H4000
        WS_EX_RIGHTSCROLLBAR = &H0
        WS_EX_CONTROLPARENT = &H10000
        WS_EX_STATICEDGE = &H20000
        WS_EX_APPWINDOW = &H40000
        WS_EX_OVERLAPPEDWINDOW = &H300
        WS_EX_PALETTEWINDOW = &H188
        WS_EX_LAYERED = &H80000
    End Enum

End Class
■No29177に追記(魔界の仮面弁士の記事)
> 上記画像は VB6 のものですが、VB.NET だとこんな感じかな。

別案。

先のコードは、ListBox にタイトルバーやリサイズ枠を付ける手法ですが、
こちらは、ListBoxを貼ったフォームを、フォーム内に貼る方法です。

このサイト(dobon.net)でも紹介されている手法ですね。
http://dobon.net/vb/dotnet/form/formwithinform.html


Partial Public Class Form1
    Inherits Form

    Private list As New List(Of ChildForm)()
    Public Sub New()
        InitializeComponent()
        For y As Integer = 0 To 2
            Dim f As New ChildForm()
            f.Location = New Point(10, 10 + y * 120)
            f.Size = New Size(100, 100)
            f.Name = String.Format("Child{0}", y)
            f.Text = f.Name
            list.Add(f)
            Controls.Add(f)
            f.Show()
        Next
    End Sub
End Class

Partial Public Class ChildForm
    Inherits Form
    Private WithEvents ListBox1 As New ListBox()
    Public Sub New()
        TopLevel = False
        StartPosition = FormStartPosition.Manual
        FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow
        ListBox1.Dock = DockStyle.Fill
        ListBox1.IntegralHeight = False
        Controls.Add(ListBox1)
    End Sub
End Class
■No29178に返信(魔界の仮面弁士さんの記事)

ありがとうございます。
サンプルソースまで頂いて申し訳ないです。

だいぶ光が見えてきたので、後は自分で何とかやってみようと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板