NotifyCnt = 0
        ' 송신내용
        Dim sndstr As New TypedString(6344)
        ' 수신내용
        Dim rcvstr As New TypedCArray(6344)
        ' 접속서버 환경설정
        Utils.tuxputenv("WSNADDR=//서버아이피" + 서버포트번호)
        ' TPINIT
        Dim tpinfo As New TypedTPINIT()
        Dim ac As AppContext = AppContext.tpinit(tpinfo)
        ac.tpsetunsol(New UnsolicitedMessageHandler(AddressOf MyUMHandler))
        sndstr.PutString(0, SendStr, SendStr.Length)
        Try
            ac.tpcall("BNCSIN", sndstr, rcvstr, 2)
            Dim Addr As IntPtr = rcvstr.Buffer.ToInt64()
            RecvStr = Marshal.PtrToStringAnsi(Addr, 6344)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "TPFAIL")
            Return False
        End Try
        ac.tpterm()
블로그 이미지

레몬도리 LemonDory

개발자의 이야기

Tag Texedo

C#도 초보인데 Visual Basic을 하게 되었습니다.
한참을 허공에 삽질하다가 도움말을 볼세도 없었죠.
그러다 다른 분들의 몇몇 소스를 보면서 UXXXX관련된 메소드를 사용을 많이하시는걸 보고 이건 머지 보다가 너무 많아서 몇가지 자주 사용 되는것을 정리 해보려고 합니다.
설명은 Visual Studio 도움말을 이용 하였습니다.
Visual Studio 도움말에도 자세한 도움말과 예제가 있습니다.

1. UBound 메서드 
   배열의 표시된 차원에 사용할 수 있는 최고 첨자를 반환합니다.  
   Dim a(100, 5, 4) As Byte
   다음과 같은 배열이 있다면 
   UBound(a, 1) 의 값은 100이 되고 UBound(a, 2) 는 5 가 됩니다.
   이걸 조건문 IF에 사용하게되면 다음과 같습니다. 

        If UBound(a, 1) = 100 Then
            '실행문
        End If

   이런 조건문 이외에도 많은 용도로 사용되고 있습니다. 
2. Mid 문
   String 변수에 있는 지정한 수의 문자를 다른 문자열의 문자로 바꿉니다.
        Dim Str As String = "ABCEEF"
        Str = Mid(Str, 4, 1)   
   사용은 이렇게 합니다.   
   이렇게 하고 Str을 출력해보면 ABCDEF가 출력 되겠죠.

3. UCase 함수 
   대문자로 변환된 특정 문자열이 있는 문자열 또는 문자를 반환합니다.
Dim LowerCase As String = "Hello World 1234"
Dim UpperCase As String = UCase(LowerCase)
   다음과 같은 예제에서 LowerCase를 출력하면 Hello World 1234 저장된 값 그대로 출력할 것이다.
   UCase를 사용한 UpperCase는 소문자 모두가 대문자로 저장되어 HELLO WORLD 1234와 같이 찍일
   것이다.
4. IsNumeric 함수
   특정 식이 숫자로 계산될 수 있는지를 나타내는 Boolean 값을 반환합니다.
      - 계속이어 하겠습니다.-
블로그 이미지

레몬도리 LemonDory

개발자의 이야기

[abstract]

abstract 한정자는 클래스, 메서드, 속성, 인덱서 및 이벤트에 사용할 수 있습니다. 클래스 선언에 abstract 한정자를 사용하면 해당 클래스가 다른 클래스의 기본 클래스로만 사용됨을 나타낸다. abstract로 표시된 멤버나 abstract 클래스에 포함된 멤버는 해당 abstract 클래스에서 파생되는 클래스에 의해 구현되어야 한다.

[event]

event 키워드는 게시자 클래스에서 이벤트를 선언하는 데 사용.

public class Publisher
{
        // Declare the delegate (if using non-generic pattern).
        public delegate void SampleEventHandler(object sender, SampleEventArgs e);

