ごみばこ

プログラムに関する備忘録などを書いています。

Listのあれこれ

最近になってJavaを勉強し始めました。
C#ではList< int >と宣言してたところ、 Javaでも同様に宣言しようとすると出来ない…。

どうやらプリミティブ型のリストは生成出来ないようなので、
以下の様に宣言しないといけない。

import java.util.ArrayList;

class Main
{
    public static void main(String[] args)
    {
        ArrayList<Integer> l = new ArrayList<Integer>();
    }
}

また、整数値型でArrays.asList(array)を使用する場合には、
Integerで配列を宣言する必要がある。

import java.util.Arrays;
import java.util.List;

public class Main
{
    public static void main(String[] args)
    {
        Integer[] a = { 0, 1 };
        List<Integer> l = Arrays.asList(a);
    }
}

競プロを始めました。

長いことサボってしまいました…。

自宅でプログラムする機会を増やそうと思い始めてみました。
問題を解くためのプログラムなので、普段書くものと違い新鮮でした。
解法を知っていないと解けない問題もあるので、勉強しないとダメですね…。

poiで苦戦した話

.foreachで取得したアドレスをpoiに渡すときは、半角スペースを入れないといけないらしい。 これがわからずに10分くらい悩んでました(;´・ω・)

.foreach (Variable {!dumpheap -mt 7259f7a4 -short}) {.printf "%ly\n", poi(Variable + 0x8) + c} ↑ こう書くとCouldn't resolveとエラーが出力される。

.foreach (Variable {!dumpheap -mt 7259f7a4 -short}) {.printf "%ly\n", poi( Variable + 0x8) + c} ↑ Variableの前にスペースを挿入すれば問題なく出力されました。

これでまとめて値を確認するのが捗るぞーー

Dockプロパティを作ってみた

前回の続き。

まずはコントロールを作るところから。
テキストを足しただけです。後少し大きくなってます。
以下が画像とソース。
f:id:choco_0214:20161120111029p:plain

Imports System.Windows.Forms
Imports System.Text

''' <summary>
''' ボタンテキストとToolTipを追加したDockEditor UIです。
''' </summary>
Public Class MyDockEditorUI

    ''' <summary>
    ''' ToolTip用のテキスト。
    ''' </summary>
    Private _strTip As New StringBuilder

    Private _dockStyle As DockStyle
    ''' <summary>
    ''' DockStyleの値を取得または設定します。
    ''' </summary>
    Public Property [DockStyle]() As DockStyle
        Get
            Return _dockStyle
        End Get
        Set(ByVal value As DockStyle)
            _dockStyle = value
        End Set
    End Property

    Private _buttonInfo As New Dictionary(Of Button, DockStyle)
    ''' <summary>
    ''' ButtonコントロールとDockStyleのコレクションを取得します。
    ''' </summary>
    Public ReadOnly Property ButtonInfo() As Dictionary(Of Button, DockStyle)
        Get
            Return _buttonInfo
        End Get
    End Property

    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
       
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        For Each item As Control In Me.Controls
            Me.SetButtonSettings(item)
        Next

    End Sub

    ''' <summary>
    ''' ボタンクリック時のイベント。
    ''' </summary>
    Private Sub ButtonClick(ByVal sender As Object, ByVal e As EventArgs)

        Dim clickedButton As Button = DirectCast(sender, Button)

        Me._dockStyle = DirectCast(CInt(clickedButton.Tag), DockStyle)

    End Sub

    ''' <summary>
    ''' 各Buttonコントロールにイベントを設定します。
    ''' </summary>
    Private Sub SetButtonSettings(ByVal control As Control)

        If Me.CheckIfButton(control) Then
            Me._buttonInfo.Add(control, control.Tag)
            Me.SetToolTipToButton(control)
            AddHandler control.Click, AddressOf Me.ButtonClick
        End If

    End Sub

    ''' <summary>
    ''' 渡されたControlがButtonコントロールか判別します。
    ''' </summary>
    Private Function CheckIfButton(ByVal control As Control) As Boolean

        If TypeOf control Is Button Then Return True

        Return False

    End Function

    ''' <summary>
    ''' 各Buttonコントロールにツールチップを設定します。
    ''' </summary>
    Private Sub SetToolTipToButton(ByVal control As Control)

        Me._strTip.Length = 0

        If DirectCast(CInt(control.Tag), DockStyle) <> DockStyle.None Then
            With Me._strTip
                .Append("This control docking ")
                .Append(control.Text)
                .Append(".")
            End With

        Else
            Me._strTip.Append("This control isn't docking.")

        End If

        Me.tipButtonText.SetToolTip(control, Me._strTip.ToString())

    End Sub

