프로그램/C# 2013. 3. 25. 22:05

C# 깊은복사

출처:http://ksh6438.blog.me/20166470651

위 출처작성자와 본글 작성자 동일

 

깊은 복사 참조 타입은 값 타입과는 달리 대입에 의해 똑같은 객체를 생성할 수 없다. 

참조 타입끼리의 대입은 힙에 있는 객체의 번지만을 대입하는 것이므로 두 객체는 같은 대상을 

가리키고 있으며 그래서 한 쪽을 변경하면 다른 쪽도 같이 영향을 받는다. 

참조만 복사하는 이런 복사를 얕은 복사라고 한다. 대입에 의해 완전히 독립적인 사본을 생성하려면 

깊은 복사를 해야 하는데 이때는 ICloneable 인터페이스를 상속받아 Clone이라는 

메서드를 구현해야 한다.


Object Clone() 

인수는 취하지 않으며 자신과 똑같은 타입의 객체를 만들어 리턴한다. 임의의 타입에 대해서도 

사본을 리턴할 수 있어야 하므로 리턴 타입은 object이다. 

다음 예제는 Clone 메서드를 구현해서 깊은 복사를 한다.

class Basic : ICloneable
{
public int data;
      public Basic(int val)
      {
          data = val;
      }
      public object Clone()
      {
          return new Basic(data);
      }
}
 
Basic A = new Basic(1234);
Basic B = (Basic)A.Clone();
B.data = 4123;
Console.WriteLine("A = {0}, B = {1}", A.data, B.data);

Clone에서 자신의 값과 동일한 객체를 생성해서 리턴 함으로써 완전한 사본을 만든다. 

B를 A의 사본으로 만들고 싶을 때는 A의 Clone 메서드를 호출하면 된다. 이때 Clone은 

object를 리턴하므로 반드시 원하는 타입으로 캐스팅해야 한다. 

Clone에 의해 완전히 새로운 사본이 만들어지므로 B를 어떻게 수정하더라도 원본에는 

영향을 미치지 않는다

 

'프로그램 > C#' 카테고리의 다른 글

C# 윈도우7 관리자 권한 얻기  (0) 2013.03.25
C# 리스트뷰 체크된 아이템 얻기  (0) 2013.03.25
크로스 스레드 해결법  (0) 2013.03.19
C# 화면 캡쳐  (0) 2013.03.12
C# MDI 폼안에 폼 띵우기  (0) 2013.03.12
프로그램/C# 2013. 3. 25. 22:03

C# 윈도우7 관리자 권한 얻기

출처: http://blog.naver.com/dpdlrnsdla/140146744441

 

특정위치의 디렉토리에 쓰기등의 작업을 할때 관리자권한이 필요한 경우가 있는데

 

위 링크에 가면 해결방법이 있음.

 

app.menifest 파일을 수정

 

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

 

위와 비슷한 문구를 위로 대체하면 실행할때 관리자권한 승인여부를 물어보게됨.

 

감이 안온다면 위 링크 이동후 그림 참조

 

'프로그램 > C#' 카테고리의 다른 글

C# 깊은복사  (0) 2013.03.25
C# 리스트뷰 체크된 아이템 얻기  (0) 2013.03.25
크로스 스레드 해결법  (0) 2013.03.19
C# 화면 캡쳐  (0) 2013.03.12
C# MDI 폼안에 폼 띵우기  (0) 2013.03.12
프로그램/C# 2013. 3. 25. 21:59

C# 리스트뷰 체크된 아이템 얻기

출처:http://ksh6438.blog.me/20163188658

위 출처와 여기 작성자 동일

 

ListView.CheckedListViewItemCollection lstv_Checkitem = Lstv_Search_History.CheckedItems;
 
//체크된 아이템 검색
foreach (ListViewItem item in lstv_Checkitem)
{
    //ex) 삭제
    Lstv_Search_History.Items.Remove(item);
}

 

'프로그램 > C#' 카테고리의 다른 글

C# 깊은복사  (0) 2013.03.25
C# 윈도우7 관리자 권한 얻기  (0) 2013.03.25
크로스 스레드 해결법  (0) 2013.03.19
C# 화면 캡쳐  (0) 2013.03.12
C# MDI 폼안에 폼 띵우기  (0) 2013.03.12
프로그램/C# 2013. 3. 19. 22:54

크로스 스레드 해결법

출처: http://ksh6438.blog.me/20168654516

네이버 와 여기 작성자 동일

 

C#으로 개발하면서 스레드를 사용해야 할 상황이 있는데

 

InvalidOperationException 크로스 스레드 작업이 잘못되었습니다.

 

컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.

 

스레드에서 폼에 있는 예를들면 textbox.txt = "ABC";로 수정하는경우 위와 같은 에러가 발생한다.

 

해당 에러를 무시해도 된다고 생각하면 CheckForIllegalCrossThreadCalls = false;

 

 구문을 삽입하면 해당에러는 무시된다.

 