        // Declare the event.
        public event SampleEventHandler SampleEvent;

        // Wrap the event in a protected virtual method
        // to enable derived classes to raise the event.

        protected virtual void RaiseSampleEvent()
        {
            // Raise the event by using the () operator.
            SampleEvent(this, new SampleEventArgs("Hello"));
        }
}

[extern]

extern 한정자는 외부에서 구현되는 메서드를 선언하는 데 사용된다. extern 한정자는 일반적으로 비관리 코드를 호출하기 위해 Interop 서비스를 사용할 때 DllImport 특성과 함께 사용된다. 이 경우 메서드는 다음 예제에서와 같이 static으로도 선언해야 한다.

using System;
using System.Runtime.InteropServices;
class MainClass
{
   [DllImport("User32.dll")]
   public static extern int MessageBox(int h, string m, string c, int type);

   static int Main()
   {
      string myString;
      Console.Write("Enter your message: ");
      myString = Console.ReadLine();
      return MessageBox(0, myString, "My Message Box", 0);
   }
}

[sealed]

sealed 한정자는 클래스, 인스턴스, 메서드 및 속성에 적용할 수 있다. 봉인 클래스는 상속할 수 없다. 봉인 메서드는 기본 클래스의 메서드를 재정의하지만 이후의 파생 클래스에서는 봉인 메서드 자체를 재정의할 수 없다. 메서드나 속성에 sealed 한정자를 적용하는 경우 항상 override(C# 참조)를 함께 사용해야 한다.


using System;
sealed class SealedClass
{
    public int x;
    public int y;
}

class MainClass
{
    static void Main()
    {
        SealedClass sc = new SealedClass();
        sc.x = 110;
        sc.y = 150;
        Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
    }
}

[액서스한정자]

public: 액세스가 제한되지 않는다.

protected: 포함하는 클래스 또는 여기에서 파생된 형식으로 액세스가 된다.

Internal: 액세스가 현재 어셈블리로 된다.

protected internal: 현재 어셈블리 또는 포함하는 클래스에서 파생된 형식으로 액세스가 된다.

private: 액세스가 포함하는 형식으로 제한된다.




[출처]
[C#] 한정자|작성자 문성섭


블로그 이미지

레몬도리 LemonDory

개발자의 이야기

반복문 > 함수 > class > file > dll

반복되는 작업을 하나의 이름으로 등록해 놓고 호출하는 방법

1. 반복문

  - while, do while, for
     단일 for   /  다중 for
     - 출력반복을 하기 위한 문장
     - 코드 단일화

   <형식>
     for(초기값; 조건; 증감/증가식)
     {
     명령;
     }
     int    i = 1;

      while(i<3)
      {
        Consloe.WriteLine("{0}",i);
        i++;
       }
---->for 

    <ex>
     for(int i=1;i<3;i++)
    {
     console.WriteLine("{0}",i);
     }

초기화 -> 조건 -> 명령 -> 증감 -> 조건(true)

                 -> 명령 ->증감 ->조건(true)

                 -> 명령 ->증감 ->조건(true)

                 -> 명령 ->증감 ->조건(false)

  - 무한루프
     for(;;){명령;} // 명령이 계속 돈다.

  - 다중 for 문
     for (){} - for (){}
    <형식>
    for (;;)
          {
             for (;;)
             {
             }
           }

    <ex>
    for(int i=1;i<=2;i++)
    {
          for(int j=1;j<=3;j++)
          {
               Console.Write("abc");
          }
     }

   입력용 - while, do while ,

      while (조건)  // 조건에 만족할때까지 수행 ex)카드로 돈을 찾을때
          {
            명령;
          {
      do   // 명령을 실행 후 조건을 만난다.  ex)기차표 예매 후 취소
          {
          명령;
         }while(조건);   

  출력용 - for

  - if()조건문
     -단일 if와 다중 if 가 있다.    
<형식>
     if (조건 )
     {
      명령;
     }

      -만일 조건이 만족하면 명령을 수행
    <ex> 만일 (a가 10보다 크면)

         {
          크다라고 출력하자
          }
         if (a > 10)
         {
          Console.WriteLine("크다");
         }  //{}없을경우 첫문장만 True로 인식한다.

      <형식>
     if(조건)
     {
         true 명령;
     }
     else
      {
       false명령;
      }

     -- 다중if --
    <형식>

     if(조건)
     {
         true 명령;
     }
     else if(2조건)
      {
       false명령;
      }
     else if(3조건)
      {
       false명령;
      }

     <ex>
     //문제 : 입력한 수가 양수이면 그 수에 +100
     //입력한 수가 음수이면 그 수에 -100
     //나머지는 0이라고 출력

      int a = Convert.ToInt32(Console.ReadLine());
      if (a > 0)
      {
           Console.WriteLine("{0}",a + 100);
       }
       else if (a < 0)
       {
            Console.WriteLine("{0}", a - 100);
       }
       else
       {
            Console.WriteLine("0");
       }
- 선택문 //if 의 범위를 줄위기 위해 if와 함께 사용된다.
     switch(조건) ----- int
     {
          case  선택 값:
                     명령;
                     break;
          default:
                    명령;
                    break;
     } 
※ go to 문을 권장하지 않는다.
                 
2. 함수 
  - ()를 가지고 선언과 동시에 &을 갖는다.
  - 선언된 함수는 호출 시에만 명령을 수행하고 호출이 끝나면 다시 돌아간다.    (binding)
  - binding된 함수는 메모리를 차지하지 않는다.

  <형식>  void형과 dataType형이 있다
     - void형
       접근지정자 키워드 void함수이름(매개변수)
       {
         명령; //단, 키워드와 매개변수는 선택적
       }

    <ex>
     public static void test() 
     { 

     }

    <실전>

using System;
using System.Collections.Generic;
using System.Text;

namespace Day1017
{
    class ETest
    {
        public void Test2()   //static이 없다.
        {
            Console.WriteLine("내용4");
        }
        public static void Test()
        {
            Console.WriteLine("내용3");
        }
    class FunClass1
    {
        public static void Test()
        {
            Console.WriteLine("내용1");
            Console.WriteLine("내용1");
            Console.WriteLine("내용1");
            Console.WriteLine("내용1");
            Console.WriteLine("내용1");
        }
        public static void GTest()
        {
            Console.WriteLine("내용2");
        }

        public static void Main(String[] args)
        {
            Test();  //내용1
            GTest();  //내용2

            ETest.Test();  //내용3

            //class명.멤버
            ETest t1= new ETest();
            t1.Test2(); //내용4
        }
    }
}
}

//static 선언을 하자마자 주소번지 준비,주소가 있기때문에 바로 Test()로 부르지만 
//static 없을 경우는 주소번지가 없기 때문에 ETest t1 = new ETest(); 를 사용하여 불러서 출력한다

      - 함수 호출시에는 함수이름만 부른다.
    <ex> Test();
    단, void 함수는 return 키워드가 없다.
    void 함수는 스스로 결과값을 출력 및 저장한다.

 - 매개 변수를 가진 함수를 호출할 때는 반드시 매개 상수를 대입후 호출한다.
static void test(int b)
{

}

-묵시형 변환을 할 수 있을까?
당연히 할수 있다.

  <실전 OverLoad>

using System;
using System.Collections.Generic;
using System.Text;

namespace Day18
{
    class Overtest1
    {
        public static void Test(int a)
        {
            Console.WriteLine("Int {0}", a);
        }
        public static void Test(float a)
        {
            Console.WriteLine("Float {0}", a);
        }
        public static void Test(double a)
        {
            Console.WriteLine("Double {0}", a);
        }
        public static void Test(char a)
        {
            Console.WriteLine("Char {0}", a);
        } //오버로드시에 해당 데이터 매개인자가 없을 경우 알아서 묵시형변환하여 출력된다. 

          //double형을 묵시형 변환 되었을때 int로 출력하게 하려면 에러 출력 변환되지 않는다. 
        public static void Test(string a)
        {
            Console.WriteLine("String {0}", a);
        }
        public static void Main(String[] args)
        {
            Test(3);
            Test(3.14f);
            Test(3.14);
            Test('A');
            Test("abc");

        }
    }
}

※ 이런 오류
자료는 있지만 {}로 자료 배열을 하지 않을경우 에러는 없지만 자료는 출력되지 않는다.
디버거 : {} 값 배열에 관련된 오류
         디버거 창에서 오류 클릭 후 <확인> 하면 오류줄을 지칭해준다.
} 더 있을경우 네임스페이스 에러

===============================================================================

datatype형의 함수

<형식>
접근지정자 키워드 datatype함수 이름(매개 변수)
{
return datatype의 상수;
}
- 함수이름을 호출하면 datatype의 상수를 리턴해준다.
- 값을 리턴하기 때문에 호출 시 에는 그 값을 받을 변수가 있어야 함.
가장 중요한 것은 함수를 선언 시에는 반드시 해당 함수의 자료형과 리턴하는 상수가 자료형이 일치하여야 한다.

<ex>
public static int test()
{
return 100;
}
int a = test();  // 값 : 100

 3. class  -> 사용자 DataType
            user가 자주 사용하는 DataType들을 
            class라는 키워드를 이용하여 하나의 이름으로 등록하는 것   
     -접근 지정자 / class멤버 변수와 메소드 / 지역, 전역
     class의 목적 : 은닉된 멤버 변수에게  (private 변수)
                     오픈된 멤버함수가  (public형 메소드)
                      값을 전달 및 변경하고 (public void setUserName())
                      리턴한다.(public datatype getName())
                      - 형 변환을 막기 위함

4. file

5. dll
※ dll > file > class > 함수 > 반복문 : dll은 file을 포함하고 file은 class를 포함하고 class는 함수를 포함하고 함수는 반복문을 포함한다.

블로그 이미지

레몬도리 LemonDory

개발자의 이야기


using System;
using System.Collections.Generic;
using System.Text;

namespace Day1017
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0}", 100); //가수 : 다른 곳에서 출력불가(!=상수)
        }
    }
}

 


