블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday



http://weblogs.asp.net/scottgu/archive/2007/11/29/net-web-product-roadmap-asp-net-silverlight-iis7.aspx
스캇 형님글을 HOONS의 짧은 영어로 대충 해석해 보겠습니다.

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

실버라이트 2.0 릴리즈

두달전 실버라이트 1.0을 윈도우와 맥에서 지원할 수 있게 오픈했고 리눅스에서도 지원되도록 하려는 계획을 가지고 있었다. 이 1.0은 자바스크립트와 Ajax를 이용하는 프로그래밍 모델이었다.

내년에 우리는 실버라이트를 RIA에 초점을 두어 정말 큰 업데이트가 있을 것이다. 여기서는 크로스 플랫폼과 크로스 브라우저를 완벽하게 지원하는 프레임워크를 탑재할 것이다. 더 일찍 알파 버전에서 이미 닷넷을 이용한 기능을 보여주긴했었다. 우리의 다음 모델의 주요한 기능은 다음과 같다.

1. WPF UI 프레임워크
현재 실버라이이트 알파는 아주 기본적인 컨트롤들만 지원하고 있다. 다음 실버라이트에서는 고수준의 WPF UI 프레임워크를 포함시킬 것이다. 주요한 기능은 다음과 같이 정리할 수 있다.
->확장이 가능한 프레임워크 모델, 레이아웃 관리자 지원, 두가지 방법의 데이터 바인딩 지원 컨트롤 템플릿과 스킨 지원
실버라이트에 탑재되는 WPF UI 프레임워크는 지난주에 업데이트된 닷넷 프레임워크 3.5에서 확인해 볼 수 있을 것이다.


2. Rich Controls
실버라이트는 RIA 를 아주 쉽게 구축할 수 있는 컨트롤들이 대거 추가될 것이다. 다음 실버라이트 릴리즈(2.0)에서는 Textbox, CheckBox, RadioButton 등등의 많은 컨트롤들이 지원될 것이고 StackPanel,Grid 와 같은 레이아웃컨트롤 들이 지원될 것이다. 뿐만 아니라 TabControl, Slider, ScrollViewer, ProgressBar 컨트롤들 그리고 DataGrid와 같은 데이터 바인딩 컨트롤을 지원할 것이다.

3. Rich Networking 지원
실버라이트는 향후에 Rich 네트워크를 지원할 것이다.(역주:Rich 네트워크는뭘까? 크로스 도메인 지원인가?) 새롭게 발표될 실버라이트는 REST,POX,RSS와 WS*와 같은 통신을 지원할 것이고 또한 크로스 도메인도 지원할 예정이다.

4. Rich Base Class Library
실버라이트는 rich .NET 기반의 클래스 라이브러리를 추가할 것이다.(collections, IO, generics, threading, globalization, XML, local storage, 등등) 다음 실버라이트는 또한 XML을 위한 LINQ의 지원을 추가할 것이고 더 풍부한 HTML DOM API를 지원할 것이다.

이전에 닷넷 기반의 실버라이트를 "Silverlight 1.1"로 불렀었다. 후에 우리는 새로운 기능을 추가할 것이고 그 이름을 "실버라이트 2.0" 으로 부르기로 결정하였다. 우리는 실버라이트2.0 베타를 2008년도 1사분기에 내놓을 예정이다. 이 베타는 Go-Live 라이센스를 가지고 있기 때문에 개발자들이 먼저 개발하고 실버라이트 2.0 어플리케이션을 배포가 가능하다.

우리는 또한 무료로 비주얼 스튜디오 2008을 업데이트 할 것이다. 업데이트는 당연히 실버라이트 2.0 툴을 지원할 수 있는 업데이트가 될 것이고 개발자들은 닷넷 언어를 이용하여 아주 쉽게 실버라이트 어플리케이션 만들수 있을 것이다. 그리고 우리는 실버라이트를 개발하기 위해서 비주얼 스튜디오 2008 Standard/Professional  둘다 지원할 예정이고 뿐만아니라 무료 툴인 비주얼 스튜디오 2008 Express 에디션 버전도 지원할 예정이다.

