# TIP

TF_NOTE:
Dim oleDR As OleDbDataReader
       Dim oleCmd As New OleDbCommand("SELECT * FROM TIP", m_oleConn)

            m_oleConn.Open()
            oleDR = oleCmd.ExecuteReader()

	     Do While oleDR.Read()

            	strSeq = oleDR("TF_SEQ")
            	strTitle = oleDR("TF_TITLE")
            	strGroup = oleDR("TF_GROUP")

	     Loop

            oleDR.Close()


TF_NOTE:
Imports System.Data.SqlClient

Public Class CDB
    Private m_strConn As String
    Private m_con As SqlConnection

    Public Sub New(ByVal strPath As String)
        m_con = New SqlConnection(strPath)
        m_con.Open()
    End Sub

    Public Sub close()
        m_con.Close()
    End Sub

    Public Function ExecuteNonQuery(ByVal strCmd As String) As Integer
        Dim cmd As SqlCommand = New SqlCommand(strCmd, m_con)
        Return cmd.ExecuteNonQuery()
    End Function

    Public Function ExecuteReader(ByVal strCmd As String) As SqlDataReader
        Dim cmd As SqlCommand = New SqlCommand(strCmd, m_con)
        Return cmd.ExecuteReader
    End Function

    Public Function ExecuteScalar(ByVal strCmd As String) As Object
        Dim cmd As SqlCommand = New SqlCommand(strCmd, m_con)
        Return cmd.ExecuteScalar()
    End Function

    Public Function GetDataView(ByVal strCmd As String, ByVal strTableName As String) As DataView
        Dim adpt As SqlDataAdapter = New SqlDataAdapter
        adpt.SelectCommand = New SqlCommand(strCmd, m_con)
        Dim ds As DataSet = New DataSet()
        adpt.Fill(ds, strTableName)
        Dim dv As DataView = New DataView(ds.Tables(strTableName))
        Return dv
    End Function

    Public Function GetDataTable(ByVal strCmd As String) As DataTable
        Dim adpt As SqlDataAdapter = New SqlDataAdapter(strCmd, m_con)
        Dim ds As DataSet = New DataSet()
        Dim dt As DataTable = ds.Tables.Add("strTableName")
        adpt.Fill(ds, "strTableName")
        Return dt
    End Function
End Class


TF_NOTE:
Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then Me.TextBox2.Focus()
End Sub


TF_NOTE:
Private Sub TextBox2_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
        If e.KeyCode = Keys.Enter Then Me.Button1.PerformClick()
End Sub


TF_NOTE:
<한글부터 입력하도록 설정>
속성에서 IMEmode를 Hangul로 설정하면 된다.


TF_NOTE:
* 윈도우폼에서 각 속성의 코드를 보고 싶으면 솔루션탐색기에서 두번째 아이콘(모든파일표시)을 누른 후 폼파일을 펼쳐보면 designer.vb파일이 보임. 이것을 열면 속성의 코드를 다 볼 수 있다.
- 모니터 수를 파악하여 마지막 모니터에 Form2를 열기.
- AllScreens : system의 모든 디스플레이 배열을 가져옵니다.
- UBound : 배열에 표시된 최고 첨자를 반환합니다. (LBound는 반대)
- Bounds : 디스플레이 범위를 가져옵니다.
- Location : 구조체의 왼쪽 위 모퉁이 좌표를 가져오거나 설정합니다.
Form2.Location = Screen.AllScreens(UBound(Screen.AllScreens)).Bounds.Location
Form2.Show()


<현재의 폼을 화면의 왼쪽 상단에 가로는 반으로, 높이는 꽉차게 하기>
Me.Location = Screen.AllScreens(UBound(Screen.AllScreens)).Bounds.Location
Dim desktopSize As Size
desktopSize = System.Windows.Forms.SystemInformation.PrimaryMonitorSize
Me.Width = desktopSize.Width / 2
Me.Height = desktopSize.Height - 35 ‘35는 윈8의 작업표시줄 높이