End Class

プロパティのドロップダウンは一度生成する処理が入っているので、
コンストラクタで必要な情報と処理をDictionaryに渡しています。

あまりスマートな書き方じゃないかもしれませんが、
100行程度に収まってるのでよしとしてます。。

次回はUITypeEditor側の内容を書こうと思います。

Dockプロパティを変えてみる。

来月がもう12月とは、1年って早いですね。
あまり成長しているようには感じませんorz

コントロールのプロパティを触っていて、
「Dockプロパティもう少し何とかならんか?」
と感じることがあります。

何故、ボタンテキストを省いたのだろうか。
あった方が視覚的にわかりすいと思うのですが。

調べてみたところ、プロパティ1つ変えるにも割と面倒。
差し替え用のコントロールを作ったり、
プロパティ欄に表示させるためのクラスを用意したり。。。

最低限、UITypeEditorとIWindowsFormsEditorServiceは調べないといけない。
プロパティの表示方法もカスタマイズするなら、TypeConverterも必要。

コードは次回以降少しずつ載せていこうと思います。

・参考にしたサイト(MSDNは省略)
qiita.com

独自のプロパティエディタ作成(ダイアログボックス形式): C#研究所

RGB⇒HSV(HSB)に変換する

RGBの値を変えるのに必死で変換処理探して書いていました( ^ω^)・・・
そんな必要なんてなかった…

Color構造体に変換メソッドが用意されています。

・色相を求める
 System.Drawing.Color.GetHue()

・彩度を求める
 System.Drawing.Color.GetSaturation()

・明度を求める
 System.Drawing.Color.GetBrightness()

C#の場合はfloat、VBの場合はSingle型で値が返却されます。

輝度を求めたい場合は残念ながらメソッドが用意されていません。
まだ試していませんが、下記のURLが参考になりそうです。
英語は読めないですが、同等の式があるのでおそらく求めることが出来るでしょう。


ofo.jp
HSL and HSV - Wikipedia

カスタムコントロールを作ってみよう! その1

投稿をサボっていました。。。

今回は簡単なコントロールの作成です。

.NETのコンポーネントには予め便利なものばかりですが、
少し手を加えたコントロールが作りたい場合もあります。
そういう時にカスタムコントロールの作成が役立ちます。

今回作成するものは、数値のみが入力できるテキストボックス。
使用する開発環境はWindows10, Visual Studio2015です。

まずはソリューションエクスプローラーのプロジェクト名を右クリック。
「追加」から「コンポーネント」を選択します。

名前はExTextBoxにしました。以下がコード。
良い書き方ではないと思いますが…。

Public Class ExTextBox
    Inherits TextBox

    Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)

        Select Case e.KeyChar
            Case "0"c To "9"c
                e.Handled = False

            Case ChrW(Keys.Back)
                e.Handled = False

            Case ChrW(Keys.Escape)
                Me.Clear()
                e.Handled = False

            Case Else
                ' KeyPressイベントを処理済とする。
                e.Handled = True

        End Select

        MyBase.OnKeyPress(e)

    End Sub

End Class

Case文で押されたキーに対して処理を分けています。
エスケープで文字を全て削除するというおまけもつけてみました。
今回はOnPaintを使用しないので、消してしまっても大丈夫です。

デフォルトでe.HandledはFalseなので書かなくてもいいとは思いますが、
わかりやすいかなと思ったので書いています。

おそらくInheritsを書くときにエラーが出ると思いますが、
デザイナーファイルの継承を同じものに書き換えてあげれば解消されます。

今回はここまで。