D-Day

오늘날짜를 기준으로, 지정된 날짜 이전의 데이터를 삭제.. 등등의 작업을 위한것..

 

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

사용: datagridview, combobox 사용,

DataSet 및 Xml 파일 사용

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

// d-day function
private void SetClearDDay(int nDay)
{
// default color = white.
Color cBackcolor = Color.White;

// 출력할 기본 날짜
int nDateBase = 0;

// 날짜 처리 d-day
int nDateDDay = 0;
StringBuilder szbDate = new StringBuilder(32);

// 현재 날짜를 구한 후 d-day 날짜만큼 제외한다.
// 01234567890123456789012 (10번째위치부터 22번째까지 모두 제거)
// 2012-07-09 13:10:11.111
szbDate.Append(DateTime.Today.AddDays(-1 * nDay).ToString());
szbDate.Remove(10, szbDate.Length - 10);
nDateDDay = Convert.ToInt32(szbDate.ToString().Replace("-", ""));

// Data grid 내용을 모두 지운다.
dataGridView_history.Rows.Clear();

// dt.Tables[0] -> 첫번째 테이블 사용함, DataTable로 나옴.
foreach (DataRow r in _dsAlarm.Tables[0].Rows)
{
// data grid view에 instance node 속성값을 출력
int rIndex = dataGridView_history.Rows.Add();
for (int i = 0; i < nFieldCnt; i++)
{
// string 연산은 string보다 stringbuilder가 더 빠르다.
// ex) string은 신규 제어시 string 객체를 생성하지만, stringBuilder는 그렇지 않다.
StringBuilder szbTemp = new StringBuilder(32);
szbTemp.Append(r[_szField[i]].ToString());

// occurtime 발생 Time을 확인하고, 범위내에 있는지 조사 후 출력한다.
if (i == 2)
{
szbTemp.Remove(10, szbTemp.Length - 10);
nDateBase = Convert.ToInt32(szbTemp.ToString().Replace("-", ""));

// D-Day 기간보다 작으면(즉 D-Day보다 큰날짜만 출력) 출력하지 않는다.
if ((nDateBase < nDateDDay))
{
dataGridView_history.Rows.RemoveAt(rIndex);
break;
}
}

dataGridView_history.Rows[rIndex].Cells[i].Value = r[_szField[i]].ToString();

// type에 따른 color 설정, 외부에서 설정 가능
if (i == 5) // type
{
if (r[_szField[i]].ToString().Equals("heavy"))
cBackcolor = _cHeavyColor;
else if (r[_szField[i]].ToString().Equals("light"))
cBackcolor = _cLightColor;
else
cBackcolor = Color.White;

// Alarm Name field color 변경
dataGridView_history.Rows[rIndex].Cells[1].Style.BackColor = cBackcolor;
}
}
}

// form을 로딩하면 첫번째 줄이 선택되어있는데, 이 부분을 해제한다.
dataGridView_history.Rows[0].Selected = false;
}

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

 

string szpath = @"c:\alarm_history.xml";
if (!System.IO.File.Exists(szpath))
{
string szbuf = string.Empty;
szbuf = string.Format("file not exist! filename: {0}", szpath);
MessageBox.Show(szbuf);
return;
}

// 동작 xml file -> DataSet loading -> DataGridView 출력
//DataSet - 간단히 DB의 데이터 베이스라고 생각하면 쉽다.
//DataTalbe - 간단히 DB의 테이블 이라고 생각하면됨.
//DataRow - Table 내의 Record로 보면된다.
DataSet dt = new DataSet();
dt.ReadXml(szpath);

// DataSet의 첫번째 테이블의 DataRow를 이용
// dt.Tables -> DataTableCollection으로 나옴.
// dt.Tables[0] -> 첫번째 테이블 사용함, DataTable로 나옴.
// dt.Tables[0].Rows -> DataRowCollection
// foreach 를 이용하여 전체 DataRow를 읽어서 데이터 입력함.
// Collection 은 여러개의 집합을 의미한다고 생각하면됨
foreach (DataRow r in dt.Tables[0].Rows)
{
// data grid view에 instance node 속성값을 출력
int n = dataGridView1.Rows.Add();
dataGridView1.Rows[n].Cells[0].Value = r["alarm_id"].ToString();
dataGridView1.Rows[n].Cells[1].Value = r["alarm_cd"].ToString();
dataGridView1.Rows[n].Cells[2].Value = r["alarm_text"].ToString();
dataGridView1.Rows[n].Cells[3].Value = r["alarm_desc"].ToString();
}

 