변수 > 구조체(ToInt,ToChar 등)로 정해진 Data Type에 이름을 생성해서 상수를 대입하는 것.

   <형식> Data Type userName;
 int....  식별자 규칙 name;
 ex. int    a;
 > 정해진 바이트에 주소생성 메모리 확보
     float fl;

=========================================================================================

1. 지역변수 : 단일 {}()안에 선언된 변수를 말한다.
  항상 초기화를 하자..
  <ex1> static void test(int a)
  {
   int k;     // 지역변수 {}()안에서만 사용
   Console.WriteLine(y);====> 100 //전역 변수
                                    //a, k test()의 지역변수
                                    //외부 호출 불가
  <ex2> static void test2(int a)
  {
   int k;
   for(int i=0;i<10;i++0)
   {
   Console.WriteLine("{0}", a):
   Console.WriteLine("{0}", k):
   }  
   Console.WriteLine("{0}", i)://지역변수이기 때문에 오류출력(for의 지역변수)
   Console.WriteLine("{0}", a):
   Console.WriteLine("{0}", k):
  }
2. 전역변수 (목적 : 호출)
- 단일 {} 다중 { { } } 상관하지 않고 호출할 수 있는 변수를 말한다.
- 전역변수는 값을 공유하기 위한 목적,
- 유일성
- 키워드 static,extern 전역변수이다.
- 키워드가 없는 일반 변수는 선언의 위치에 따라 전역과 지역으로 구분된다.(member변수)


 class Program
    {
        static int k = 100;// program이라는 클래스의 전역변수, class안에 선언되어 멤버라고 한다

        static void Main(string[] args)
        {
                        Console.WriteLine("{0}", k);   //지역변수
        }
    }
}

