반응형

안녕하세요

 

코딩하는남자에 코딩연습생입니다~

 

간혹 프로젝트를 진행하다 보면 두개의 프로젝트를 하나의 솔루션에 합쳐서 개발해야 할 때가 발생한다

 

뭐 프로젝트 두개 실행시키는거야 어렵지 않은데...

 

한쪽의 프로젝트에서 나머지 한쪽을 제어하는듯(?)이 보여 주고 싶을 때가 있다

 

예를들면 1번 프로젝트가 실행되고 나면 자연스럽게(?) 두번째 프로젝트가 실행된다던지

 

1번 프로젝트를 종료하면 자연스럽게(?) 두번째 프로젝트가 종료되는 이런 간단한 조작이 필요할 때가 있다

 

저의 경우 ClickOnce를 주로 사용하여 배포를 하는데 이 경우 실행된 프로세스를 통해 다음과 같은

 

동작을 구현할수 있다

 

이게 좋은 방법인지 아닌지는 잘 모르겠다 하지만 필요할때가 있다

 

 

[C# Source Code]

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

using System.Diagnostics;

using System.Runtime.InteropServices;

using System.Threading;
namespace Ex_Process_Ctl

{

  static class Program

  {

     //이미 실행중이면 포커스

     [DllImport("user32.dll")]

     private static extern bool SerForegroundWindows(IntPtr handle);

     //이미 실행중일때 활성화

     [DllImport("user32.dll")]

     private static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

     //이미 실행중일때 최상위 표시

     [DllImport("user32.dll")]

     private static extern void BringWindowToTop(IntPtr hwnd);

     //중복실행 방지

     [DllImport("user32.dll")]

     private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);



    ///<summary>

   ///The main entry point for the application.

   ///</summary>

   [STAThread]

   static void Main()

   {

      try

      {

         //프로그램 중복 체크

         if(bCreated == true)

         {

            Application.EnbleVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            Application.Run(new frmMain());

         }

         else

         {

            foreach(Process process in Process.GetProcesses())

            {

               if(process.ProcessName == GV.ProcessName)

               {

                  ShowWindow(process.MainWindowHandle, 5);

                  BringwindowToTop(process.MainWindowHandle);

                  SetForegroundWindow(process.MainWindowHandle);

               }

            }

         }

      }

      catch(Exception Ex)

      {

          MessageBox.Show(Ex.ToString());

      }

   }

  }

}

 

반응형
반응형

안녕하세요

 

코딩하는남자의 코딩연습생입니다

 

프로그래밍을 하다보면 CallBack 함수를 사용해야 되는 상황이 발생합니다

 

예를들면 Soket통신을 구현할때 수신/응답을 비동기식으로 구현해야할 경우가 이에 해당하죠

 

Soket 통신의 원리르 보면 이더넷 환경의 장비에 응답코드를 송신하여 그에 해당하는 결과 값을 받아오게 되죠

 

이경우 두가지 형식으로 구현을 합니다 동기식/비동기식.

 

동기식은 송신후 응답코드가 수신될때까지 멈춰 대기 하게 됩니다

 

구현할려는 장비와 운영 방법에 따라 즉시 응답이 가능하다면 동기식으로 구현하는것이 맞겠죠

 

하기만 한번에 여러대의 장비와 통신을 해야 하는 경우 혹은 수신까지 걸리는 ReadTime이 길 경우에는 무한정

 

기다릴수 만은 없기 때문에 비동기식 구현 방법을 사용 합니다

 

비동기식은 동기식과 반대로 응답코드를 송신하고 수신이 올때까지 다른 대기자가 대기하고 다른 프로세스를 실행 할 수 있죠 

 

 

비동식에서 사용해야 하는 "대리자"가 바로 이번 작성할려는 주제입니다

 

CallBack 함수를 사용할려면 누군가는 항상 값을 받을 준비를 하고 있어야 합니다

 

그 대리자가 Delegate 입니다

 