하기는 데브피아에 XML 데이터 취득 관련해서 올린 글과 답변입니다.

 

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

개발중에 궁금한 사항이 있어 문의드립니다.^^

enum을 선언하여 사용중인데,

enum에 <summary> 태크를 사용하여 관련 정보를 넣어두었습니다.

 

다른 app에서 enum을 사용하려하면 제가 기작성한 <summary> 태크 정보가 보여지는데요.

 

요 summary 정보를 직접 가져오는 방법이 있을까요?

 

.Net도 어딘가 정보를 넣어두고 빼오는것 같은데..

답변 부탁드립니다.^^

 

수고하세요.

 

 

* 부가 설명 *

 

/// <summary>
/// E_SAMPLE 정보 설정
/// </summary>
public enum E_SAMPLE
{
/// <summary>
/// TEST1 입니다.
/// </summary>
TEST1 = 1,
/// <summary>
/// TEST2 입니다.
/// </summary>
TEST2,
ETC
}

 

E_SAMPLE.TEST1 하면 TEST1의 summary 정보가 보여지는데,

요걸 string등으로 저장하는 방법을 문의드립니다.

 

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

.../ 답변

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

http://jimblackler.net/blog/?p=49

위 사이트를 보시면

DocsByReflection 이라는걸 제공하고 있네요~

참고하시면 원하시는 기능을 구현하실 수 있을듯 합니다.

 

combobox

 

// 초기화

checkBox.Items.Clear();

// 데이터 넣기

checkBox.Items.Insert(..........);

 

trackbar

// 범위 설정

trackbar.SetRange(0, 999);

// 값 가져오기

trackbar.Value.ToString();

 

RadioButton 순서

// UI의 Panel controller 추가 후에

// Panel위에 그룹단위로 사용할 RadioButton을 추가하면 됨.

// 구조체 초기화 방법 데브피아 발췌..
struct test
{
public string AAA;
public string BBB;

public test(object obj)
{
this.AAA="a";
this.BBB="a";

}
}

 

구조체를 new로 생성하면 자동 초기화 된다.

 

// 구조체 배열 선언방식

[StructLayout(LayoutKind.Sequential)]

public struct Packet

{

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
byte[] aaa = new byte[2];

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
short[,] bbb= new short[2, 3];

}

 

 

struct ME
{
public char[] a ;
public short b;
public float c;
}

 

ME InitMe()

{

ME obj=new ME;

obj.a=new char[10];

obj.b=0;

obj.c=0;

return ME;

}


private void main()
{
ME ab = InitMe();


ab.b = 43;
}

 

이런식으로 하시면 되죠.. InitMe()같은걸 구조체에 넣어버리는게 클래스 객체 생성자죠.

 

String과 StringBuilder는 문자열을 다루는 객체들이다.

But.

String과 StringBuilder는 문자열을 다루는데 있어 차이점이 있다.

String은 문자열을 처리하는 과정(추가, 삭제, 변환등등)에서

새로은 객체를 생성해야만 한다.

즉, string test = "aaa";

string test2 = test.Replace("");

때문에 많은 양의 오퍼레이션 동작을 진행하게되면

속도 저하와 메모리 누적이 발생된다.

 

StringBuilder는 정해진 객체의 크기를 정해놓고 사용가능하다.

즉 StringBuilder test = new StringBuilder(12);

이러면 자동으로 12*2 만큼의 메모리 공간을 할당해놓는다.

문자열 처리는 메소드로 제공해주는 함수를 사용한다

하기는 속도비교인데, 확실히 StringBuilder 가 빠르다.

 