필자는 실버라이트 2.0에 대한 새로운 블로그 튜토리얼 시리즈를 몇주에 거쳐서 게시할 예정이고 더 세부적인 내용들을 보여줄 것이다. 자세한 내용을 가지고 다시 올테니깐 그 때 보자고 안녕~

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

원문은 다음과 같습니다.

Silverlight 2.0 Release

Two months ago we shipped Silverlight 1.0 for Mac and Windows, and announced our plans to deliver Silverlight on Linux.  Silverlight 1.0 is focused on enabling rich media scenarios in a browser, and supports a JavaScript/AJAX programming model.

Next year we will be releasing a major update of Silverlight that focuses on enabling rich Internet applications.  This release will include a cross-platform, cross-browser version of the .NET Framework, and will enable a rich .NET development platform in the browser.  Earlier this year we shipped an early Alpha containing some of the basic functionality of the release.  Our next public preview will add considerably to this feature set.  Some of the new .NET specific features in the next public Silverlight preview will include:

  • WPF UI Framework: The current Silverlight Alpha release only includes basic controls support and a managed API for UI drawing.  The next public Silverlight preview will add support for the higher level features of the WPF UI framework.  These include: the extensible control framework model, layout manager support, two-way data-binding support, and control template and skinning support.  The WPF UI Framework features in Silverlight will be a compatible subset of the WPF UI Framework features in last week's .NET Framework 3.5 release.

  • Rich Controls: Silverlight will deliver a rich set of controls that make building Rich Internet Applications much easier.  The next Silverlight preview release will add support for core form controls (textbox, checkbox, radiobutton, etc), built-in layout management controls (StackPanel, Grid, etc), common functionality controls (TabControl, Slider, ScrollViewer, ProgressBar, etc) and data manipulation controls (DataGrid, etc).

  • Rich Networking Support: Silverlight will deliver rich networking support.  The next Silverlight preview release will add support for REST, POX, RSS, and WS* communication.  It will also add support for cross domain network access (so that Silverlight clients can access resources and data from any trusted source on the web).

  • Rich Base Class Library Support: Silverlight will include a rich .NET base class library of functionality (collections, IO, generics, threading, globalization, XML, local storage, etc).  The next Silverlight preview release will also add built-in support for LINQ to XML and richer HTML DOM API integration.

Previously we've been referring to this .NET-enabled Silverlight release as "Silverlight V1.1".  After stepping back and looking at all the new features in it (the above list is only a subset - there are many more we aren't sharing yet), we've realized that calling it a point release doesn't really reflect the true nature of it.  Consequently we have decided to change the name and refer to it as "Silverlight V2.0" going forward.

We will be releasing a Beta of Silverlight 2.0 in Q1 of 2008.  This Beta will support a Go-Live license that enables developers to begin building and deploying Silverlight 2.0 applications.

We will also be releasing a free Visual Studio 2008 tools update that provides great Silverlight 2.0 tools support within Visual Studio 2008, and enables developers to easily build Silverlight applications using any .NET language.  We will be supporting Silverlight development with both the Visual Studio 2008 Standard/Professional products, as well as with the free Visual Studio 2008 Express editions.

I'm going to be starting a new blog tutorial series in a few weeks that discusses how to build Silverlight 2.0 applications, and show off the new features in more depth.  Stay tuned for more details soon.


 - 출처 : http://www.hoons.kr -

Posted by happydong
, |



AJAX 방명록 만들기[8]

날씨도 쌀쌀해 지고 있네요.. 감기들 조심하세요~^^
AJAX 방명록 만들기[7] 부분에서 데이터를 DB에 넘기는 부분을 다루어 봤습니다^^ 이번에는 DB에 있는 데이터를 리스트 형식으로 보여주는 코드를 알아보려고 합니다~! 저는 DataList를 사용해서 만들어서 페이징을 따로 구현을 해야합니다. 그래서 먼저 페이징 구현소스를 먼저 보고, DataList 관련 소스를 보도록 하겠습니다~^^;;

제 말이 잘이해가 않되시더라도 코드를 보면서 하나하나 따라해 보세요~^^; 그리고 제가 항상 말하는 거지만 저 또한 초보개발자 입니다~!그래서 저와 같은 방식으로 만드는 것이 꼭 옮은 것은 아닐수도 있음을 기억해주세요~!ㅋ 우리 같이 더 넓은 미래를 향해 달려가자구요~ㅋㅋ 자~이제 헛소리는 그만하고 아래 코드를 보도록 하겠습니다.  

 .aspx페이지

 function DoPage(current)