이번 C#으로 RFID 통신을 구현하면서 사용한 Source Code의 일부를 가지고 설명을 해드릴께요

 

 

1. Delegate 선언

   - RFID Tag와 Reader간 통신을 하면서 Reader가 Tag의 값을 읽기 전까지 무한 대기 합니다

   - 그후 선언된 Delegate를 통해 Tag가 읽히게 되면 나머지 프로세서를 처리하게 되는 구조 입니다

   - Delegate선언 방법은 간단합니다

     

//delegate 선언
//CallBack Fucntion 타입 정의
public delegate void OnSendToRFIDDelegate(int nCmdID, byte[] bBuf, int nSize, string sDump);
public delegate void OnReceiveFromRFIDDelegate(int nCmdID, byte[] bBuf, int nSize, string sDump);
public delegate void OnAddRFIDMsgDelegate(string sMsg);
public delegate void OnRFIDExceptionDelegate();

//CallBack 호출을 위한 전역함수 정의
Public OnSendToRFIDDelegate OnSendToFRID;
public OnReceiveFromRFIDDelegate OnReceiveFromRFID;
public OnAddRFIDMsgDelegate OnAddRFIDMsg;
public OnRFIDExceptionDelegate OnRFIDException;

 

다음과 같이 Delegate를 선언하고 그 Delegate 호출을 위한 전역함수를 선언합니다

 

그리고 Soket 통신을 위한 구문을 작성하죠.

private byte[] RcvBuf = new byte[4096];
byte[] sndBuf = new byte[12];

using(Socket socket = new Socket(AddressFamily.interNetwork, SocketType.Stream, ProtocolType.Tcp))
{
	EndPoint plcEP = new IPEndPoint(IPAddress.Parse("IP주소"), 포트번호);
    
    socket.Connect(plcEP);
    socket.Send(sndBuf);
    
    //Delegate 사용
    if(OnSendToRFID != null)
    	OnSendToRFID(CurCmd, SndBuf, 12, DumpBytes(sndBuf, 12));
        
    int nRecv = 0;
    
    nRecv = socket.Receive(RcvBuf);
    
    //Delegate 사용
    if(OnReceiveFromRFID != null)
    	OnReceiveFromRFID(CurCmd, RcvBuf, nRecv, DumpBytes(RcvBuf, nRecv));
    
    socket.Close();
}

 

운영 원리는 다음과 같습니다 Socket으로 접속하여 송신 응답 메세지를 보낸뒤 대리자를 선언하여 대리자가 null이 아닐때까지 By Psss 되고 null이 아닌 값이 들어오게 되면 대리자를 호출하여 처리 요청을 한뒤 바로 다름 응답코드를 수신할 수 있도록 운영합니다.

 

해당 글은 필자가 개인적인 코딩 연습을 위한 구현이므로 실제 정의와는 다른 의미가 있을 수 있으니

 

참고하시기 바랍니다

 

반응형
반응형

안녕하세요.

 

코딩하는남자 입니다

 

이번 블로그 내용은 C#을 통해 차트를 작성할경우 보통 상용 API를 통해 구현하게 되는데요

 

 

 

저희 같은 서민들은 그걸 구입할 돈이 없지요ㅋ

 

그래서 열심히 인터넷 검색을 통해서 무료로 사용할 수 있는 차트가 있어서 소개해 드릴려고 합니다

 

마도 MS Chart 인데요.

 

비쥬얼스튜디오에서 개발하는 C#에서 사용하기 참 좋은 API라고 생각합니다

 

혹시 자체 개발을 통해 어떠한 통계나 수치를 표현하고 싶으시면 한번 시도해 보시면 좋을거 같습니다

 

C#으로 구현하기 위해 간단한 예제를 같이 올려 드리니 분석 해서 나만의 차트를 구현해 보시기 바랍니다

 

[Souce Code]

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Diagnostics;



namespace MSChart_Controls_Test{
     public partial class Form1 : Form
     {
         Chart chart = null;

        public Form1()
        {
            InitializeComponent();

            ChartDataInput();
         }