class MainApp
{
static void Main(string[] args)
{
DateTime startTime;
TimeSpan elapsed;

String str1 = "";
startTime = DateTime.Now;
for (int i = 0; i < 50000; i++)
{
str1 += "H"; //새로운 문자열 생성하기
}
elapsed = DateTime.Now - startTime;
Console.WriteLine("String : {0}", elapsed.Milliseconds);

StringBuilder sb = new StringBuilder();
startTime = DateTime.Now;
for (int i = 0; i < 50000; i++)
{
sb.Append("H"); //새로운 문자열 추가하기
}
elapsed = DateTime.Now - startTime;
Console.WriteLine("StringBuilder : {0}", elapsed.Milliseconds);
}
}

 

////// string 변경시 다른곳에 객체 생성

///// StringBuilder 변경시 동일한 곳에서 변경

// 관련 테스트는 하기와 같다.

string sztemp = "test";
int a =sztemp.GetHashCode();
sztemp += "test2";
int b = sztemp.GetHashCode();

StringBuilder szBld = new StringBuilder(256);
int c = szBld.GetHashCode();
szBld.Append("test2");
int d = szBld.GetHashCode();

 

이렇게 선언된 경우,

a, b는 다른곳을, c,d는 같은 곳을 가르킨다.

즉, string은 다시 생성, StringBuilder는 같은장소에서 변경..

 

하기는 디버깅시 hashcode 값이다.

 

 

using Microsoft.Win32; // for registry

/*
* This region used to control the Registry value.
*/

#region [ Registry Control ]
const string strUserRoot = "HKEY_CURRENT_USER\\SOFTWARE";

//
// set string value to registry
public void setRegistry(string strSubKey, string strName, object objValue)
{
// The name of the key must include a valid root.
string strKey = strUserRoot + "\\" + strSubKey;

try
{
Registry.SetValue(strKey, strName, objValue);
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

//
// get interger value from registry
public int getRegInteger(string strSubKey, string strName)
{
// The name of the key must include a valid root.
string strKey = strUserRoot + "\\" + strSubKey;

try
{
return Convert.ToInt32(Registry.GetValue(strKey, strName, 10));
}
catch (NullReferenceException ex)
{
// set temp value
setRegistry(strKey, strName, false);
return Convert.ToInt32(Registry.GetValue(strKey, strName, null));
}

catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return 0;
}
}

//
// get string value from registry
public string getRegString(string strSubKey, string strName)
{
// The name of the key must include a valid root.
string strKey = strUserRoot + "\\" + strSubKey;

try
{
return (string)Registry.GetValue(strKey, strName, null);
}
catch (NullReferenceException ex)
{
// if register key isn't in the Register, function will return NullReferenceException.
//
// 레지스터 안에 레지스터 키 값이 없다면 Registry.GetValue() 는 NullReferenceException 이 발생하며
// 이를 방지하기 위해 Register Key를 Registry.SetValue() 를 사용해 생성한 후 다시 Registry.GetValue()를 한다.
setRegistry(strKey, strName, false);

return (string)Registry.GetValue(strKey, strName, null);

}

catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return null;
}
}
#endregion

사용
const string strSubKey = "ComOption";
private void getComOption()
{
// Call method from registry
int iMethod = (int)utility.getRegInteger(strSubKey, "method");
}

 

 

질문:

같은 형식의 클래스나 구조체를 받는 객체를 2개

생성해서 그것들을 값에의한 참조하는 법을 알고 싶습니다.

단순히 a=b와 같이 한다면 둘이 같은 것을 가리키기 때문에 그방법

말고 주소는 다르되 값만 복사되는 것이 궁금해요.

물론 그 안에 변수등을 일일히 대입해주는 방법 말구요...

 

답변:

복사 생성자를 말씀하시는 것 같습니다. 시샵은 복사 생성자의 개념을 이용하지 않습니다. 다른 방법이있다면, 모든 시샵 클래스는object를 부모 클래스로 두는 것을 염두에 두시면, object 클래스의 Clone() 또는 MemberwiseClone 메서드를 이용해야 할 것 같습니다. 그러기 위해서는ICloneable interface를 상속해서 구현해야합니다.

사용 예제 입니다.

class A : System.ICloneable