하지만 컨트롤 상태를 조작하는 스레드가 2개 이상 존재하는 경우 경합, 교착 상태 등의

 

스레드 관련 버그가 발생할 수 있어서 delegate를 활용해 invoke처리해야 한다.

#region label2

delegate void DsetLabel(string data);




private void SetLabel2(string data)

{

            if (label2.InvokeRequired)

            {

                DsetLabel call = new DsetLabel(SetLabel2);

                this.Invoke(call, data);

            }

            else

                label2.Text = data;

}

#endregion

위와 같이 코드를 작성하고 SetLabel2("종료"); 와 같은 형식으로 스레드 내에서 호출하면 크로스 스레드 관련 에러가 발생하지 않는다.

'프로그램 > C#' 카테고리의 다른 글

C# 윈도우7 관리자 권한 얻기  (0) 2013.03.25
C# 리스트뷰 체크된 아이템 얻기  (0) 2013.03.25
C# 화면 캡쳐  (0) 2013.03.12
C# MDI 폼안에 폼 띵우기  (0) 2013.03.12
C# 폼 투명하게 하기  (0) 2013.03.12
프로그램/C# 2013. 3. 12. 00:51

C# 화면 캡쳐

화면 캡쳐


   public void ScreenCapture(Size ScreenSize, String FileName)
 
        {
 
            Bitmap bitmap = new Bitmap(ScreenSize.Width,ScreenSize.Height);
 
            Graphics g = Graphics.FromImage(bitmap);
 
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), ScreenSize);
 
            bitmap.Save(FileName, ImageFormat.Bmp);
 
        }





'프로그램 > C#' 카테고리의 다른 글

C# 리스트뷰 체크된 아이템 얻기  (0) 2013.03.25
크로스 스레드 해결법  (0) 2013.03.19
C# MDI 폼안에 폼 띵우기  (0) 2013.03.12
C# 폼 투명하게 하기  (0) 2013.03.12
C# 파일경로  (0) 2013.03.08
프로그램/C# 2013. 3. 12. 00:49

C# MDI 폼안에 폼 띵우기

MDI

 Form2 dong =new Form2();
 dong.MdiParent=this; 
dong.Show();


폼안에서만 이동이 가능하다.

'프로그램 > C#' 카테고리의 다른 글

크로스 스레드 해결법  (0) 2013.03.19
C# 화면 캡쳐  (0) 2013.03.12
C# 폼 투명하게 하기  (0) 2013.03.12
C# 파일경로  (0) 2013.03.08
C# 메모리 줄이기, 메모리 강제회수  (0) 2013.03.08
프로그램/C# 2013. 3. 12. 00:46

C# 폼 투명하게 하기




private void Form1_Load(object sender, EventArgs e)
        {
            this.Visible = false;
            this.ShowInTaskbar = false;
        }
 ==========================
  label7.Parent = progressBar1;
 
transparent
 

 폼로드시 해당 함수호출
        private void WorkUnitSeting_Load(object sender, EventArgs e)
        {
            //배경이 있는 컨트롤 투명처리
            SetCtlsArgb();
        }
 
        /// 
        /// 배경이 있는 컨트롤 투명처리
        /// 
        private void SetCtlsArgb()
        {
            Control.ControlCollection coll = this.Controls;
            foreach (Control c in coll)
            {
                if (c != null)
                {
                    // CheckBox , Lable인 컨트롤의 경우 투명하게 처리합니다.
                    if (c.GetType() == typeof(CheckBox) || c.GetType() == typeof(Label))
                    {
                        c.BackColor = Color.FromArgb(0, 0, 0, 0);
                    }
 
                }
 
            }
        }





'프로그램 > C#' 카테고리의 다른 글

C# 화면 캡쳐  (0) 2013.03.12
C# MDI 폼안에 폼 띵우기  (0) 2013.03.12
C# 파일경로  (0) 2013.03.08
C# 메모리 줄이기, 메모리 강제회수  (0) 2013.03.08
C# 웹 검색  (0) 2013.03.08
프로그램/C# 2013. 3. 8. 02:11

C# 파일경로

C#.NET에서 파일경로를 손쉽게 다룰수 있도록 하는 내장객체..



기존의 프로그래밍에서는 파일의 경로부분을 얻기위해, split()나, mid(), right() 메서드 등을 사용하였습니다. 하지만 C#.NET에서는 Path객체를 통해서 확장자 부분만 얻기 외에 다수의 파일경로에 대한 처리를 지원하고 있습니다.

1. 먼저 사용하기 위해서는 using System.IO;를 선언해야합니다.
2. Path객체를 특별히 따로 선언해서 사용하는 것이아니라, static 메서드를 활용하여 경로부분을 원하는데로 다룰 수 있게 됩니다.

Path.ChangeExtension(string path) : 경로문자열에서 확장명 부분을 변경합니다.
Path.GetDirectoryName(string path) : 경로문자열에서 파일이름을 제외한 경로부분(디렉터리명)을 반환 합니다.
Path.GetExtension(string path) : 경로문자열에서 확장명 부분만 반환합니다.
Path.HasExtension(string path) : 경로문자열에서 확장명 부분이 있는지 확인하여 bool값으로 반환합니다.