{

document.getElementById("<%= hiddenPage.ClientID %>").value = current;

<%= Page.ClientScript.GetPostBackEventReference(pageBind, "") %>

}

<asp:LinkButton ID="pageBind" runat="server" OnClick="pageBind_Click">

</asp:LinkButton>

<asp:HiddenField ID="hiddenPage" runat="server" Value="1" />

위 코드를 보시면 JavaScript 함수도 있고... LinkButton도 있고....HiddenField도 있는 것을 볼 수있습니다. JavaScript 함수는 사용자가 페이지를 이동할 때 클릭 이벤트에서 사용 되어질 함수이며, 간단하게 설명하자면 사용자가 선택한 페이지의 번호로를 HiddenField 에Value 값으로 넣게되면서 임의적으로 LinkButton에 이벤트를 주는 것입니다. 자~ 그럼 이제는 비하인드 코드에서 어떻게 코드가 구성이 되는지 알아 보도록 하겠습니다.  

Guest_Board.aspx.cs페이지

private int currentPageIndex; //보여질 페이지

 

protected void Page_Load(object sender, EventArgs e)

{

currentPageIndex = int.Parse(hiddenPage.Value);

Page_Number();

}


위 코드는 페이징에 필요한 변수들을 선언해 두었구요~그리고 Page_Load 이벤트에서 일어
날 행위들을 정의한 부분입니다. Page_Load 이벤트 설명으로는 위에 선언한 변수 currentPageIndexHiddenField의 Value 값(기본값 1로지정했음)을 넣어주고 있고요!! Page_Number 라는 메소드를 호출하고 있습니다. 그럼 Page_Number 메소드의 소스를 보도록 하겠습니다.

 Guest_Board.aspx.cs페이지

protected void Page_Number()

{

bclass.Procedure(2);

totalCount = bclass.total;

 

Page_List();

 

//바인딩 부분

ListBind();

}


Page_Number
라는 메소드가 어떤 행위를 하는지 살펴보면,
처음에는 boardClass에 있는 Procedure라는 메소드를 호출하고 있습니다. 인자 값으로 2를 넘기고 있고요. boardClass 와 Procedure 메소드는 지난 강좌부분에서 다루었으므로 따로 설명하지 않도록 하겠습니다~^^그래도 혹 제가 이런말을 한다고 해서 상처 받는 사람이 있으면 안되기 때문에 Procedure 메소드에 대해 살짝 말하자면 그저 메소드 이름에서도 알 수 있듯이 Procedure를 정의한 메소드입니다. 인자값은 해당 Procedure를 사용하기위한  조건의 값이 되겠구요~^^ 자 아래 코드는 해당 Procedure에 조건 부분만 간추려온 소스 입니다. 지난 강좌 부분에 해당 소스가 있기때문에 이해안가시면 지난 강좌를 참고해 주세요~^^;;

Guest_Board.aspx.cs페이지

private int total_Count; // boardClass의 전연변수 선언

....중간 생략...

else if (num == 2)

{

query = "total_count";

total_Count = dcon.GetCheck(query);

}


역시 위에서 설명한데로 Procedure 명을 정의하고있지요~^^;;그럼 total_count 프로시져에 대
해서는 아래와 같습니다. 

total_count Procedure

create proc total_count

as

select count(*) bSeq from guest_board

 

GO


간단합니다..ㅋ 너무 간단해서 부끄럽네요~^^;;;
그 다음 코드를 보니깐 dbclassGetCheck 라는 매소드를 호출하고 있고요, 호출한 값을 전역 으로 선언해둔 total_Count 변수에 할당을 하고 있네요..대충 추측해 보시면 알겠지만 반환값이 있는 메소드인듯 하지요~인자값은 query(프로시져명)라는 값을넘기고 있네요. 그럼 GetCheck 메소드의 소스를 보도록 하겠습니다.

 dbclass.cs 페이지

public int GetCheck(string procedure)

