처음에 일본어 한자를 외우기 위해서 엑셀에다 작업을 했었는데요.
이렇게 엑셀에다 단어의 한자, 뜻, 발음, 종류, 난이도 정도를
모르는 단어 위주로 6000여개를 작성하곤
처음엔 이런식으로 연습을 했는데 이게 너무 불편하고 느려서 만들게 되었습니다.
(완성된 단어 연습기 모습)
단어 연습기는 연습할 단어가 들어있는 엑셀 파일을 선택하면 그중에서 랜덤으로 한 단어를 표시하고 뜻 보기를 클릭하면 한글 뜻과 발음이 보이고, 안다나 모른다 버튼을 클릭하면 다음 단어로 넘어가는 형식입니다.
그리고 아래부분에는 현재 단어를 쉽게 사전에 검색할 수 있도록 단어를 스크립트로 제공하고, 실행되고 몇번째 단어를 보고있는지 정보와 단어를 알고 있는 비율이 어느정도인지에 대한 정보도 담아 연습이 좀 더 재미있게 만들었습니다 ^^
단어 하나하나 버튼으로 클릭하다보니 손가락이 아파서 아래 텍스트 박스에 커서를 둔 다음 키보드 방향키를 이용해 왼쪽 방향키는 안다 버튼을, 오른쪽 방향키는 모른다 버튼을, 아래 방향키는 뜻보기 버튼을 누르는 기능을 추가하여 무진장 빠른 단어 연습 효과를 보이게 되었습니다.
(단어연습기를 테스트 중인 영상)
위 영상은 단어 연습기를 실제로 사용하는걸 찍은 영상인데요.보시다시피 처음에 실행되면 파일 찾기 버튼을 클릭해 엑셀 파일을 찾고, 엑셀 파일이 로드 된 뒤론 단어 암기를 연습하시면 됩니다.
단어 외우는건 반복이 중요함을 보여주듯 저도 대략 몰랐던 6000여개의 한자 단어들을 매일 2000개씩 보면서 한 달쯤 하니깐 정답 확률이 85%정도에 도달한 상태입니다.
그동안은 혼자 공부 하는동안 사용하며 기능을 하나씩 올리던 녀석인데 혹시 다른분께도 쓰임을 받지 않을까 싶어서 이렇게 작성하게 되었습니다 ^^
귀엽게 봐주세요 ㅎㅎ
(## 2019.06.20 다운로드 링크의 일부분이 지워져 있어서 링크 수정을 했습니다.)
단어 연습기 실행파일 = 다운로드
한자 엑셀 파일 = 다운로드
제 구글 드라이버 링크이니 악성 코드나 광고 낚시 링크가 아닙니다.
단어연습기의 공급자가 빠져서 SmartScreen에서 실행을 차단하는 경우가 발생할 수 있습니다.
그리고 엑셀 데이터는 한자 단어들을 제가 단어장에서 그대로 배낀거라 저작권이 있을꺼 같아 제가 쓰던 6000개 단어에서 앞에 100개정도만 짜른 데이터 입니다.
그럼 단어 연습기 설명은 이것으로 마치고 지금부턴 단어 연습기 소스 설명에 들어가겠습니다.
1. 디자인
전체 디자인은 아래 한자 스크립트를 제공할 텍스트 박스 1개를 제외하곤 모두 레이블이며 파일 찾기 버튼은
아래엔 이렇게 안다, 모른다 버튼이 있습니다. ^^
저는 일본어 한자 연습이라 발음 항목이 있는데 영단어일 경우엔 필요없는 항목이 되겠죠?
2. 소스
일단 전체 소스는
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
|
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.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace vacaPractice
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//전체 초기화
Init();
FormClosing += new FormClosingEventHandler(closing);
}
private void closing(object sender, FormClosingEventArgs e)
{
try
{
wb.Close(true);
excelApp.Quit();
}
catch
{
//Application.Exit();
}
Application.Exit();
}
//excel file path
string strPath = "";
//current rowNum
//2 ~ last row
int intRow = 2;
int intLastRow = 0;
//today word
float fltIndex = 0;
float fltOk = -1;
float fltNo = -1;
static Excel.Application excelApp = null;
static Excel.Workbook wb = null;
static Excel.Worksheet ws = null;
static object[,] data;
//전테 초기화 메서드
void Init()
{
//레이블 초기화
this.label1.Text = "漢字";
this.label2.Text = "뜻";
this.label3.Text = "발음";
this.label4.Text = "종류";
this.label5.Text = "레벨";
this.label6.Text = "순번";
//path name
//strPath = @"D:\공부\voca\nadel\data.xlsx";
this.label2.ForeColor = Color.White;
this.label3.ForeColor = Color.White;
this.label1.AutoSize = false;
this.label2.AutoSize = false;
this.label3.AutoSize = false;
this.label1.Width = 300;
this.label2.Width = 300;
this.label3.Width = 300;
}
//load excel
void loadExcel()
{
try
{
excelApp = new Excel.Application();
wb = excelApp.Workbooks.Open(strPath);
ws = wb.Worksheets.get_Item(1) as Excel.Worksheet;
Excel.Range rng = ws.UsedRange;
Excel.Range last = ws.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
data = rng.Value;
intLastRow = last.Row;
}
catch (Exception ex)
{
throw ex;
}
}
//data read
void reExcal()
{
this.label2.ForeColor = Color.White;
this.label3.ForeColor = Color.White;
//random rowNumber
rodmRow();
try
{
for (int c = 1; c <= 7; c++)
{
if (data[intRow, c] == null)
{
label1.Text = data[intRow, 3] == null ? "" : data[intRow, 3].ToString();
label2.Text = data[intRow, 4] == null ? "" : data[intRow, 4].ToString();
label3.Text = data[intRow, 5] == null ? "" : data[intRow, 5].ToString();
label4.Text = data[intRow, 6] == null ? "" : data[intRow, 6].ToString();
label5.Text = data[intRow, 1] == null ? "" : data[intRow, 1].ToString();
label6.Text = data[intRow, 2] == null ? "" : data[intRow, 2].ToString();
this.textBox1.Text = data[intRow, 3] == null ? "" : data[intRow, 3].ToString();
continue;
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//ReleaseExcelObject(ws);
//ReleaseExcelObject(wb);
//ReleaseExcelObject(excelApp);
fltIndex++;
intRow++;
this.label7.Text = fltIndex.ToString();
}
}
//뜻보기
private void button1_Click(object sender, EventArgs e)
{
bt1();
}
void bt1()
{
this.label2.ForeColor = Color.Black;
this.label3.ForeColor = Color.Black;
}
//안다 버튼
private void button2_Click(object sender, EventArgs e)
{
bt2();
}
void bt2()
{
reExcal();
if (fltOk.Equals(-1))
{
fltNo++;
fltOk++;
}
else
{
fltOk++;
claResult();
}
}
//모른다 버튼
private void button3_Click(object sender, EventArgs e)
{
bt3();
}
void bt3()
{
reExcal();
if (fltNo.Equals(-1))
{
fltOk++;
fltNo++;
}
else
{
fltNo++;
claResult();
}
}
//성적 결과 내기
void claResult()
{
float floatResult = fltOk / (fltIndex -1) * 100;
this.label9.Text = floatResult.ToString("N1");
this.label11.Text = fltOk.ToString();
this.label13.Text = fltNo.ToString();
}
//행번호 랜덤으로 만들기
void rodmRow()
{
Random r = new Random();
intRow = r.Next(2, intLastRow);
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode.ToString() == "Left")
{
bt2();
}
if (e.KeyCode.ToString() == "Right")
{
bt3();
}
if (e.KeyCode.ToString() == "Down")
{
bt1();
}
}
//파일찾기 버튼
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Excel File(*.xlsx)|*.*";
open.Title = "단어집 파일을 선택해 주세요.";
if (open.ShowDialog() == DialogResult.OK)
{
strPath = open.FileName;
//load excel
loadExcel();
}
//성공시 버튼 지우기
this.button4.Visible = false;
}
}//form
| cs |
이렇게 되고 실행 순서로 하나씩 살펴보면
1. 참조
1
2
3
4
5
6
7
8
9
10
11
|
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.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
|
다른건 다 평범한데 마지막 2개 참조는 엑셀 파일을 읽어야 하니 가져온 참조입니다.
Microsoft.Office.Interop에 관련한 dll 다운로드 링크도 준비했습니다~
Microsoft.Office.Interop.dll 다운로드
2. 변수 선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//excel file path
string strPath = "";
//current rowNum
//2 ~ last row
int intRow = 2;
int intLastRow = 0;
//today word
float fltIndex = 0;
float fltOk = -1;
float fltNo = -1;
static Excel.Application excelApp = null;
static Excel.Workbook wb = null;
static Excel.Worksheet ws = null;
static object[,] data;
| cs |
엑셀 파일 경로
엑셀 파일 시작행 (2로 고정하였습니다.)
엑셀 파일 마지막행
연습한 단어 갯수
아는 단어 갯수
모르는 단어 갯수
마지막 4개는 엑셀 데이터 변환할 변수들입니다.
3. 폼 시작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//전체 초기화
Init();
FormClosing += new FormClosingEventHandler(closing);
}
private void closing(object sender, FormClosingEventArgs e)
{
try
{
wb.Close(true);
excelApp.Quit();
}
catch
{
//Application.Exit();
}
Application.Exit();
}
//전체 초기화 메서드
void Init()
{
//레이블 초기화
this.label1.Text = "漢字";
this.label2.Text = "뜻";
this.label3.Text = "발음";
this.label4.Text = "종류";
this.label5.Text = "레벨";
this.label6.Text = "순번";
//path name
//strPath = @"D:\공부\voca\nadel\data.xlsx";
this.label2.ForeColor = Color.White;
this.label3.ForeColor = Color.White;
this.label1.AutoSize = false;
this.label2.AutoSize = false;
this.label3.AutoSize = false;
this.label1.Width = 300;
this.label2.Width = 300;
this.label3.Width = 300;
}
|
#32~#37은 레이블에 초기 텍스트를 넣고
#42~#43은 뜻과 발음은 안보이게 글 색상을 변경했고
#45~#51은 단어가 큼직히 잘 보이고 길어도 짤리지 말라고 고정 사이즈 옵션을 죽였습니다.
#10은 단어연습기 종료 이벤트를 따와서
#13~#26동안 종료하기전 열려있는 엑셀 파일을 닫는 역할을 넣었습니다.
4. 파일 찾기와 엑셀 데이터 로드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
//파일찾기 버튼
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Excel File(*.xlsx)|*.*";
open.Title = "단어집 파일을 선택해 주세요.";
if (open.ShowDialog() == DialogResult.OK)
{
strPath = open.FileName;
//load excel
loadExcel();
}
//성공시 버튼 지우기
this.button4.Visible = false;
}
//load excel
void loadExcel()
{
try
{
excelApp = new Excel.Application();
wb = excelApp.Workbooks.Open(strPath);
ws = wb.Worksheets.get_Item(1) as Excel.Worksheet;
Excel.Range rng = ws.UsedRange;
Excel.Range last = ws.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
data = rng.Value;
intLastRow = last.Row;
}
catch (Exception ex)
{
throw ex;
}
}
|
사용자가 파일 찾기 버튼을 클릭하면 #2가 실행되고 엑셀 파일 선택을 받으면 #18에서 버튼의 시각화를 false 시켜 안다, 모른다 버튼이 활성화 되도록 했습니다.
엑셀 파일이 선택되면 #14에서 엑셀 데이터 로드를 호출하여
#26~#31동안 엑셀의 첫번째 워크 시트에 있는 전체 데이터를 로드하여 변수로 가지고 있도록 합니다.
특히 #30은 데이터의 마지막 행을 구하여 전체 데이터 범위를 파악하도록 합니다.
5. 안다, 모른다 버튼 클릭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
//안다 버튼
private void button2_Click(object sender, EventArgs e)
{
bt2();
}
void bt2()
{
reExcal();
if (fltOk.Equals(-1))
{
fltNo++;
fltOk++;
}
else
{
fltOk++;
claResult();
}
}
//모른다 버튼
private void button3_Click(object sender, EventArgs e)
{
bt3();
}
void bt3()
{
reExcal();
if (fltNo.Equals(-1))
{
fltOk++;
fltNo++;
}
else
{
fltNo++;
claResult();
}
}
//성적 결과 내기
void claResult()
{
float floatResult = fltOk / (fltIndex -1) * 100;
this.label9.Text = floatResult.ToString("N1");
this.label11.Text = fltOk.ToString();
this.label13.Text = fltNo.ToString();
}
//행번호 랜덤으로 만들기
void rodmRow()
{
Random r = new Random();
intRow = r.Next(2, intLastRow);
}
//load excel
void loadExcel()
{
try
{
excelApp = new Excel.Application();
wb = excelApp.Workbooks.Open(strPath);
ws = wb.Worksheets.get_Item(1) as Excel.Worksheet;
Excel.Range rng = ws.UsedRange;
Excel.Range last = ws.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
data = rng.Value;
intLastRow = last.Row;
}
catch (Exception ex)
{
throw ex;
}
}
//data read
void reExcal()
{
this.label2.ForeColor = Color.White;
this.label3.ForeColor = Color.White;
//random rowNumber
rodmRow();
try
{
for (int c = 1; c <= 7; c++)
{
if (data[intRow, c] == null)
{
label1.Text = data[intRow, 3] == null ? "" : data[intRow, 3].ToString();
label2.Text = data[intRow, 4] == null ? "" : data[intRow, 4].ToString();
label3.Text = data[intRow, 5] == null ? "" : data[intRow, 5].ToString();
label4.Text = data[intRow, 6] == null ? "" : data[intRow, 6].ToString();
label5.Text = data[intRow, 1] == null ? "" : data[intRow, 1].ToString();
label6.Text = data[intRow, 2] == null ? "" : data[intRow, 2].ToString();
this.textBox1.Text = data[intRow, 3] == null ? "" : data[intRow, 3].ToString();
continue;
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//ReleaseExcelObject(ws);
//ReleaseExcelObject(wb);
//ReleaseExcelObject(excelApp);
fltIndex++;
intRow++;
this.label7.Text = fltIndex.ToString();
}
}
|
두 버튼을 클릭하면 로드한 데이터를 적절하게 배치하여 뿌려줄 매서드를 호출하고 (#8, #29)
호출된 매서드는 가장 먼저 보여줄 단어를 랜덤으로 정하기 위해 랜덤 숫자를 만들 매서드를 호출하고 (#87)
호출된 매서드는 #56~#57동안 2~마지막 데이터가 있는 행 사이의 정수 중에서 하나를 선택해 변수에 저장합니다.
랜덤수를 받았으면 #91~#105동안 정해진 레이블에 데이터를 넣어주고, 몇번째 연습한 단어인지 작성한 다음 (#118~#119) 종료됩니다.
데이터를 다 뿌린 다음엔 첫 실행일 경우엔 변수만 바꿔주고, 그 외엔 아는 갯수, 모르는 갯수 변수를 이용해 현재 성적을 작성해 줄 매서드를 호출 합니다. (#18,#39)
6. 뜻보기 버튼과 키보드 이벤트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//뜻보기
private void button1_Click(object sender, EventArgs e)
{
bt1();
}
void bt1()
{
this.label2.ForeColor = Color.Black;
this.label3.ForeColor = Color.Black;
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode.ToString() == "Left")
{
bt2();
}
if (e.KeyCode.ToString() == "Right")
{
bt3();
}
if (e.KeyCode.ToString() == "Down")
{
bt1();
}
}
|
텍스트 박스에 키보드 클릭이벤트를 받아와서 방향키 클릭에 따라 해당 클릭 이벤트를 연결해 줍니다.
혼자 생각날때마다 기능을 달고 혼자 쓸 생각에 만들었던거라 예외처리가 매우 안되어 있음을 참조해주세요 ^^;;
이로써 단어 연습기 설명도 마치겠습니다.
긴 글 봐주셔서 감사하고, 단어연습기에 대한 질문이나 문의 개조 등등 모두 댓글로 남겨 주시면 제가 바로 해결하겠습니다. 감사합니다.!
한자의 글자크기를 500으로 하고싶고 랜덤이랑 순서대로 하는거 둘중에 하나를 선택 할 수 있게 만들어주세요! 감사합니다. 저는 선생님이 만들어 놓으신 파일로 한자 공부하고 있어용 ㅎㅎ
답글삭제늦었지만 조만간 요청사항이 적용된 버전으로 올리겠습니다.
삭제안녕하세요 단어장 관련해서 여러 글을 읽어보다가 이 블로그를 찾게 되었습니다.
답글삭제다름이 아니라 해당 글을 잘 읽어보고 단어장 기능이 너무 좋아서 쓰고 싶어서 다운로드 링크를 눌렀으나 단어엑셀파일샘플만 받아 볼 수가 있어서 그림의 떡 마냥 블로그만 바라보다가 코드를 붙여넣어서 만들려고 했는데 제가 도저히 어떻게 하는줄 모르겠어서 블로그주께서 단어장 링크를 수정해주시거나 단어장을 이메일로 보내주셨으면 좋겠습니다. 아직 확인하실지 모르겠지만 확인하시면 꼭 좀 부탁드리겠습니다
지금와서 보니 다운로드 링크 부분이 이상하게 글자가 밀려서 원래 2개였던 링크인데 한개가 누락이 되어버렸네요. 알려주셔서 정말 감사합니다.
삭제단어연습기 실행 파일 링크도 수정하여 다시 올렸으니 혹시 다시 오신다면 확인 부탁드릴께요 ^^.
그리고 소스코드 부분은 설명이 너무 부족함을 느껴 빠른 시일내에 새롭게 수정하여 올리겠습니다.
제가 파일들을 다운받아 사용했는데 문제점이 없었지만 혹시 사용에 문제가 있다면 꼭 알려주세요. 감사합니다!
빠른 확인 정말 감사드립니다!! 혹시 수정계획이 있으시다면
삭제틀린단어복습이라는 체크박스를 체크했을 하고 테스트를 했을 때,
모른다라고 한 부분의 값들을 모아서 복습할수 있게끔 만들어 주실 수 있을까요 ??
에고 코멘트 수정하는 방법을 모르겠어서 다시 하나 더 달아봅니다.. !
삭제엑셀 파일에 단어를 정리했을때 no 1 ~ 100까지라던지 범위 설정도 가능할 수 있다면 좋겠습니다. 창크기를 키웠을때 창크기 비율에 따라서 텍스트의 크기도 변경 가능하다면 더 훌륭할 것 같습니다.
요청 사항이 너무 많다는 것을 알고 있으나,... 프로그래밍을 잘 알지 못하는 저에게 어떤 것이 구현이 가능하고 어려운지 쉬운지를 모르기때문에 생각나는 만큼 달아보았습니다. 지금도 충분히 훌륭한 프로그램이라는 것은 잘 알고 있습니다 ! 확인하시고 나중에 여유가 되신다면 부탁드리겠습니다.
아, 그리고 dll 파일은 어떻게 추가를 해야하는 것인지 설명 부탁드리겠습니다 ㅠㅠ
삭제혹시 개발할 때 필요한 파일인가요 ?
저는 단어연습기와 엑셀파일을 그대로 받아서 실행하려고 하는데 오류가 발생합니다 ㅠ
오류 첨부합니다.
원격 프로시저를 호출하지 못했습니다. (예외가 발생한HRESULT :0x800706BE)
자세히를 눌러서 나오는 내용은 4096자가 초과한다고 하여 첨부가 되지않습니다 ㅠ
원격 프로시저를 호출하지 못했습니다. (예외가 발생한HRESULT :0x800706BE)
삭제이 대화 상자 대신 JIT(Just-in-time) 디버깅을 호출하는
방법에 대한 자세한 내용은 이 메시지의 뒷부분을 참조하십시오.
************** 예외 텍스트 **************
System.Runtime.InteropServices.COMException (0x800706BE): 원격 프로시저를 호출하지 못했습니다. (예외가 발생한 HRESULT: 0x800706BE)
위치: vacaPractice.Form1.loadExcel()
위치: vacaPractice.Form1.button4_Click(Object sender, EventArgs e)
위치: System.Windows.Forms.Control.OnClick(EventArgs e)
위치: System.Windows.Forms.Button.OnClick(EventArgs e)
위치: System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
위치: System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
위치: System.Windows.Forms.Control.WndProc(Message& m)
위치: System.Windows.Forms.ButtonBase.WndProc(Message& m)
위치: System.Windows.Forms.Button.WndProc(Message& m)
위치: System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
위치: System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
위치: System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
현재 운영체제는 win10 이고 엑셀은 2016을 사용하고 있습니다.
답글삭제제가 답글을 읽어 봤는데요. 우선 추가 요구 사항들은 구현이 많이 어려운게 아닙니다. 요청 사항도 적용한 좀 더 안정성 있는 버전을 이번주 토요일쯤 새 포스팅으로 작성할 계획입니다. 완성이 된다면 여기에 링크를 추가 하도록 하겠습니다.
삭제그리고 프로그램을 받았는데 실행이 안되었다니 안타깝고 죄송해지네요. 일단 위에 알려주신 에러의 내용은 프로그램의 구동에 문제 여부가 아닌 프로그램 실행 전부터 프로그램이나 운영체제, 기타에 바이러스로 인한 메모리 호출에 문제가 생겨서 발생한 에러입니다.
삭제제 프로그램이 바이러스에 걸렸거나 사용자 환경에 바이러스가 걸린 경우라고 예상됩니다.
일단 프로그램은 제가 지금 컴퓨터나 가상 환경에서 실행이 잘 되었는데 다른 문제가 있을수 있으니 좀 더 알아보겠습니다.
도움이 되지 못해 죄송합니다. ㅠㅠ
이번주 토요일쯤 추가 기능도 더한 버전으로 올릴 예정입니다.
친절한 답글 너무 감사합니다.!
꽤나 시간이 지난 글에 달아둔 댓글에도 빠른확인과 친절한 답변 감사합니다!
삭제조금 늦었지만 새 버전으로 프로그램 제작이 끝났습니다.
삭제https://kinanadel.blogspot.com/2019/06/c.html
이 포스트로 이동하시면 프로그램과 단어장 다운과 설명을 보실 수 있습니다. ^^
늦어서 죄송합니다.
죄송한데 제가 비주얼 스튜디오 에서 소스 긁어서 붙여넣기 했는데 실행이 안되서 그러거든요
답글삭제디자인을 일일이 하기가 좀 어려워서 그러는데요
Designer.cs 와 resx 파일좀 첨부해주실수 있나요?
wjswk0305@naver.com 입니다,
이 포스트 작성때는 데이터 읽는 로직 소개용으로 작성해서 디자인이나 환경 설정 부분이 빠졌었는데요.
삭제지금 후속편 작성 중이니 조금만 기다려주세요.
조금 늦었지만 새 버전으로 프로그램 제작이 끝났습니다.
삭제https://kinanadel.blogspot.com/2019/06/c.html
이 포스트로 이동하시면 프로그램과 단어장 다운과 설명을 보실 수 있습니다. ^^
늦어서 죄송합니다.