<폼의 시작위치를 화면의 가운데로>
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen

SystemInformation.PrimaryMonitorSize 속성은 기본 모니터의 크기만 반환합니다. 데스크톱에서 여러 대의 모니터를 사용하는 경우도 있습니다. SystemInformation.MonitorCount 속성을 사용하여 모니터가 더 있는지 확인합니다.

- Anchor 를 Top, Bottom, Left, Right 로 설정해주면 Form의 크기를 조절할 때 같이 조절된다.
(폼 위의 구조체에 압정을 꽂아두면 폼을 당기면 같이 늘어난다고 이해하면 될 듯)


TF_NOTE:
Dim desktopSize As Size
desktopSize = System.Windows.Forms.SystemInformation.PrimaryMonitorSize
Dim height As Integer = desktopSize.Height
Dim width As Integer = desktopSize.Width


TF_NOTE:
If System.IO.Directory.Exists("C:\chart") = False Then '로 폴더 존재 여부를 검사하고,
   System.IO.Directory.CreateDirectory("C:\chart") '로 폴더를 생성합니다.
End If


TF_NOTE:
Try
   Dim pdfDoc As New Document()
   Dim pdfWrite As PdfWriter = PdfWriter.GetInstance(pdfDoc, New FileStream("C://chart//" + _TextBox1.Text + ".pdf", FileMode.Create))
   Dim ImageNum As Integer
   Dim Count As Integer = 0
   ImageNum = ListBox1.Items.Count
   pdfDoc.Open()

   While Count < ImageNum
         pdfDoc.Add(New Paragraph("PAGE : " & Count + 1))
         Dim img As Image = Image.GetInstance(ListBox1.Items(Count))
         img.ScaleToFit(725.0F, 725.0F)
         pdfDoc.Add(img)
         pdfDoc.NewPage()
         Count += 1
   End While

   pdfDoc.Add(New Paragraph("Last Page !!"))
   pdfDoc.Close()
   AxAcroPDF1.LoadFile("C://chart//" + TextBox1.Text + ".pdf")
Catch ex As Exception
   MessageBox.Show(ex.Message)
End Try


TF_NOTE:
(Cursor.Show()로는 안됨)
Me.Cursor = Cursors.Default ‘화살표 커서인 기본커서


TF_NOTE:
DateTimePicker.value.AddDays(-1) ‘하루 전날 표시로 DateTimePicker.value - 1은 안됨.
DateTimePicker1.value - DateTimePicker2.value ‘같은 형식이므로 연산 가능.


TF_NOTE:
Dim a() As TextBox ‘public a() as textbox로도 사용
‘nullReferenceException이 뜰 경우 아래 항목 지우고 직접 사용하는 프로시저 안에서 초기화 a = New TextBox() {TextBox1, TextBox2} <- 요부분만

   Public Sub New()
   InitializeComponent()
   a = New TextBox() {TextBox1, TextBox2}
   End Sub


TF_NOTE:
- 프로젝트 저장 후 프로젝트 열기를 선택하여 다이어로그 상자에서 아래쪽의 솔루션추가를 선택하고 TwainLib 프로젝트만을 불러온다.
- TestTwainLib 프로젝트의 솔루션탐색기에서 app.config 파일을 복사해서 포함시킨다.
- 만들고 있는 프로젝트를 모든파일보기하여 프로젝트를 펼치고 settings.settings를 펼쳐서 settings.Designer.vb파일을 열어 다음 내용의 코드를 namespace - Class MySettings
안에 추가한다.
<Global.System.Configuration.UserScopedSettingAttribute(), _
 Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
 Global.System.Configuration.DefaultSettingValueAttribute("")> _
        Public Property scan() As String
            Get
                Return CType(Me("scan"), String)
            End Get
            Set(value As String)
                Me("scan") = value
            End Set
        End Property

- app.config내용 중 TestTwainLib를 현재 만들고 있는 프로젝트명으로 변경한다.