        private void ChartDataInput()
        {
            //x,y축에 사용될 값을 먼저 준비 한다
            //x축 값
            string[] xValues1 = { "Korea", "Frence", "Canada", "Germany", "Italy" };

            //y축 값
            double[] yValues1 = { 67.66, 89.57, 82.44, 85.24, 87.93 };
            double[] yValues2 = { 77.66, 89.57, 92.44, 95.24, 97.93 };

            //차트를 변수에 담아주고
            chart = this.chart1;

            //계열을 초기화 처음에 Series1이 기본으로 들어가기 때문에 삭제해 준다
            chart.Series.Clear();

            //계열을 새로 생성해서
            Series s1 = new Series("international");
            Series s2 = new Series("International2");

            //계열을 추가해 준다
           chart.Series.Add(s1);
           chart.Series.Add(s2);

          //추가된 계열에 값을 넣어준다
          //x축 값은 하나만 있으면 되기 때문에 처음부터 데이터를 하나만 준비한다
          //만약 s2애 x축값도 만들어서 DataBindXY로 값을 넣어도 x축은 변경되지 않는다

          //한번설정하면 Y축은 값이 변경되어도 X축은 값이 변경되지 않는다
          s1.Points.DataBindXY(xValues1, yValues1);
          s2.Points.DataBindY(yValues2);

          //차트타입을 막대로 한다
          s1.ChartType = SeriesChartType.Column;

         //범례를 보여준다 
         chart.Legends[0].Enabled = true;

         //테두리선굵기 (선종류로 해야 차이가 나타난다)
         s1.BorderWidth = 12;

        //색 변경
        s1.Color = Color.OrangeRed;

        //계열에 값표시
        s1.IsValueShownAsLabel = true;

        //계열에 그라데이션을 준다
        s1.BackGradientStyle = GradientStyle.VerticalCenter;
        s2.BackGradientStyle = GradientStyle.Center;

       //아래 두줄을 풀변 상하 이중축이되고
       //s1.XAxisType = AxisType.Primary; //기본축
       //s2.XAxisType = AxisType.Secondary; //보조축

      //아래 두줄을 풀면 좌우 이중축이된다
      //s1.YAxisType = AxisType.Primary;
     //s2.YAxisType = AxisType.Secondary;

     //차트의 테두리선을 붉은색의 연결된 선으로 그리는데 선의 넓이는 1이다
     chart.BorderlineColor = Color.Red;
     chart.BorderlineDashStyle = ChartDashStyle.Solid;
     chart.BorderlineWidth = 1;

     //차트의 내부 테두리 선을 파란색의 연결된 선으로 그리는데 선의 넓이는 1이다
     chart.ChartAreas[0].BorderColor = Color.Blue;
     chart.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid;
     chart.ChartAreas[0].BorderWidth = 1;

     //차트의 내부 테두리 선을 변경
     chart.ChartAreas[0].AxisX.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisY.LineColor = Color.Blue;
     //chart.ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
     //chart.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;

     //차트의 배경 격자선을 변경
     chart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
     chart.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;

     //차트의 외부로 삐져나온 선을 변경
     chart.ChartAreas[0].AxisX.MajorTickMark.LineColor = Color.Red;
     chart.ChartAreas[0].AxisY.MajorTickMark.LineColor = Color.Red;
     chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
     chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = false;

      //첫번재 계열의 네번째 그래프만 파란색으로 변경
     s1.Points[4].Color = Color.Blue;
   }

private void ChartDataInput2()
    {
       //차트를 변수에 담아놓고
       chart = this.chart1;

       //계열도 변수에 담는다
       Series series1 = new Series("Test");
       Series series2 = new Series("Test2");

       //xValue를 준비
       string[] xValue = { "국어","영어","수학" };

       //계열을 초기화
       chart.Series.Clear();

       //계열을 추가
       chart.Series.Add(series1);
       chart.Series.Add(series2);

       //계열을 변수에 담지 않고 이렇게 바로 추가해도 된다

      //그러나 계열을 이렇게 선언하면 아래처럼 series1변수로 접근하지 못하고 chart.series[0] 또는

      //chart.series["Test"] 이렇게 접근해야 한다
       //chart.Series.Add("Test");
      //chart.Series.Add("Test2");

      //테두리선굵기 (선종류로 해야 차이가 나타난다)
      series1.BorderWidth = 12;

      //색 변경
      series1.Color = Color.OrangeRed;

      //차트 모양을 막대로 지정
      series1.ChartType = SeriesChartType.Column;
      series2.ChartType = SeriesChartType.Column;

      //테스트 계열에 값을 세개 추가
      series1.Points.AddY(21.7);
      series1.Points.AddY(20);
      series1.Points.AddY(18.5);

      //테스트2 계열에 값을 세개 추가
      series2.Points.AddY(22.4);
      series2.Points.AddY(19.2);
      series2.Points.AddY(23.8);
    }