3. 멤버변수 (목적 : 은닉)
- 사용자 DataType class안에 선언된 변수
<형식>
 class userName
 {
  접근지정자 키워드(static) DataType 변수; //값을 여기서 주지 않고 호출하는 자나 생성자가 준다.
  //키워드를 가지고 잇는 변슈는 전역변수 키워드를 가지고 잇지 않을경우 userName의 .....
 }

<ex>  class Test
 {
 public static int a; //전역변수
 public int b; //일반멤버 지역변수
- 초기값은 할당하지 않아도 기본값이 할당
- 멤버변수는 일반변수와 전역변수등으로 이루어 진다.
- 멤버변수는 반드시 해당 class를 동적 할당 후 멤버임을 지칭하는 연사자를 사용한다.(지역)
<형식>
    userName 객체Name = new
    userName();
    객체Name.멤버변수=상수;
<ex>
    Test t1(object개체/객체(참조)) = new Test(); //사용자 datatype을 만들땐 꼭 이렇게 사용
         t1.b = 100;

- 선언 시에는 static에 주소를 stack에 호출되는 객체를 heap에는 메모리 확보를 가진다.


4. 사용자 DataType - class와 struct
class
- C#에서 제공하는 자료형들을 가지고 user가 자주 사용하는 자료셩을 하나의 이름으로 묶어서 등록한 키워드(static에서 기억)

 

5. 멤버변수 중 일반 변수는 객체생성(new)후 객체, 멤버변수로 호출하고
static변수는 class명.멤버로 호출한다.

 

6.struct 구현해 보자. - 구조체 = 오픈된 자료형

<형식>

       struct userName

       {

          멤버변수등등;  //멤버필드

       }

블로그 이미지

레몬도리 LemonDory

개발자의 이야기

dll로 만들기

 1. csc /target:library 만들 대상 aaa.cs로 dll을 만든다

2. csc /reference:만든.dll 사용할.cs 를 한다.

3. 실행한다

 
vs에서하기

파일 입력후

빌드 > 솔류션 빌드 하면 dll파일이 생성된다

참조에서 추가하여 사용하면된다.

맨위에 모든파일표시 를 눌러 생성되었는지 확인하자.

 

두번째

파일 생성후

프로젝트에서 속성을 누르면 속성창에 응용프로그램 안에 <출력 형식>을 클래스 라이브러리로 하고 솔루션 빌드를 눌러 생성한다.

사용은 참조에서 불러와 사용하면된다

블로그 이미지

레몬도리 LemonDory

개발자의 이야기

Tag dll
  
//텍스트박스에 한글만 입력하기 
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if((Char.IsPunctuation(e.KeyChar) || Char.IsDigit(e.KeyChar) || Char.IsLetter(e.KeyChar) || Char.IsSymbol(e.KeyChar)) && e.KeyChar != 8)
    {
        e.Handled = true;
    }
}  

//텍스트박스에 영어만 입력하기
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(!(Char.IsLetter(e.KeyChar)) && e.KeyChar != 8)
    {
        e.Handled = true;
    }
}

private void textBox1_Leave(object sender, System.EventArgs e)
{
    Regex emailregex = new Regex(@"[a-zA-Z]");
    Boolean ismatch = emailregex.IsMatch(textBox1.Text);
    if (!ismatch)
    {
        MessageBox.Show("영문자만 입력해 주세요.");
    }
}

//텍스트박스에 숫자만 입력하기 
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(!(Char.IsDigit(e.KeyChar)) && e.KeyChar != 8)
    {
        e.Handled = true;
    }
}

private void textBox1_Leave(object sender, System.EventArgs e)
{
    Regex emailregex = new Regex(@"[0-9]");
    Boolean ismatch = emailregex.IsMatch(textBox1.Text);
    if (!ismatch)
    {
        MessageBox.Show("숫자만 입력해 주세요.");
    }
}
블로그 이미지

레몬도리 LemonDory

개발자의 이야기