*** 프로젝트는 추가하지 않고 app.config와 setting.Designer.vb파일만 추가 수정하면 되는 듯 함!!!  ***


TF_NOTE:
- combobox item설정(combobox1에 아이템추가)
ComboBox1.items.add(“추가내용1”)
ComboBox1.items.add(“추가내용2”)


TF_NOTE:
Dim result As Integer = MessageBox.Show("message", "caption", MessageBoxButtons.YesNoCancel)
If result = DialogResult.Cancel Then
    MessageBox.Show("Cancel pressed")
ElseIf result = DialogResult.No Then
    MessageBox.Show("No pressed")
ElseIf result = DialogResult.Yes Then
    MessageBox.Show("Yes pressed")
End If


TF_NOTE:
Dim fruit As New List(Of String)
fruit.Add("pear");
fruit.Add("banana")
fruit.add("peach")
fruit.Add("strawberry")

If fruit.Count > 3 Then
    Console.WriteLine("fruit salad!")
End If


TF_NOTE:
ImageIndex 속성은 이미지 목록에서 이미지의 위치를 지정합니다. ImageKey 속성은 이미지 자체를 지정합니다. 

속성
	lvResult.MultiSelect = False : 여러행을 selection 할 수 없다.
       lvResult.FullRowSelect = True : 행을 선택시 행전체가 선택된다.
	lvResult.Activation = ItemActivation.TwoClick : 선택된 행을 한번더 선택해야 작동 (oneclick, standard가있다. standard는 더블클릭)
	lvResult.HeaderStyle = ColumnHeaderStyle.Nonclickable (clickable:헤드를 클릭할수있음, nonclickable:헤드를 클릭할수없음, none:헤드없음)
	lvResult.Columns.Add("헤드 이름", 컬럼의길이, HorizontalAlignment.Left) - 정렬방식은 center, left, right


TF_NOTE:
Imports System 
Imports System.Collections.Generic 
Imports System.Drawing 
Imports System.Drawing.Imaging 
Imports Spire.Pdf 


Namespace ExtractImage 
Friend Class Extract 
Shared Sub Main(ByVal args() As String) 
'Load File 
Dim doc As New PdfDocument() 
doc.LoadFromFile("D:\work\My Documents\Employee Information.pdf") 

Dim images As IList(Of Image) = New List(Of Image)() 

For Each page As PdfPageBase In doc.Pages 
For Each image As Image In page.ExtractImages() 
images.Add(image) 
Next image 
Next page 

doc.Close() 

'Save Image 
Dim index As Integer = 0 
For Each image As Image In images 
Dim imageFileName As StringString = String.Format("Extract{0}.png", index) 
index += 1 
image.Save(imageFileName, ImageFormat.Png) 
Next image 

System.Diagnostics.Process.Start("Extract0.png") 
End Sub 
End Class 
End Namespace


TF_NOTE:
1. 도구상자 우클릭 - COM구성요소 - Adobe PDF Reader 체크
2. 도구상자에서 Adobe PDF Reader control을 사용


