뭐. WPF에서도 될꺼 같긴 한데요. 일단 해본게 실버라이트니...

실버라이트는 파일이 두개로 나눠져 있죠.
(엄밀히 말하면 세개려나요..)
*.xaml
*.xaml.cs
*.g.cs <<- 요녀석은 프로젝트폴더의 obj폴더 안의 degug안에 뒤져보면 있어요.

실버라이트의 모든 페이지는 UserControl을 상속받잖아요.
근데 만약에
UserControl을 상속받은 다른 Class를 만든후에
그 Class를 상속받는 페이지를 만들고 싶을때!

단순하게
*.xaml.cs쪽에서 (만들어놓은 class명이 myUserControl 일경우
public partial class control1 : myUesrControl
이라고 하면 될듯 싶지만.
이게 잘 안되네요

왜냐.
이녀석들이 빌드되면서
xaml코드에 맞는 parial class를 자동생성해 주는데
(이놈이 *.g.cs)
여기는 상속받는 class가 UserControl로 되어있어요

partial class가 서로 상속받는 class가 다르니
꺼지라고 오류가 나옵니다.

이거때문에 한참 찾고 이거저거 해봤는데.
시베리아에서 답을 찾았네요. (찬용님 ㄳㄳ~~~)

방법은
하고나니 간단합니다. ㅠㅠㅋ

*.xaml코드를 보면. 시작태그가 있잖아요.
<Usercontrol x:Class="......
.........</Usercontrol>


이녀석을 바꿔주면 됩니다.
cs쪽에서 using하고 상속받고 하는거랑 비슷하네요

이름은 임의로 정할수 있어요
<tempControl:myUsercontrol 
 xmlns:tempControl="myUsercontrol의 네임스페이스"
 (나머지코드는 동일)........
......</tempControl:myUsercontrol>

이렇게 바꿔주면 되네요.

휴..
하고나니 이렇게 간단한걸. ㅠㅠ

by 피요히코~ 2009. 10. 14. 15:39
- 일단 좋은 정보를 가르쳐 주신 김효석과장님 감사합니다~ ㅋ

가끔 궁금했던것중 하나가.
스트링값을 가지고. 컨트롤을 찾는다던가.
클래스 인스턴스를 만들수 있느냐 였어요.

컨트롤 찾는건 어떻게어떻게 하는걸 알아냈는데
클래스 인스턴스 만드는건 모르겠더라구요.

그러다가 비슷한 고민을 하던 김과장님이 알려준방법!!

 Type targetPageType = Type.GetType(targetPageClass);
userForm = (UserControl)Activator.CreateInstance(targetPageType);

요건데요.
여기서 targetPageClass는 스트링으로 된 클래스 명이에요.
userForm은 UserControl 형식이구요
(silverlight 소스입니다)

클래스명은
factory.Forms.menu.TopMenu
이런식으로
네임스페이스 포함된 풀네임이 있으면 됩니다.

전 단지 이게 궁금했을 뿐인데
김과장님은 다른걸 하기 위해서 이게 필요해서 찾아내셨다고 하네요.
어쨌든
이걸 할수 있게 되니
이래저래 할수 있는게 많아지겠네요.
by 피요히코~ 2009. 10. 14. 10:18

작업을 하다보면 DataTable을 쪼물딱 거릴일이 생길수 있다
DataTable의 내용을 다른 DataTable에 넣어야 할일도 생길수 있는데
DataTable.Rows.Add로 그냥 추가해버리면
이미 사용중이라고 안된다고 나온다.
(그래서 지금까진 안썼다는. ㅠㅠ)

아주 간단한 방법이 있었는데.(.NET Framework에서 제공해주는.. ㅠㅠ)

DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
//dt1에는 데이터가 채워져있다고 하고
//아주 간단하게
dt2.ImportRow(dt.Rows[index]); //이러면 끝.... ㅠㅠ
//이렇게 넣어주면 dt2에는 dt1의 첫번째 row의 내용들이 들어간다. 
//하지만. 
//단순히 그냥 선언된 dt2는 그냥 텅 비어있는 DataTable이므로
//위의 작업전에 선행 작업이 필요하다.
dt2 = dt1.Clone();
//이렇게 해주면 dt1의 스키마, 관계, 제약조건등 dt1의 구조를 복제해서 dt2에 넣어준다

//dt2의 내용을 지우려면
dt2.Clear();
//해주면 또 끝. 
//쉽다. ㅠㅠ
by 피요히코~ 2009. 10. 7. 14:00
TextBox를 사용하다 보면
그 안에. 특정한 형식만 입력하게 해야할때가 생길수도 있어요.

저같은 경우는
TextBox에 금액형식으로만 데이터가 들어가게 해야 해서
만들었습니다.

//키가 눌러졌을때
private void textbox_KeyPress(object sender, KeyPressEventArgs e)
{
       if (!(char.IsDigit(e.KeyChar) || e.KeyChar == Convert.ToChar(Keys.Back)))
       {
              e.Handled = true;
       }
}

//키가 (눌렸다가) 올라왔을때
private void textbox_KeyUp(object sender, KeyEventArgs e)
{
       TextBox thisText = sender as TextBox;
       text2Money(thisText);
}

//텍스트를 금액 형식으로
private void text2Money(TextBox tbx)
{
       tbx.Text = ConvertEx.DoubleToString(tbx.Text);
       if (tbx.SelectionStart == 0)
       tbx.SelectionStart = tbx.Text.Length;
}

두개의 이벤트와 한개의 메소드 인데요
더 간단하게 될수도 있겠지만
이게 제 한계. --ㅋㅋ

단점은
TextBox에 데이터가 있는 상태에서
커서를 맨 앞으로 가져올수가 없다는것과
데이터를 Double형으로 바꿔서. 크기에 제한이 있다는것

(저기 있는
ConVertEx.DoubleToString(string)은 따로 존재하는 메소드인데요
그냥 Double형으로 Parse한다던지 하면
데이터가 맞지 않을경우 Exception이 날수 있어서 따로 만들어둔거에요
(,도 붙여주구요)
별거 없음. ) 그래도 보나스~~
public static string DoubleToString(string szData)
{
       string szReturn = string.Empty;
       if (szData != "")
       {
              string szValue = szData.Replace(",", "");
              Double data = Double.Parse(szValue);
              szReturn = string.Format("{0:###,###,###,###,###,###}", data);
       }
       return szReturn;
}
by 피요히코~ 2009. 8. 20. 11:36

처음에. 용산참사 기사를 보고서는
정말 내 눈을 의심했었다.
2009년 우리나라에서 일어날수 있는 일이라는게
정말이지 믿겨지지 않았다.

한동안 우리나라의 현대사에 (조금이나마)관심을 갖고
이런저런 자료들을 보면서
내가 막 태어났을때 즈음 우리나라는
지금의 나로써는 상상도 할수 없는 상황이였구나. 라는 생각을 한적이 있었다.
그런시절을 경험해 보지 못했음이
감사했고.
진심으로 우리나라가 많이 발전한것이구나 라고 생각을 했었다.

하지만 2009년 현재
(누군가가 내가 미처 경험해 보지 못한것들을 경험케 해주고 싶었던것인지)
내가 책에서 보고, 인터넷으로 접했던 이야기들을
오늘자 뉴스에서 볼수 있게 되었다.

대체 우리나라가 왜 이모양이 되었는지 모르겠다.

p.s 이거 경향신문 4월 28일자 [김용민의 그림마당] 에서 퍼온건데
ⓒ 경향신문 & 경향닷컴(www.khan.co.kr), 무단전재 및 재배포 금지 라고 되어 있는데..
나쁜뜻으로 퍼온건 아니니. 혹시나 관계자나 누가 봐도 자비를..... :(
by 피요히코~ 2009. 4. 30. 00:20
좀전에 포스팅한 글에 이어서. 두번째 입니다.

당연한 이야기 겠지만.
참조한 DLL로부터 클래스를 상속받을수도 있고, 상속후 메서드를 재정의 할수도 있슶니다.
한번 해보죠.

Client의 소스를 다음과 같이 수정해 볼께요.

namespace Client
{
    class IntCalculator2 : IntCalculator
    {
        public static void PrintMessage()
        {
            Console.WriteLine("요게 되는군요~ :)");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("5+5 = {0}", IntCalculator2.Add(5, 5));
            Console.WriteLine("5-5 = {0}", IntCalculator2.Sub(5, 5));
            IntCalculator2.PrintMessage();
        }
    }
}

IntCalculator를 상속받아서 메서드를 하나 추가를 헀어요.
Add와 Sub 메서드는 IntCalculator2에서도 잘 동작을 하는걸 확인할수 있을겁니다.

닷넷은 언어독립적 특성을 가지고 있어서 C#으로 만든 어셈블리를 VB에서도 사용할수 있습니다.
(하지만 제가 VB를 할줄 모르는군요. ㅎㅎ;;;)
by 피요히코~ 2009. 4. 29. 23:56
이번에는 DLL만들기에 도전해 보겠습니다.

간단하게
DLL은 클래스와 메서드를 제공하고, 실행중 연결되는 동적 연결 라이브러리 입니다. (Dynamic Linked Lybrary..맞나요? ㅋ)
실행파일과 내부 포멧은 같지만 진입점(Main같은녀석)이 없어서 혼자 실행은 안됩니다.
하지만 실행파일이나 다른 DLL에게 서비스를 제공하는 역할을 하죠
(때문에. 혹은 덕분에 여러명이 분담을 해서 여러 모듈을 만들고 통합해서 사용이 가능하겠죠)
DLL역시 형태만 다를뿐 어셈블리라는 면에서는 실행파일과 같습니다.

DLL, 실행파일 => 두개의 어셈블리로 구성된 프로그램을 만들어 볼께요.

먼저
파일 -> 새로만들기 -> 프로젝트 를 선택해서
템플릿에서 클래스 라이브러리를 선택합니다.
이름은 DLLTest로 할께요.

기본적으로 몇개의 using과 namespace가 있고.
기본으로 Class1이라고 코드가 만들어져 있지만.
Class는 지우고 새로 만들께요.
간단하게 덧셈과 뺄셈을 하는 메서드 두개를 정의했습니다.


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

namespace testDLL
{
    public class IntCalulator
    {
        public static int Add(int a, int b) { return a + b; }
        public static int Sub(int a, int b) { return a - b; }
    }
}

DLL이 외부로 공개할수 있는건
클래스, 구조체, 열거형, 인터페이스등인데 주로 클래스를 제공합니다.
C#은 완전 객체지향 언어이므로 메서드만 단독으로 제공할수는 없고
무조건 클래스를 통해서만 제공이 가능합니다.
(다 클래스 안에 때려 박아야겠죠. ㅠ)
꼭 필요한건 아니지만.
네임스페이스도 만들고. 클래스도 만들고
그 안에 Add와 Sub라는 메서드를 만들었습니다.

주의 할점은
외부로 공개할 클래스는 반드시 public이여야 한드는겁니다.(당연한소리죠)
(DLL내부에서만 쓰는 클래스라면 다르겠죠. (또 당연한... ))

이제 빌드를 하면 testDLL.dll이 만들어 집니다.

그럼 이제. 클라이언트 프로그램을 만들께요.
아예 다른 프로젝트를 만들어서 해볼께요.
파일 => 새로만들기 => 프로젝트 를 선택하고 콘솔응용프로그램을 만듭니다. 이름은 Client로 할께요.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testDLL;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("5+5 = {0}", IntCalculator.Add(5, 5));
            Console.WriteLine("5-5 = {0}", IntCalculator.Sub(5,5));
        }
    }
}