{

private int foo = 10;

public int Foo

{

get { return foo; }

set {foo = value; }

}

public A(){}

#region ICloneable Members

public object Clone()

{

// TODO: Add A.Clone implementation

return this;

}

#endregion

}

static void Main(string[] args)

{

A a = new A();

// Cloneobject 리턴하므로 형변환이 필요합니다.

A b = (A)a.Clone();

Console.WriteLine("{0}, {1}", a.Foo, b.Foo);

a.Foo = 50;
Console.WriteLine("{0}, {1}", a.Foo, b.Foo);

}

결과: 10, 10

50, 50

'프로그래밍 > .Net' 카테고리의 다른 글

string vs StringBuilder 성능차이  (0) 2014.01.17
Registry 사용하기  (0) 2014.01.17
string 문자열 파싱해보자  (0) 2014.01.17
c# 소멸자 만들기  (0) 2014.01.17
delegate 활용 함수 콜..  (0) 2014.01.17

문자열 파싱을 하기와 같이 해보자구~~

 

string szSim = "+6.25E+01,0,+5.00E+01,0;+4.00E+01,0,+3.00E+01,0");

string szOldDelim = ";", szNewDelim = ",";
char[] cOldDelim = szOldDelim.ToCharArray();
char[] cNewDelim = szNewDelim.ToCharArray();

string szSub = szSim.Replace(szOldDelim, szNewDelim);
string[] szSplit = szSub.Split(cNewDelim);
szSplit배열 변수에는 "," 구분으로 8개의 데이터가 들어가 있으며

배열[0] .. [7]까지 원하는 오퍼레이션 작업을 진행하면 된당.^^

 

하기 사이트에서 발췌함

[출처] [C#] 소멸자 (de-constructor, finalizer)|작성자 에스이오케이

객체가 사라질 때 정리 작업을 수행한다.
생성자와 소멸자는 프레임워크에 의해 자동으로 호출된다.
C#에서는 다른 언어에 비해 소멸자를 잘 사용하지 않으며 필요한 경우도 드물다.
리소스 관리가 가비지 컬렉터에 의해 자동화되어 있기 때문이다.

 

소멸자가 필요한 상황은 프레임워크에 의해 관리되지 않은 리소스를 할당했거나 가비지 컬렉터가 해제할 수 없는 자원을 사용했을 때에 국한된다.


예를 들어 파일을 열어 놓았다거나 네트워크 연결을 해 놓았다면 소멸자에서 이런 비관리 자원을 해제해야 한다.
또는 화면 해상도나 사운드 카드의 볼륨처럼 메모리와 직접적인 상관이 없는 환경을 변경시켰을 때에도 원래대로 복구할 소멸자를 만들 필요가 있다.

 

** 파일 오픈, 권한 획득, 하드웨어 상태 변경 등은 가비지 컬렉터의 능력 밖이다. 이러한 비관리 자원은 최초 자원을 할당한 클래스의 소멸자에서 직접 처리해 주어야 한다.


** 가비지 컬렉터는 백그라운드에서 유휴 시간에 끼어들어 쓰레기 수집을 하므로 동작 시점은 예측할 수 없다. 따라서 객체 소멸 직후에 자원이 바로 해제된다고 보장할 수 없다.

 

** 객체 소멸 시에 리소스를 곧바로 해제하고 싶다면 가비지 컬렉터에 명시적으로 자원 해제를 요구하거나 IDisposable 인터페이스를 상속받아 Dispose 메서드를 구현하여 명시적 호출에 의해 비관리 자원이 해제되게끔 하는 방법을 택하는 것이 옳다. 단, 사용자가 Dispose의 호출을 잊어버릴 수도 있기 때문에 최소한의 방어를 위해 소멸자와 Dispose 메서드를 동시에 구현하는 것이 일반적이다.

 

class Foo : IDisposable
{
private bool Disposed = false;

 

public void Dispose()
{
Dispose(true);
GC.SupressFinalize(this);
}

 

public virtual void Dispose(bool bManage)
{
if (Disposed) return;
Disposed = true;

 

if (bManage)
{
// 여기서 관리 자원을 해제한다.
}

// 여기서 비관리 자원을 해제한다.
}

 

~Foo()
{
Dispose(false);
}
}

 

+ Recent posts