TF_NOTE:
1. TwainLib3에서 dll파일을 솔루션에 추가 (솔루션 우클릭 - 참조추가 - 찾아보기 - dll폴더에서 TwainLib.dll을 추가한다.
2.


TF_NOTE:
기존의 프로젝트가 열린 상태에서 '파일'-'프로젝트열기' 를 선택하면 파일이름 넣는 칸 바로 위에 '옵션'이 있다. 여기서 '솔루션에 추가'를 선택하고 추가하고 싶은 프로젝트를 선택하면 기존의 프로젝트에 선택한 프로젝트가 추가된다.


TF_NOTE:
⊙ 비트(Bit) : 정보의 최소 단위 
⊙ 바이트(Byte) : 8개의 비트가 모여 1바이트 되며, 문자 표현의 최소 단위 
⊙ 워드(Word) : 바이트의 모임으로 크게 반워드, 전워드, 더블워드로 구성 
반워드(Half Word) : 2바이트로 구성 
전워드(Full Word) : 4바이트로 구성 
더블워드(Double Word) : 8바이트로 구성 
⊙ 필드(Field) : 자료 처리의 최소단위 
⊙ 레코드(Record) : 하나 이상의 필드들이 모여 구성 
논리레코드 : 데이터 처리의 기본단위 
물리레코드(=블록) : 하나 이상의 논리레코드가 모여 물리레코드가 되며, 보조기
억 장치와의 입출력 단위가 됨 
⊙ 파일(File) : 레코드의 모임 
⊙ 데이터베이스(DataBase) : 파일들의 집합을 의미하는 것으로, 가장 큰 집단임


TF_NOTE:
1. PictureBox image설정
- picScan.Image = [이미지]
또는
- picScan.ImageLocation = [image파일 위치]

* image를 경로에서 가져오는 방법: Image.FromFile(이미지 파일 위치)


TF_NOTE:
1. itextsharp 홈페이지에서 itextsharp을 다운로드 받는다.

2. itextsharp-dll-core, itextsharp-dll-pdfa, itextsharp-dll-xtra 이 3개의 폴더를 압축을 풀고, 그 안의 파일 4개를 만들고 있는 프로젝트명 폴더에 복사한다.

3. 프로젝트명 우클릭하여 속성에서 리소스를 선택하여 '리소스추가 - 기존파일추가' 하여 아까 복사한 파일 중 dll 파일 세개를 추가한다.

4. 다시 프로젝트 우클릭하여 '참조추가 - 찾아보기'하여 dll 파일 세개를 추가한다.

5. code 처음에 다음의 문장을 추가한다.
Imports itextsharp.text.pdf
Imports itextsharp.text
Imports System.IO

6. YejinScanChart 프로젝트를 참조.
(필요한 class: EditPdfLib, CDB)


TF_NOTE:
Imports iTextSharp.text.pdf
Imports iTextSharp.text
Imports System.IO

Public Class EditPdflib
    Public Function PageCount(ByVal sourcePdf As String) As Integer
        Dim reader As PdfReader = Nothing
        Dim pgCount As Integer = 0

        reader = New iTextSharp.text.pdf.PdfReader(sourcePdf)
        pgCount = reader.NumberOfPages()
        Return pgCount
    End Function

    Public Function ReadFs(ByVal srcPdf As String) As Byte()
        Dim fs As FileStream = New FileStream(srcPdf, FileMode.Open, FileAccess.Read)
        Dim br As New BinaryReader(fs)
        Dim bytes As Byte() = br.ReadBytes(Convert.ToInt32(fs.Length))
        br.Close()
        fs.Close()
        Return bytes
    End Function
End Class


TF_NOTE:
1. PdfManipulation2.vb 파일을 프로젝트에 추가해야함.

2. PdfManipulation2.ExtractImages([filepath])([num]) 사용하여 이미지 추출함.

 PdfManipulation2.ExtractImages([filepath])는 list형태임


TF_NOTE:
1. 도구상자에 추가할 button의 .dll파일 만들기

새프로젝트 - 클래스라이브러리 - 솔루션탐색기(프로젝트 우클릭) - 속성 - 리소스 - 버튼이미지3개 추가

다시 프로젝트 우클릭 - 추가 - windows form
-> 방금 만든 윈도우폼 삭제

다음을 coding
Imports System.Drawing
Public Class YOUR CLASS NAME
    Inherits Windows.Forms.Button
    Public Sub New()
        Me.Size = New Point(32, 32)
        Me.FlatStyle = Windows.Forms.FlatStyle.Flat
        Me.FlatAppearance.BorderSize = 0
        Me.FlatAppearance.BorderColor = System.Drawing.Color.Gray
        Me.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent
        Me.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent
        Me.BackColor = System.Drawing.Color.Transparent
        Me.BackgroundImage = My.Resources.YOUR NORMAL IMAGE
        Me.BackgroundImageLayout = Windows.Forms.ImageLayout.Stretch
        Me.Font = New System.Drawing.Font("Tahoma", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
    End Sub
    Private Sub Backbutton_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        Me.BackgroundImage = My.Resources.YOUR MOUSE CLICK IMAGE
    End Sub
    Private Sub Backbutton_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
        Me.BackgroundImage = My.Resources.YOUR MOUSE ON IMAGE
    End Sub
    Private Sub Backbutton_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
        Me.BackgroundImage = My.Resources.YOUR NORMAL IMAGE
    End Sub
    Private Sub Backbutton_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        Me.BackgroundImage = My.Resources.YOUR MOUSE ON IMAGE
    End Sub
End Class
' Resources 뒤에 각 이미지 파일명

이제 빌드하면 프로젝트 폴더의 bin 폴더에 dll파일이 생성됨.

2. 사용할 프로젝트의 도구상자 우클릭 - 항목선택 - 찾아보기 - 1에서 만든 dll파일 등록

3. 사용하기


TF_NOTE:
* getinstance를 사용하여 itextsharp.text의 이미지로 바꿔줘야만 pdf파일에 포함시킬 수 있음
system.drawing.image는 사용하지 못함. 따라서 다음의 과정이 필요함.

            'image자체를 불러올때 다음의 방법으로
            Dim img As Image = Image.GetInstance(imglstScan.Images.Item(Count), System.Drawing.Imaging.ImageFormat.Bmp)

            'image의 경로를 사용하여 불러올때 다음의 방법으로
            'Dim img As Image = Image.GetInstance(lstScan.Items(Count).Text)

            img.ScaleToFit(725.0F, 725.0F) '이미지 size 조정


TF_NOTE:
ShowRootLines : true - 루트노드앞에 '+'표시 나타내기
HideSelection : true - 선택된 노드의 highlight 가 focus를 잃으면 사라짐. false - focus를 잃어도 그림자로 남음

트리노드이름.Nodes.Add(New TreeNode("새로생성하는 루트노드이름", 루트노드 선택시 이미지인덱스, 루트노드 선택안했을시 이미지인덱스))


TF_NOTE:
select case문에서 문자열 사용시 문자열을 sqlserver에서 불러올 때 여백을 없애주는 Trim() 같은 함수를 써서 여백을 없애주어야함.


TF_NOTE:
Dim desktopSize As Size
desktopSize = System.Windows.Forms.SystemInformation.PrimaryMonitorSize
Dim height As Integer = desktopSize.Height
Dim width As Integer = desktopSize.Width

- 현재의 폼을 화면의 왼쪽 상단에 가로는 반으로, 높이는 꽉차게 하기
Me.Location = Screen.AllScreens(UBound(Screen.AllScreens)).Bounds.Location
Dim desktopSize As Size
desktopSize = System.Windows.Forms.SystemInformation.PrimaryMonitorSize
Me.Width = desktopSize.Width / 2
Me.Height = desktopSize.Height - 35 ‘35는 윈8의 작업표시줄 높이

- 폼의 시작위치를 화면의 가운데로
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen

SystemInformation.PrimaryMonitorSize <https://msdn.microsoft.com/ko-kr/library/system.windows.forms.systeminformation.primarymonitorsize(v=vs.71).aspx> 속성은 기본 모니터의 크기만 반환합니다. 데스크톱에서 여러 대의 모니터를 사용하는 경우도 있습니다. SystemInformation.MonitorCount <https://msdn.microsoft.com/ko-kr/library/system.windows.forms.systeminformation.monitorcount(v=vs.71).aspx> 속성을 사용하여 모니터가 더 있는지 확인합니다.
- Anchor 를 Top, Bottom, Left, Right 로 설정해주면 Form의 크기를 조절할 때 같이 조절된다.
(폼 위의 구조체에 압정을 꽂아두면 폼을 당기면 같이 늘어난다고 이해하면 될 듯)