{

Comm.Connection = Conn;

Comm.CommandText = procedure;

Comm.CommandType = CommandType.StoredProcedure;

return (int)Comm.ExecuteScalar();

}


역시 int 형의 return 값이 있네요..ㅋㅋ 위 코드는 데이터베이스에 연결하는 코드이겠죠!^^
위 코드의 일부는 지난 강좌에서도 다루었던 내용이므로 따로 설명하지 않도록 하겠습니다. 위에 있는 ExecuteScalar 함수는 쿼리를 실행하고 쿼리에서 반환된 결과 집합의 첫번째 행의 첫번째 열을 반환하는 역활을 해줍니다.(MSDN 참고). 리턴된 값은 위에서 와 같이 변수에 할당이 됩니다. 자~그럼 다시 제일 위로 올라가서... 보시면 totalCount 변수에 bclass 의 total을 호출하네요 보니깐 Property 인것 같은데요.아래 코드를 보도록 하시죠~^^ 

 boardClass.cs페이지

 public int total

{

get { return total_Count; }

}

아까 db에 연결해서 총수를 가지고 와서 그걸 boardclass에 있는 total_Count 변수에 넣었잖아요!이제는 그값을 Page 쪽으로 값을 넘기고 있네요.^^ 그 다음 코드를 보도록 하겠습니다. 변수에 총수를 할당하고 나서는 Page_List라는 메소드를 호출하고 있는 것을 볼 수 있습니다. 코드는 아래와 같습니다.

 Guest_Board.aspx.cs페이지

private int totalCount = 1; //총게시물 수

private int pageSize = 5; //한페이지 출력할 게시물 수

private int startGroup = 1;

private int group = 10;

private int pageCount = 0;//총 페이지 수


public void Page_List()

{

string page = null;

 

pageCount = (int)Math.Ceiling((double)totalCount / pageSize);

startGroup = ((currentPageIndex - 1) / group) * group + 1;

 

//처음으로

if (startGroup != 1)

{

page = String.Format("<a href='javascript:DoPage({0})'>{1}</a>",1,"처음");

}

 

//이전 버튼

if (startGroup != 1)

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",startGroup - group,"이전");

}

//페이지 있는곳까지 돌아라

int loop = 1;

while (loop <= group && startGroup <= pageCount)

{

if (startGroup == currentPageIndex)

{

page += String.Format("<span>{0}</span>", startGroup);

}

else

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",startGroup,startGroup);

}

 

loop++;

startGroup++;

}

 

//현재 페이지의 뒷 페이지로

if (startGroup <= pageCount)

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",startGroup,"다음");

}

 

// 마지막 페이지로

if (startGroup < (pageCount + 1))

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",pageCount, "마지막");

}

Label lblPage = new Label();

lblPage.Text = page;

pnlPageNumber.Controls.Add(lblPage);

}


코드가 참 길죠~^^;;;;; 
위에 보시면 pageCount, startGroup 머리를 아프게하는 녀석들이 있죠~!그러나 우리가 페이징을 구현하기위해서 많이 사용하고 있는 공식이라 어쩌면 편하게 느껴질수도 있겠네요~ㅋ 모~쉽게 이해 하시리라 생각이 됩니다~! 총 페이지 수를 알아내기 위해서 (전체 레코드 수 - 1) / 한 페이지의 크기 + 1 이라는 연산을 수행하는 부분인 것이지요. 그리고 그 밑으로 쭈욱~나왔는 조건들..ㅋ 딱 보시면 아하~하실것입니다. 아님.."왜 이렇게 지저분하게 했냐"라는 느낌이 들수도 있는 부분이겠네요~! 그러나 저는 부끄러워 하지 않겠습니다. 저같이 머리 나뿐 초보개발자가 이렇게라도 표현을 했다는것이...정말 대견스럽지 않습니까..ㅋㅋ^^;;(죄송합니다) 아~다시 돌아와서 위에 String 형식의 변수를 선언해서 해당 조건에 걸리면 <a>크로 만들고 있습니다. 그리고 마지막 부분에 보시면 Label를 동적으로 생성을해서 Text값을 지정하고 있이요.대충 감이 오셨겠군요 그리고 나서pnlPageNumber라는 Label에 추가 해주고 있습니다. pnlPageNumber는 어디붙은 녀석이나면요. 아래 코드를 참고해주세요~

