블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2801)
Unity3D (857)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

Windows Forms FAQ

Programming/C# / 2011. 10. 25. 19:10
반응형

'Programming > C#' 카테고리의 다른 글

PropertyGrid 컨트롤 최대 활용  (0) 2011.10.26
ContextMenuStrip Item 동적 제어  (0) 2011.10.26
[링크] WinForm Study  (0) 2011.10.25
XML 특정 하위노드 및 자식노드를 좀 간단히 읽어보기  (0) 2011.10.25
[C#] xml 파싱  (0) 2011.10.25
Posted by blueasa
, |

[링크] WinForm Study

Programming/C# / 2011. 10. 25. 18:49
반응형

'Programming > C#' 카테고리의 다른 글

ContextMenuStrip Item 동적 제어  (0) 2011.10.26
Windows Forms FAQ  (0) 2011.10.25
XML 특정 하위노드 및 자식노드를 좀 간단히 읽어보기  (0) 2011.10.25
[C#] xml 파싱  (0) 2011.10.25
C#으로 xml 처리하기  (0) 2011.10.25
Posted by blueasa
, |

[퍼온글] : http://goodhelper.egloos.com/1916101

가끔 프로그램을 유지보수 하다 보면 종종 XML 을 읽어야 할때가 있습니다.

C# 은 그래도 꽤 간편한 언어에 속하는 편이라서 XML 을 로드해서 처리하기가
매우 쉽고 간단하게 됩니다~

C#에서 XML 을 읽어 올때 주로 사용하되는게 XmlTextReaderXmlDocument 가 있습니다.

이번 포스트에서는 XmlDocument를 이용하여 XML을 로드하고 그중 자식노드 및 특정 자식 노드값을
읽어서 배치해 보겠습니다.

<?xml version="1.0" encoding="EUC-KR" standalone="yes" ?>
<main>
<main_node>
<class>1학년</class>
<class>2학년</class>
<class>3학년</class>
<class_name>
<code>예술반</code>
<code_name>미술</code_name>
<code_count>10명</code_count>
<class_teacher>
<teacher>홍길동 선생</teacher>
<teacher_sex>남자</teacher_sex>
</class_teacher>
<school>
<code>12345</code>
<code_name>예술학교</code_name>
</school>
</class_name>
</main_node>
</main>

위와 같은 XML을 불러 올때 고민스러운건 중복된 태그명이 존재한다는거와 자식노드들이 있다는 겁니다
물론 방법론적으론 자식노드 리스트를 작성하고 ChildNode 를 사용하여 for 문으로 돌려서 구할 수 있지만
아무래도 소스가 복잡해지고 무엇보다 파싱하기가 귀찮지요~~ ㅎ

다행히 csharp-examples.netJan Slama 란 분히 저같은 사람을 위해 간단히 파싱하는 법을 올려놨네요~ ^^;

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.Xml;
using System.IO;

namespace xml_load {

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void Form1_Load(object sender, EventArgs e)
{
string url = @"http://www.Xml주소/XML파일.xml"; //xml 을 불러올 주소 (로컬은 c:\\디렉토리명 이 되겠지요~)

try
{
XmlDocument xml = new XmlDocument ();

xml.Load(url);

XmlNodeList xnList = xml.SelectNodes( "/main/main_node/class_name" ); //접근할 노드


foreach (XmlNode xn in xnList)
{

string part1 = xn["code"].InnerText; //예술반 불러오기
string part2 = xn["code_name"].InnerText; //예술반 code_name 불러오기
string part3 = xn["class_teacher"]["teacher"].InnerText; //선생님 이름
string part4 = xn["school"]["code"].InnerText; //학교노드의 code 불러오기
string part5 = xn["school"]["code_name"].InnerText; //학교노드의 code_name 불러오기

richTextBox1.AppendText(part1 + " | " + part2 + " | " + part3 + " | " + part4 + " | " + part5);

}

}

catch (ArgumentException ex)
{

MessageBox.Show("XML 문제 발생\r\n" + ex);

}

}
}
}

반응형

'Programming > C#' 카테고리의 다른 글

Windows Forms FAQ  (0) 2011.10.25
[링크] WinForm Study  (0) 2011.10.25
[C#] xml 파싱  (0) 2011.10.25
C#으로 xml 처리하기  (0) 2011.10.25
현재 Process의 한영 정보 얻기  (0) 2011.10.10
Posted by blueasa
, |

[C#] xml 파싱

Programming/C# / 2011. 10. 25. 12:51

xml Product_Key의 Name을 읽어서 ComboBox에 Items를 추가한다.

ComboBox의 List중에서 하나를 선택하면 Key의 값을 TextBox에 나타내 준다.

1. form1 디자인

ComboBox 이름 : cbname

TextBox 이름 : tbkey

2. xml 구조

<YourKey>
<Product_Key Name="1">
<Key>1</Key>
</Product_Key>
<Product_Key Name="2">
<Key>2</Key>
</Product_Key>
<Product_Key Name="3">
<Key>3</Key>
</Product_Key>
<Product_Key Name="4">
<Key>4</Key>
</Product_Key>
</YourKey>

3. form1 코드

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.Xml;
using System.IO;

namespace xmlparsing
{
public partial class Form1 : Form
{
bool select = false;

public Form1()
{
InitializeComponent();
this.Load += new EventHandler(Form1_Load);
this.cbname.SelectedIndexChanged += new EventHandler(cbname_SelectedIndexChanged);
}

void Form1_Load(object sender, EventArgs e)
{
getList();
}

void cbname_SelectedIndexChanged(object sender, EventArgs e)
{
select = true;
getList();
}

private void getList()
{
string url = Environment.CurrentDirectory + "\\keys.xml";
try
{
XmlDocument xml = new XmlDocument();
xml.Load(url);
XmlElement keyList = xml.DocumentElement;

XmlNodeList xnList = xml.SelectNodes("/YourKey/Product_Key");

foreach (XmlNode node1 in xnList)
{
if (select)
{
string sKeyName = node1.Attributes["Name"].Value;
string sKey = node1["Key"].InnerText;
if (cbname.SelectedItem.ToString() == node1.Attributes["Name"].Value)
{
tbkey.Text = sKey;
}
}
else
{
string sKeyName = node1.Attributes["Name"].Value;
cbname.Items.Add(sKeyName);
}
}
}
catch (Exception)
{
throw;
}
}

}
}

------------------------------------------------------------------------------------------

자식 노드가 여러개인경우

1. form1 디자인

ComboBox 이름 : cbname

ListBox 이름 : lbname

2. xml 구조

<YourKey>
<Product_Key Name="1">
<Key>1</Key>

<Key>2</Key>
<Key>3</Key>
</Product_Key>
<Product_Key Name="2">
<Key>4</Key>

<Key>5</Key>

<Key>6</Key>
</Product_Key>
</YourKey>

3. form1 코드

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.Xml;
using System.IO;

namespace xmlparsing
{
public partial class Form1 : Form
{
bool select = false;

public Form1()
{
InitializeComponent();
this.Load += new EventHandler(Form1_Load);
this.cbname.SelectedIndexChanged += new EventHandler(cbname_SelectedIndexChanged);
}

void Form1_Load(object sender, EventArgs e)
{
getList();
}

void cbname_SelectedIndexChanged(object sender, EventArgs e)
{
lbname.Items.Clear();
select = true;
getList();
}

private void getList()
{
//string url = @"c:\\keys.xml";
string url = Environment.CurrentDirectory + "\\keys.xml";
try
{
XmlDocument xml = new XmlDocument();
xml.Load(url);
XmlElement keyList = xml.DocumentElement;

XmlNodeList xnList = xml.SelectNodes("/YourKey/Product_Key");

foreach (XmlNode node1 in xnList)
{
if (select)
{

if (cbname.SelectedItem.ToString() == node1.Attributes["Name"].Value)
{

XmlNodeList nodeChilds = node1.ChildNodes;

for (int i = 0; i < nodeChilds.Count; i++)
{
XmlElement eChild = (XmlElement)nodeChilds[i];
string sKey = eChild.InnerText;
lbname.Items.Add(sKey);
}
}
}
else
{
string sKeyName = node1.Attributes["Name"].Value;
cbname.Items.Add(sKeyName);
}
}
}
catch (Exception)
{
throw;
}
}

}
}

[출처] [C#] xml 파싱|작성자 한심이79

반응형
Posted by blueasa
, |

File stream과 XmlDocument class를 이용하는 방법입니다.

파일을 모두 읽어서 메모리로 로드하고, 메모리의 데이터를 읽기, 쓰기, 수정, 삭제 등을 하고 다시 파일로 저장하는 방식입니다.

데이터가 그리 크지 않을 경우 적당해 보이고, 파일이 클 경우 메모리 압박이 예상 됩니다.

 

출처: http://www.codeguru.com/Csharp/Csharp/cs_data/xml/article.php/c9427/

Downloads: SourceCode.zip - Download source code - 3 Kb

Display Contents of XML File

Listing 1 shows a simple XML file for demonstration:

Listing 1

<?xml version="1.0"?>
<Books>
  <Book ID="001">
    <Author>Mark</Author>
    <Publisher>Sams</Publisher>
  </Book>

  <Book ID="002">
    <Author>Joe</Author>
    <Publisher>AWL</Publisher>
  </Book>
</Books>

To test the above XML file for errors, simply open it with your browser. If it has no errors, the file will be displayed as such.

The next step is to display all the data using a C# console application (see Listing 2).

Listing 2: DisplayCatalog.cs

XmlNodeList xmlnode = xmldoc.GetElementsByTagName("Book");
   Console.WriteLine("Here is the list of catalogs\n\n");

   for(int i=0;i<xmlnode.Count;i++)
   {
   XmlAttributeCollection xmlattrc = xmlnode[i].Attributes;

   //XML Attribute Name and Value returned
   //Example: <Book id = "001">

   Console.Write(xmlattrc[0].Name);
   Console.WriteLine(":\t"+xmlattrc[0].Value);

   //First Child of the XML file - Catalog.xml - returned
   //Example: <Author>Mark</Author>

   Console.Write(xmlnode[i].FirstChild.Name);
   Console.WriteLine(":\t"+xmlnode[i].FirstChild.InnerText);

   //Last Child of the XML file - Catalog.xml - returned
   //Example: <Publisher>Sams</Publisher>

   Console.Write(xmlnode[i].LastChild.Name);
   Console.WriteLine(":\t"+xmlnode[i].LastChild.InnerText);
   Console.WriteLine();

Listing 2 is just an extract from the DisplayCatalog() method of the C# application. It displays the data from the XML file. It uses theXMLNodeList class to retrieve the relevant XML node and then iterates it with the help of the for loop and the Count property of the class. Inside the loop, it creates an instance of the XMLAttributeCollection class and displays the appropriate values using the properties of the class.

Inside the constructor, the code creates an instance of the FileStream class and sets the required permissions (see Listing 3). It then loads the XML document with the help of the XMLDocument class and loads the required instance of the FileStream class with the Load() method of the XMLDocument class.

Listing 3: DisplayCatalog.cs

FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read,
                               FileShare.ReadWrite);
   xmldoc = new XmlDocument();
   xmldoc.Load(fs);
   DisplayCatalog();

 

The final output looks like the display in Figure 1.

Figure 1: Final Output from Listings 2 and 3

The above walkthrough showed how to display the contents of an XML file using a C# program. The next section demonstrates how to write data directly to the XML file using a C# console application.

Write Data Directly to XML File

Listing 4 appends a new catalog entry to the XML document using the various properties and methods of the XMLDocument class.

Listing 4: AddCatalog.cs

// New XML Element Created
XmlElement newcatalogentry = xmldoc.CreateElement("Book");

// New Attribute Created
XmlAttribute newcatalogattr = xmldoc.CreateAttribute("ID");

// Value given for the new attribute
newcatalogattr.Value = "005";

// Attach the attribute to the XML element
newcatalogentry.SetAttributeNode(newcatalogattr);

// First Element - Book - Created
XmlElement firstelement = xmldoc.CreateElement("Book");

// Value given for the first element
firstelement.InnerText = "Peter";

// Append the newly created element as a child element
newcatalogentry.AppendChild(firstelement);


// Second Element - Publisher - Created
XmlElement secondelement = xmldoc.CreateElement("Publisher");

// Value given for the second element
secondelement.InnerText = "Que Publishing";

// Append the newly created element as a child element
newcatalogentry.AppendChild(secondelement);

// New XML element inserted into the document
xmldoc.DocumentElement.InsertAfter(newcatalogentry,
                                   xmldoc.DocumentElement.LastChild);

// An instance of FileStream class created
// The first parameter is the path to the XML file - Catalog.xml

FileStream fsxml = new FileStream(path,FileMode.Truncate,
                                  FileAccess.Write,
                                  FileShare.ReadWrite);

// XML Document Saved
xmldoc.Save(fsxml);


 
반응형
Posted by blueasa
, |

HIMC ImmGetContext(HWND); -> IME 를 가져온다.

BOOL ImmGetOpenStatus(HIMC ); ->return 값이 1이면 한글 0이면 영문

< 예제 >

HIMC hIMC;
int hanFlag=-1;

hIMC = ImmGetContext(wnd->m_hWnd);


// 한영상태를 얻는다.
// hanFlag가 1이면 한글 0이면 영문
hanFlag=ImmGetOpenStatus(hIMC );


if(hanFlag)
{
m_imm.SetWindowText((LPCTSTR)"H");
}
else
{
m_imm.SetWindowText((LPCTSTR)"E");
}

반응형

'Programming > C#' 카테고리의 다른 글

[C#] xml 파싱  (0) 2011.10.25
C#으로 xml 처리하기  (0) 2011.10.25
C# 경로(Path) 요소 분리하기  (0) 2011.09.16
C# XML 다루는 간단한 소스  (0) 2011.09.16
DLL 파일을 별도 폴더에서 관리하자  (0) 2011.09.14
Posted by blueasa
, |

Libci.lib에 대한 Link 에러 문제이군요.

VS .NET 2003으로 오면서 2002까지 지원하던 '구 버전의 iostream Library'를 더이상 'CRT'에 포함하지 않게 되었습니다.

'구 버전의 iostream Library'가 무엇인고 하니 바로 아래에 나와있는 것들입니다.

LIBCI.lib : Single-thread, Static Link /ML
LIBCIMT.lib : Multithreaded, static link /MT
MSVCIRT.lib : Multithreaded, dynamic link /MD

이것들이 이제 더이상 존재하지 않습니다. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib 경로를 살펴보면 없지요.

'새 버전의 iostream Library'는 다음과 같습니다.

LIBC.lib : Single-threaded, static link /ML
LIBCMT.lib : Multithreaded, static link /MT
MSVCRT.lib : Multithreaded, dynamic link /MD

딱 보니까 이름 짓는 규칙을 아시겠지요? 'i'자가 붙은 게 바로 구형 iostream이고 MS에서 사장시키기로 작정한 것 같습니다. (각 lib의 디버그 버전에는 파일명에 'd'자가 하나씩 더 붙지요.)

원래는 LIBC.lib와 그의 형제들에 구 버전의 iostream이 탑재되어 있었는데, VC++ 4.1 이후부터 iostream을 바꾸고, 기존 것을 계속 쓰고자 하는 사용자를 위해 'i'자를 붙인 Library를 따로 만들어 분리시켜버린 것 같습니다.

말썽을 일으키고 있는 프로젝트와 '인터넷에서 구한 소스' 등이 말썽을 일으키는 것은, 해당 프로젝트에서 구 버전의 iostream을 사용하도록 'Default Library'를 명시적으로 지정하였기 때문이 아닌가 싶네요.

이 문제를 피할려면, 기존 프로젝트의 Default Library를 무시하도록 링커 옵션에서 '모든 기본 라이브러리 무시'를 선택하시거나 '특정 라이브러리 무시' 선택하시기 바랍니다. 이렇게 하면 /NODEFAULTLIB 링커 옵션이 추가됩니다.

이 내용들은 MSDN에 보다 상세하게 나와있습니다.

반응형
Posted by blueasa
, |

LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR80D.dll)

닷넷 2005에서 .lib를 사용할 때..

디버그용과 릴리즈용을 구분지어줘야 한다.

즉, 프로그램을 디버그 모드인 프로그램에서, 릴리즈 모드로 컴파일 된 lib를 인클루드 할 경우

LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR80D.dll) 와 같은 링크 에러가 발생한다.

Multi-threaded (/MT) : 릴리즈용

Multi-threaded Debug (/MTd) : 디버그용

DLL도 마찬가지.

반응형
Posted by blueasa
, |
어젠가 그젠가 MSDN 보다가 재미난 문서를 발견했습니다. 안전한 DllMain을 작성하는 방법에 관한 글인데, 이 곳에서 다운로드 받아서 보실 수 있습니다. DLL의 로딩 과정과 로더 락에 관한 설명을 곁들여서 왜 그런 일들이 문제를 일으키는지 자세히 설명해 준답니다. 심심하지 않으신 분들도 꼭 챙겨보세요. ㅋ~ 

아래는 문서 내용 중에 괜찮은 부분 같아서 퍼온 겁니다. 의외로 저런 작업들을 하는 코드를 만나는 경우가 많습니다. 대부분 문제가 발생하지 않더라도 어디선간 문제가 발생하고 있다는 것을 의미하는 거겠죠. 좀 더 자세한 시나리오와 함께 문제를 설명해줬으면 했는데 그런 부분이 없는 것이 약간 아쉽더군요.

경고!!! 
DllMain에서 다음 작업들은 절대로 하지 말 것.

  1. LoadLibrary, LoadLibraryEx 호출. 데드락이나 크래시를 유발한다.
  2. 다른 스레드와 동기화. 데드락을 유발한다.
  3. 로더 락을 획득하려는 코드가 가지고 있는 동기화 오브젝트를 획득하려는 시도. 데드락을 유발한다.
  4. CoInitializeEx를 사용한 COM 스레드 초기화. 특정 조건이 충족될 경우 이 함수는 LoadLibraryEx를 호출한다.
  5. 레지스트리 함수들. 이 함수들은 advapi32.dll에 구현되어 있다. advapi32.dll이 초기화 되지 않았다면 크래시가 발생할 수 있다.
  6. CreateProcess 호출. 프로세스 생성은 다른 DLL을 로드할 수 있다.
  7. ExitThread 호출. DLL 디태치(detach) 과정 중에 스레드를 종료하면 로더 락을 다시 획득하도록 만들 수 있다. 이는 데드락이나 크래시가 유발된다.
  8. CreateThread 호출. 동기화만 하지 않는다면 스레드 생성은 괜찮을 수 있다. 하지만 위험하다.
  9. 네임드 파이프나 네임드 오브젝트 생성 (2000만 해당한다). 윈도우 2000에서 네임드 오브젝트 생성은 터미널 서비스 DLL에서 구현되어 있다. 해당 DLL이 초기화되어 있지 않다면 크래시.
  10. CRT에 포함된 메모리 관리 함수들. CRT DLL이 초기화되어 있지 않다면 크래시.
  11. user32.dll이나 gdi32.dll에 포함된 함수 호출. 일부 함수들은 다른 DLL을 로드하고, 이 사실은 크래시가 발생할 수 있다는 것을 의미한다.
  12. 관리된 코드 사용.
* 가장 아름다운 DllMain은 존재하지 않는 것이다 (비어 있는 함수 바디).
** 그래도 먼가 하고 싶다면 kernel32.dll에 포함된 함수 중에 위에서 언급되지 않은 것들만 쓰도록 한다. kernel32.dll이 초기화는 운영체제가 보장해 준다. 
*** 글로벌 오브젝트에 대한 초기화 코드 또한 DllMain 과정에 포함된다. 따라서 글로벌 오브젝트의 생성자 내지는 초기화 함수 부분에 위에서 언급한 내용이 있어서는 안된다.
**** 초기화를 하지 말란 소린가? 아니다. 지연시키라는 말이다.

요 근래엔 정말 컴터 책은 한 권도 안 읽은 것 같네요. 참신한 책 있으면 추천 좀 해주세용. 《실용주의 프로그래머》나 《The Art Of Unix Programming》을 보면서 흘렸던 눈물이 그립군요. 그나마 제프리 아저씨의 신간이 있었지만, 그마저도 사실 전 전판에 비해서 큰 차이를 보기는 힘들었던 것 같습니당.

출처 : http://www.jiniya.net/tt/788
반응형
Posted by blueasa
, |
반응형

'Programming > C#' 카테고리의 다른 글

C#으로 xml 처리하기  (0) 2011.10.25
현재 Process의 한영 정보 얻기  (0) 2011.10.10
C# XML 다루는 간단한 소스  (0) 2011.09.16
DLL 파일을 별도 폴더에서 관리하자  (0) 2011.09.14
[펌] 입력 문자 검사  (0) 2011.09.14
Posted by blueasa
, |