     private void button1_Click(object sender, EventArgs e)
     {

        //차트를 변수에 담아놓고
       chart = this.chart1;

       //차트 모양을 꺽은선으로 변경
       if (chart.Series[0].ChartType == SeriesChartType.Column)
       {
           chart.Series[0].ChartType = SeriesChartType.FastLine;
           chart.Series[1].ChartType = SeriesChartType.FastLine;
        }
        else
        {
          chart.Series[0].ChartType = SeriesChartType.Column;
          chart.Series[1].ChartType = SeriesChartType.Column;
         }
     }

     private void button2_Click(object sender, EventArgs e)
     {
       //차트를 변수에 담아놓고
       chart = this.chart1;

        //원통형으로 변경
       chart.Series[1].CustomProperties = "DrawingStyle=Cylinder";

       //3D
       chart.ChartAreas[0].Area3DStyle.Enable3D = !(chart.ChartAreas[0].Area3DStyle.Enable3D);
     }

     private void button3_Click(object sender, EventArgs e)
     {
        //범례를 보여줬다가 안보여줬다가 한다
        this.chart1.Legends[0].Enabled = !(this.chart1.Legends[0].Enabled);
      }

      private void button4_Click(object sender, EventArgs e)
      {
        //첫번째 계열을 순환 하면서 가장 큰 계열의 색을 검은색으로 변경한다
        int point = 0;
        int yvalue = 0;

        for (int i = 0; i < this.chart1.Series[0].Points.Count; i++)
        {
            Debug.Print(this.chart1.Series[0].Points[i].YValues[0].ToString());
            if (yvalue < (int)this.chart1.Series[0].Points[i].YValues[0])
            {
                point = i;
                yvalue = (int)this.chart1.Series[0].Points[i].YValues[0];
             }
          }

        this.chart1.Series[0].Points[point].Color = Color.Black;
      }
    }
}

 

 

붙여넣기를 햇더니 코드가 많이 엉망이 됐네요ㅎㅎ

 

나중에 시간내서 정리하도록 하겠습니다~

 

그럼 코딩하는남자 였습니다~!

 

 

반응형
반응형

안녕하세요~

C# 프로그래밍을 연습 개발 하고 있는 코딩하는남자 입니다!!

 

이번에 연습해볼것은 QR코드 생성 인데요

왜 굳이 C#으로 QR코드를 생성해요? 라는 의구심이 드실거 같은데요

QR코드를 사용하여 활용할 곳이 생각보다 많다(?) 입니다ㅋㅋㅋ

굳이 예를 들면 인식이 필요한 프로그램 개발시

또는 자재관리, 재고관리, 재공관리, 물류관리, 편의점, 등

모든 물건을 다루는 곳에서 갯수, 금액 등을 관리하기 위한 인식코드로

많이 사용 할수 있을거 같네요

아 본문으로 돌아와서 C#에서 어떻게 문자열을 QR코드로 생성을 시키는지

보도록 하겠습니다