.aspx페이지

 <%-- ###################### 방명록 리스트 시작 ##################### --%>

<asp:Panel runat="server" ID="pnl_dataList" Style="width: 100%;">

<asp:DataList ID="DataList1" runat="server" OnItemDataBound="DataList_databound">

<HeaderTemplate>

<table border="0" cellpadding="0" cellspacing="0" style="width: 600px;">

<tr><td colspan="5">

<div id="list_title" style="color: #CC6666; text-align: center; font-size: 18pt;

background-color: #CCCCCC;">방명록 List 입니다~^^</div></td>

</tr></table>

</HeaderTemplate>

<ItemTemplate>

<table border="0" cellspacing="0" cellpadding="0" style="width: 600px; border: 1px solid #959695;">

<tr><td class="td_img" rowspan="3"><span id="list_icon" runat="server"></span></td>

</tr>

<tr style="height: 50px;"><td class="td_txt">&nbsp;닉네임</td>

<td class="td_Box"><%# Eval("b_name") %></td>

<td class="td_txt">작성시간</td>

<td class="td_Box"><%# Eval("b_time") %></td>

</tr><tr style="height: 150px;"><td colspan="4" style="padding: 5px;">

<table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%;">

<tr><td colspan="3" style="border: 1px solid #959695; width: 95%;">

<span id="span_content" runat="server"></span></td></tr>

<tr><td class="td_txt" style="width: 50px; height: 20px;">아이피</td>

<td><%# Eval("b_ip") %></td><td>

<img alt="" style="cursor: pointer;" src="images/btn/imgDel.gif" id="Imgbtn_Delete"

onclick="content_Delete('<%# Eval("b_seq")%>')" />

</td></tr></table>

</td></tr>

</table>

</ItemTemplate>

</asp:DataList>

 <asp:Label ID="pnlPageNumber" runat="server"></asp:Label>


</asp:Panel>

<%-- ################# 방명록 리스트 끝 ####################### --%>


이렇게 하면 페이징이 리스트 아래부분에 나타나겠지요~!그리고 javascritp 함수를 호출하도록 했기때문에 클릭하면 javascript 함수가 호출하겠지요. 소스는 제일위에 있내요.DoPage(current)라는 인자값으로 보여질페이지의 번호를 넘기도록 합니다. 그래서HiddenField에 값을 지정(currentPageIndex 변수값이됨)하고 해당 링크 이벤트를 발생하게 합니다. 이벤트 코드는 아래와 같습니다.

Guest_Board.aspx.cs페이지

protected void pageBind_Click(object sender, EventArgs e)

{

        this.ListBind();

}


간단하게도 ListBind 메소드를 호출하고 있습니다. 아까 위에서도 마지막 부분에 ListBind를 호출하는 소스를 보셨을 텐데요 그럼 ListBind 메소드 코드를 보도록 하시지요~!

Guest_Board.aspx.cs페이지

 protected void ListBind()

{

int sum = (currentPageIndex - 1) * pageSize;

string query = String.Format("SELECT TOP {0} b_seq,b_name,b_content,b_ip,b_time,b_icon FROM guest_board WHERE b_seq NOT IN (SELECT TOP {1} b_seq FROM guest_board ORDER BY b_seq DESC)ORDER BY b_seq DESC", pageSize.ToString(), sum);

bclass.Query = query;

bclass.Procedure(3);

this.DataList1.DataSource = bclass.dataset;

this.DataList1.DataBind();

}

페이징을 위한 쿼리를 만들어서 날리는 부분이네요.(그냥 프로지져로만들면 편하겠네요) 켁~!부끄럽네요. 너무 허접해서리..ㅋ지금까지 보오셨던 데이터베이스 연결 구분과 똑같습니다. 따로 설명하지 않아도 지금까지 제가 썼던..강좌(!? 강좌라고 하는 좀 부족하죠..ㅋ)를 보시면 bclass는 이해하시리라 생각이 됩니다.^^; 코드 마지막쯤에 보시면 DataList DataSource는 정의하고 있네요. 그에 관련된 소스들을 그냥 한번 보도록 하겠습니다.