Path.GetFileName(string path) : 경로문자열에서 파일이름부분을 반환합니다.
Path.GetFileNameWithoutExtension(string path) : 경로문자열에서 확장명부분을 제외한 파일이름을 반환합니다.
Path.GetFullPath(string path) : 경로문자열에 해당하는 절대경로를 반환합니다.
Path.GetPathRoot(string path) : 경로문자열에서 루트디렉터리(드라이브 명) 부분만 반환합니다.
Path.GetRandomFileName() : 파일 또는 폴더명으로 사용가능한 임의의 문자열을 반환합니다.
Path.GetTempFileName() : 임의로 임시파일을 생성 후, 생성된 임시파일의 경로를 반환합니다. 임시파일은 시스템의 지정된 임시폴더(Temp)에 생성됩니다.
Path.GetTempPath() : 시스템에 지정된 임시폴더의 경로를 반환합니다.
Path.IsPathRooted(string path) : 매개변수로 지정된 경로문자열이 상대경로인지 절대경로인지 파악하여 bool값으로 반환합니다. 절대경로이면 true를 반환합니다.
Path.GetInvalidFileNameChars() : 파일이름으로 부적합한 문자들의 배열을 반환합니다.
Path.GetInvalidPathChars() : 경로명으로 부적합한 문자들의 배열을 반환합니다.

 

'프로그램 > C#' 카테고리의 다른 글

C# MDI 폼안에 폼 띵우기  (0) 2013.03.12
C# 폼 투명하게 하기  (0) 2013.03.12
C# 메모리 줄이기, 메모리 강제회수  (0) 2013.03.08
C# 웹 검색  (0) 2013.03.08
C# 키 이벤트 ...  (0) 2013.03.08
프로그램/C# 2013. 3. 8. 02:08

C# 메모리 줄이기, 메모리 강제회수




using System.Runtime.InteropServices; 

 
 

        #region 강제 메모리 회수 

        [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = 

CharSet.Ansi, SetLastError = true)] 

        private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int 

maximumWorkingSetSize); 

        public static void FlushMemory() 
        { 

            GC.Collect(); 

            GC.WaitForPendingFinalizers(); 

            if (Environment.OSVersion.Platform == PlatformID.Win32NT) 
            { 

                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); 
            } 

        } 

        #endregion 



'프로그램 > C#' 카테고리의 다른 글

C# 폼 투명하게 하기  (0) 2013.03.12
C# 파일경로  (0) 2013.03.08
C# 웹 검색  (0) 2013.03.08
C# 키 이벤트 ...  (0) 2013.03.08
C# try - catch 예외 처리  (0) 2013.03.08
프로그램/C# 2013. 3. 8. 02:07

C# 웹 검색



//웹페이지 여는 함수 
  private void OpenWebPage(string uri) 
        { 
            System.Diagnostics.Process process = new System.Diagnostics.Process(); 
            process.StartInfo.FileName = uri; 
            process.Start(); 
        } 



        private void Searchgo_Click(object sender, EventArgs e) 
        { 
            StringBuilder str = new StringBuilder(); 
            // Append로 지정된 문자열의 복사본을 이 인스턴스의 끝에 추가 
            str.Append(textBox1.Text); 
          
            if (comboBox1.SelectedIndex == 0) 
            { 
                // textBox에 글자가 입력이 안되었을때.. 
                if (textBox1.Text == "") 
                    OpenWebPage("http://www.daum.net/"); 
                
                else 
                    OpenWebPage("http://search.daum.net/search?nil_suggest=btn&nil_ch=&rtupcoll=&w=tot&m=&lpp=&q=" + str.ToString()); 
            } 


            if (comboBox1.SelectedIndex == 1) 
            { 
                // textBox에 글자가 입력이 안되었을때 
                if (textBox1.Text == "") 
                    OpenWebPage("http://www.naver.com/"); 
            
                else  
                    OpenWebPage("http://search.naver.com/search.naver?sm=tab_hty&where=nexearch&query=" + str.ToString() + "&lr=&aq=f");                    
            } 
            if (comboBox1.SelectedIndex == 2) 
            { 
                // textBox에 글자가 입력이 안되었을때 
                if (textBox1.Text == "")                    
                    OpenWebPage("http://www.google.co.kr/"); 
                
                else 
                    OpenWebPage("http://www.google.co.kr/search?complete=1&hl=ko&q=" + str.ToString());                    
            } 
        } 





'프로그램 > C#' 카테고리의 다른 글

C# 파일경로  (0) 2013.03.08
C# 메모리 줄이기, 메모리 강제회수  (0) 2013.03.08
C# 키 이벤트 ...  (0) 2013.03.08
C# try - catch 예외 처리  (0) 2013.03.08
C# 소스코드 작성법  (0) 2013.03.08