이런 코드를 작성하고 나면
컴파일을 하고 자시고 할것도 없이
빨간줄이 쭉쭉 그어집니다.

testDLL을 using하긴 했지만.
이게 어디있는 놈인지. 진짜 있긴 한건지.
알수가 없으니 안되겠죠.

멍청한(--;;) 컴파일러에게 친절하게
testDLL이 어디 있는지를 가르쳐 줘야 합니다.
솔루션탐색기에서 참조란을 우클릭하고 참조추가를 한후
아까 만들어진 testDLL이 있는 위치를 찾아 추가를 해주면 되요.


그러면 빨간줄도 없어지고.
컴파일도 잘 됩니다.

testDLL은 참조추가를 해서 Client 프로젝트 디렉토리로 복사가 됐습니다.
client 프로젝트 폴더에서 찾아보면 다음과 같이 실제로 testDLL이 복사가 되어 있는걸 볼수 있어요.




 

by 피요히코~ 2009. 4. 29. 23:48
오늘은 미천한 저에게는 너무나 어렵고 난감하고. 헷깔리는 어셈블리에 대해 더 알아보겠습니다.

어셈블리란
- 응용프로그램을 구성하는 기본단위
- 배포, 설치, 버전관리, 보안권한 지정의 단위
  (exe나 dll같은 실행파일 하나를 칭하는 개념?)