boardClass.cs 페이지

private DataSet ds = new DataSet();

public string Query

{

set { query = value; }

}

 

public void Procedure(int num)

{

      .. 중간 생략 ..

else if (num == 3)

{

ds = dcon.GetDataSet(query);

}

 

}

public DataSet dataset

{

get { return ds; }

set { ds = value; }

}

dbclass.cs페이지

public DataSet GetDataSet(string procedure)

{

public SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = new SqlCommand(procedure, Conn);

DataSet ds = new DataSet();

adapter.Fill(ds);

return ds;
}


위 코드와 Property를 이용해서 DataSet 형식을 받아서 DataSource 를 지정해주게
됩니다.그리고나서 DataBind를 시키면 다시 새로운 원하는 페이지의 글들이 나타나게 되는 거지요~^^휴~이렇게 긴 내용을 다루려고 하니깐 정말 힘드네요~! 저도 배우는 입장에서 어떻게 설명을 해야할지.. 마구 막히는 부분이 있던것 같 습니다. 이 글을 읽으시는 분들의 넓으신 아량으로 이해해 주세요~!

Posted by happydong
, |



ㅁ Excel 파일 내보내기...


Web 프로젝트를 하나 만듭니다.

만들었다면 테스트를 위한 리스트..즉 GridView 컨트롤을 사용해서 간단한 리스트 형식을 만들어 봅니다~!저는 아래 그림들과 같이 만들어 보았습니다.

1.그림

사용자 삽입 이미지


2. 그림

사용자 삽입 이미지


아주 Simple 하지 않습니까~^^; 너무 없어보이나요.. 괜찮습니다. 이것은 단지 Test가 목적이기 때문에...복잡할 필요는 없다고 생각이 됩니다~^^;;
그림이제 "엑셀저장" 이라는 버튼을 클릭하면 엑셀파일로 저장이 되게 하면 되겠군요..소스는 아래와 같습니다.

////////////////////////////////////////////////////////////////////////////////////////

// 엑셀 변환 버튼클릭 이벤트

    public void Click_Excel(object sender, EventArgs e)

    {

Response.Clear();

 

        //파일이름 설정

        string fName = string.Format("Test{0}.xls", DateTime.Now.ToString("yyyyMMddHHmmss"));

        //헤더부분에 내용을 추가

        Response.AddHeader("Content-Disposition", "attachment;filename=" + fName);

 

        //컨텐츠 타입 설정

        Response.ContentType = "application/unknown";

 

        StringWriter SW = new StringWriter();

        HtmlTextWriter HW = new HtmlTextWriter(SW);

 

        //새로운  GridView

        GridView GV = new GridView();

        GV.DataSource = SqlDateTest;

        GV.DataBind();

 

        GV.RenderControl(HW);

 

        Response.Write(SW.ToString());

 

        Response.End();

 

        HW.Close();

        SW.Close();

}

////////////////////////////////////////////////////////////////////////////////////////

위 소스는 버튼을 클릭후 일어나는 이벤트 부분에 정의한 코드 입니다. 간단한 예제를 위해 만든것 이므로 주석만 보아도 크게 물이 없이 이해하시리라 생각이 되는군요~!^^아니라면...음...위 소스가 꼭 정답은 아니기에 더 좋은 소스가 있다면 그러한 소스를 이용해서 만들어도 되겠네요
혹시 좋은 소스들있으면 같이 공유좀 해주세요~^^;; 갑자기 아부...ㅋㅋ
화면을 출력해서 보면...아래 그림과 같습니다.

3.그림

사용자 삽입 이미지


버튼을 클릭하면 저장을 위한 창이 나타나겠지요.. 해당 경로에 저장을 하고 나서 파일을 클릭하면 아래그림과 같이 잘 나타나내요~^^;;


4. 그림

사용자 삽입 이미지

제가 예제로 만든 파일도 올려놓을 거니깐 혹시나...아주 혹시나...ㅋㅋ 필요하신분 다운받아서 보세요.
혹시 제가 잘 못 이해하고 있는 내용이나, 더 추가되야 할부분이 있다면 바로바로 따끔한 한마디 부탁드리겠습니다~^^

Posted by happydong
, |