참고로 저도 인터넷 정보를 보고 연습을 하고 실전에 적용을 하는 입장이다 보니 검색을 통해 저보다 더 상세한 정보를 검색해 보실수 있으니 중복 검색은 필수 입니다

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

개발환경 : Visual Studio 2010 사용

QR코드 Generator DLL : 링크 참조

QR Code .NET Generator | Using free .NET sample to create QR Code barcodes

BizCode Generator for .NET Ultimate The most mature & flexible barcode SDK for Microsoft .NET Framework Quick Overviews Mature barcode creating SDK Support every .NET IDEs Support C#, VB.NET, etc. Dynamic barcodes support For all printers Overview QR Code More Barcode Tutorial C# Sample VB.NET S

www.businessrefinery.com

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

준비가 되셨다면 차근 차근 이미지로 하나씩 따라 해볼까요?

 

1. QR코드 Generator DLL 다운로드 받기

: 링크를 통해 싸이트 접속 후 DOWNLOAD 버튼 클릭

어렵지 않아요

 

2. 비쥬얼 스튜디오에 참조 시키기

1) 다운로드 받은 파일 압축 풀기

※ 압축을 풀었을때 사진 입니다 처음에는 압축형식으로 되어 있어요~

 

 

2) 참조 DLL 찾기

압축을 풀면 다음과 같은 구조로 압축이 풀리게 되는데

저희가 사용할 DLL의 위치를 알려드릴께요~

천천히 그림파일을 참고해서 따라오세요~

 

 

3) 비쥬얼 스튜디오 DLL 참조 시키기

기본적인 비쥬얼 스튜디오에 DLL참조하는 방법은

아마 다들 아실꺼라고 생각하고 대충 넘어가겠습니다

절대 귀찮아서가 아닙니다!!

비쥬얼 스튜디오에 DLL을 첨부 완료되고 난 뒤에 화면 입니다

자 이제 거의 끝나가요~ 별거 없죠?ㅋ

이제 소스 코드로 넘어갈건데요

간단합니다 7줄이면 끝이에요~

참 쉬죠잉~ㅋㅋㅋ

 

 

4) 소스 작성하기

참조시킨 DLL 사용을 위해 참조선언을 먼저 작성해 주세요

사용하실려는 페이지의 제일 상단에 아래와 같이 using문을 작성해주시고요~

 

그다음 아래와 같이 QR코드를 생성할 소스 코드를 입력합니다

참고로 저는 이미지로 보이지 않고 Bitmap으로 전환하여 레포트 툴과 연동 시킬 예정입니다

만약 이미지로 만드실 경우 맨 아래 쪽 구문의 주석을 바꿔주시면 됩니다

QRCode barcode = new QRCode(); string url = pFIELD[22, 3]; barcode.Code = url; barcode.ModuleSize = 6.0f; barcode.Resolution = 300; //이미지로 저장 //barcode.drawBarcode2ImageFile("Temp.png"); //Bitmap으로 전환하여 사용 var barcodebitmap = (Bitmap)barcode.drawBarcodeOnBitmap();

이미지로 표시 할 경우는 위의 구문으로 처리가 완료가 되고 이벤트를 주셔서 사용하시면 Debug폴더 안에 이미지로 생성이 됩니다

 

참고로 저는 레포트툴과 연동을 하기 위해 하나의 구문이 더 필요한데

아래의 구문은 어떤 레포트툴을 사용하시는냐에 따라 달라지기 때문에 참고만 하시기 바랍니다

ARViewer21.Document.Pages[ThisPage].DrawImage(barcodebitmap, false, LSHIFT + ExTTI(1400), PTM + ExTTI(7430), ExTTI(500), ExTTI(420));

네 이상으로 C#을 이용해 QR코드 생성하는 예제였습니다!

글로 이해 안되실분들을 위해서 영상 제작을 해보았습니다

글과 영상을 통해 QR코드를 만들어 나만의 프로그램을 제작해보시는건 어떨까요?ㅎㅎ

이상 코딩하는남자 였습니다!!

반응형

+ Recent posts