- 기계어 코드와 1:1 로 대응되는 어셈블리와는 동음이의어일뿐!!

어셈블리는 크게 4가지로 구성됩니다.

 어셈블리 메타 데이터
 타입 메타 데이터
 MSIL코드
 리소스

위의 두개 메타데이터는 일종의 헤더이고
아래의 두개 코드와 리소스는 어셈블리의 실제내용입니다.
(이중 일부는 어셈블리의 종류에 따라 생략될 수 도 있습니다.)

어셈블리 메타데이터를 저장하는 장소를 매니페스트(Manifest, 지난번에 나왔었죠. 어려운말)라고 하는데
보통 어셈블리에 통합되 있지만 별도 파일에 둘수도 있습니다.

어셈블리에는
이름, 버전번호, 컬처, 강력한 이름, 파일 목록, 참조 타입, 참조하는 타입등의 기본정보 외에도
커스텀 어트리뷰트로 상표, 저작권, 개발사 등 추가정보를 더 넣을수도 있습니다.
때문에 레지스트리를 쓸 필요가 없는것이죠.


어셈블리를 스스로 설명 가능한 모듈이라 하는데 이는 자신의 모든 정보를 스스로 포함하고 있기 때문입니다.
 
역시나 저에게는 어셈블리는 너무나 멀고도 험한 개념인듯 해요. :(

by 피요히코~ 2009. 4. 29. 23:19

제가 찍은 사진도 있네요. ㅎㅎ
자원봉사로 참가를 해서
제대로 못들은 세션이 많았지만.
그래도 너무 좋았네요.
2회도 기대~
by 피요히코~ 2009. 4. 28. 00:54

여기서 file에 들어있는 값을 가져오려고
function test
{        
alert(document.getElementById('file').value);
}

을 하게 되면
전체 파일 경로가 아닌 파일명만 가져오게 됩니다. (보안상의 이유라고 하더라구요)
전체 경로가 필요하다면

이렇게 하면 됩니다
function test()
{       
 document.form1.file.select();        
alert(document.selection.createRange().text);
}

이렇게 해주면 됩니다.
주의사항은 file에 id말고 name을 줘야 하더라구요.
또 한가지는 name이 겹치면 안된다는 겁니다.
(뭔가 방법이 있을꺼 같은데. 모르겠네요. ㅠㅠ)
by 피요히코~ 2009. 4. 27. 16:34
| 1 2 3 4 5 6 7 ··· 12 |