델파이 왕초보 입니다. 저는 현재 방통대 컴과학과에 다니는 학생인데
과제를 하다가 막히는 곳이 있어 도움을 구하기위해 질문을 하려 합니다.
밑의 과제 내용중.. 거의 다 했다고 생각하는데, 몇가지 더 추가할 내용이
잘 안됩니다.
추가할 내용은..
**** 과제 내용****
“고객번호, 고객종류코드, 통신사용시간”을 입력받아서 통신사용요금을 구하는 프로그램을 작성할 것.
**** 처리조건 ****
1. 통신사용요금은
1) 통신사용시간이 기본시간 이하일 경우 :
(기본요금 + (통신사용시간 * 기본시간당 요금단가))
2) 통신사용시간이 기본시간을 초과할 경우
[기본요금 + (통신기본사용기간 * 기본시간당 요금단가) +
{(통신사용시간 – 통신기본시간) * 초과시간당 사용 요금단가}]
2. 통신사용요금이 50,000 이상이면 비고란에 “우수”라고 출력한다.
3. 입력된 모든 고객이 사용한 통신요금 “총 합계”를 구한다.
4. 입력된 모든 고객이 사용한 통신시간 “총 사용시간”을 구한다.
5. 고객종류명은 <고객종류 코드표>를 참조하여 출력한다.
고객종류코드표
고객코드 고객종류명
SM 우대회원
PM 일반회원
GM 단체회원
6. 기본요금은 <요금정산표>를 참조하여 출력한다.
요금산정표
고객코드 기본요금 통신기본사용시간 기본시간당 요금단가 초과시간당 요금단가
SM 50000 300 80 90
PM 25000 250 75 75
GM 15000 100 90 100
7. 입력화면 설계시
1) Data의 입력은 반드시 입력화면에서 받도록 설계한다.
2) 고객번호는 두 자리 정수로 입력하고, 중복되지 않는다.
3) 고객종류코드는 영문 2자리로 입력한다. 영문은 대소문자와는 무관하다.
4) 최대 입력자료의 건수는 10건이하로 한다.
5) 레코드별 입력 항목의 입력순서는 “고객번호, 고객종류코드, 통신사용시간”이 되도록 설계한다.
6) 입력과 출력을 구분하는 기능을 포함한다.
8. 출력화면 설계시
1) 출력화면은 반드시 화면으로 한다.
2) 입력받은 항목과 추가로 계산된 항목을 출력한다.
추가항목 : 통신사용요금, 비고, 총 사용시간, 총 합계를 출력한다.
9. 입력폼과 출력폼은 각각 1개로 제한한다.
*** 이 중에서 ***
2. 통신사용요금이 50,000 이상이면 비고란에 “우수”라고 출력한다.
3. 입력된 모든 고객이 사용한 통신요금 “총 합계”를 구한다.
4. 입력된 모든 고객이 사용한 통신시간 “총 사용시간”을 구한다.
<=== 위의 3개만 더 추가하면 되는데..
깡통이 어려운거 할려니 잘안되는가 봅니다 ㅡㅡ^
그래도 처음 짜보는 델파이 프로그램이 일단 실행이 되고 스트링 그리드 7칸중에
4칸이나 입력내용이 받아 지는게 참 희안하고 감동적입니다 ㅡ,.ㅡ
위의 3가지 사항이 어떤위치에 어떻게 들어가야 하는지 조언좀 부탁 드립니다.
그럼 꾸벅 ~
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Edit2: TEdit;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
//이벤트 발생시 자동생성되는 프로시져
procedure EditClear;
//사용자가 정의한 프로시져
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1; //입력폼으로 사용
implementation
uses Unit2; //유닛2를 사용한다
{$R *.dfm}
Var //전역변수 정의
count: integer; //입력 데이터를 count하는 변수
procedure TForm1.EditClear; //사용자가 정의한 프로시져
begin
Edit1.Clear; //edit컴포넌트를 클리어 시킴
Edit2.Clear;
end;
//입력버튼 클릭 이벤트 발생시
procedure TForm1.Button1Click(Sender: TObject);
var
clientno, usetime, money, totaltime, totalmoney : integer;
clientcode, note : String;
nos, i, ii : integer;
begin
if count = 10 then //입력 데이터가 10건인지 체크
begin
ShowMessage('경고! 10건 이상은 처리 불가능');
EditClear; //edit프로시져를 이용해 클리어 시킴
exit; //입력버튼으로 빠져나감
end;
if (clientno >= 100) and (clientno <0) then //고객번호가 두자리 정수인지 체크
begin
ShowMessage('고객번호를 두자리 정수로 입력하시오.');
EditClear;
exit;
end
else if Edit1.Text = '' then //edit박스 내용 입력 유무 확인
begin
ShowMessage('고객번호 입력');
exit;
end;
for i := 1 to 99 do //고객등록번호 중복 방지
if (Edit1.Text = Form2.StringGrid1.Cells[0, i]) then
begin
ShowMessage('이미 등록된 번호입니다.')
end;
if ComboBox1.Text = '고객종류코드' then
begin
ShowMessage('고객종류코드를 선택하세요');
exit;
end;
if Edit2.Text = '' then
begin
ShowMessage('통신사용시간 입력');
EditClear;
exit;
end;
with Form2.StringGrid1 do
begin
Cells[0, RowCount-1]:= Edit1.Text;
Cells[1, RowCount-1]:= Combobox1.Text;
Cells[2, RowCount-1]:= Edit2.Text;
if Combobox1.Text = 'SM' then //고객등급이 'SM'인 경우 요금 계산
begin
if StrToInt(Edit2.Text) <= 300 then //통신사용시간이 기본시간 이하
begin
Cells[3, RowCount-1] := IntToStr(50000 + ( StrToInt(Edit2.Text) * 80 ));
end
else if StrToInt(Edit2.Text) > 300 then //통신사용시간이 기본시간 초과
begin
Cells[3, RowCount-1] := IntToStr(50000 + ( 300 * 80 ) + ((StrToInt(Edit2.Text) - 300 ) * 90));
end;
end;
if Combobox1.Text = 'PM' then //고객등급이 'PM'인 경우 요금 계산
begin
if StrToInt(Edit2.Text) <= 250 then //통신사용시간이 기본시간 이하
begin
Cells[3, RowCount-1] := IntToStr(25000 + ( StrToInt(Edit2.Text) * 75 ));
end
else if StrToInt(Edit2.Text) > 250 then //통신사용시간이 기본시간 초과
begin
Cells[3, Form2.StringGrid1.RowCount-1] := IntToStr(25000 + ( 250 * 75 ) + ((StrToInt(Edit2.Text) - 250 ) * 75));
end;
end;
if Combobox1.Text = 'GM' then //고객등급이 'GM'인 경우 요금 계산
begin
if StrToInt(Edit2.Text) <= 100 then //통신사용시간이 기본시간 이하
begin
Cells[3, RowCount-1] := IntToStr(15000 + ( StrToInt(Edit2.Text) * 100 ));
end
else if StrToInt(Edit2.Text) > 100 then //통신사용시간이 기본시간 초과
begin
Cells[3, RowCount-1] := IntToStr(15000 + ( 100 * 90 ) + ((StrToInt(Edit2.Text) - 100 ) * 100));
end;
end;
RowCount := RowCount + 1
end; //end of with
EditClear;
Edit1.SetFocus;
Inc(Count);
end;
procedure TForm1.Button2Click(Sender: TObject); //출력버튼 클릭
begin
Form2.show; //출력결과를 출력폼에 보여줌
end;
procedure TForm1.Button3Click(Sender: TObject); //종료 버튼 클릭
begin
close; //입력폼 실행을 종료
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
count:= 0; //카운트 변수를 초기화
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls;
type
TForm2 = class(TForm)
Panel1: TPanel;
StringGrid1: TStringGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
const //상수로 정의 - 고정된 특정한 변수 사용 가능
sub: array[0..6] of string[13] = ('고객번호', '고객종류코드', '통신사용시간', '통신사용요금', '비 고', '총 사용시간', '총 합계(요금)');
//스트링 그리드의 제목을 초기화 위해 배열로 선언
procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
i: integer; //반복을 위한 임시 변수 선언
begin
for i:= 0 to 6 do
StringGrid1.Cells[i,0]:= sub[i]; //제목을 초기화
end;
end.
님이 원하시는 내용을 위해서 몇가지 추가를 해야하고
또 몇가지를 삭제해야 합니다.
스트링그리드에는
고객번호, 고객종류코드, 통신사용시간, 통신사용요금, 비 고
이렇게 5개의 칼럼만 있으면 되구여,
총통화시간과 총통화요금은 입력된 각고객의 누적이므로
form2에 Edit1과 Edit2를 올려놓으셔서 하시는것이 나을듯 합니다.
먼저 form1의 button1클릭이벤트에서는 다음과 같이 하시면 됩니다.
님것에서 그냥 제가 변형을 했습니다.
procedure TForm1.Button1Click(Sender: TObject);
var
clientno, usetime, money : integer;
clientcode, note : String;
nos, i, ii : integer;
begin
if count = 10 then //입력 데이터가 10건인지 체크
begin
ShowMessage('경고! 10건 이상은 처리 불가능');
EditClear; //edit프로시져를 이용해 클리어 시킴
exit; //입력버튼으로 빠져나감
end;
if (clientno >= 100) and (clientno <0) then //고객번호가 두자리 정수인지 체크
begin
ShowMessage('고객번호를 두자리 정수로 입력하시오.');
EditClear;
exit;
end
else if Edit1.Text = '' then //edit박스 내용 입력 유무 확인
begin
ShowMessage('고객번호 입력');
exit;
end;
for i := 1 to 99 do //고객등록번호 중복 방지
if (Edit1.Text = Form2.StringGrid1.Cells[0, i]) then
begin
ShowMessage('이미 등록된 번호입니다.') ;
Exit ;
end;
if ComboBox1.Text = '고객종류코드' then
begin
ShowMessage('고객종류코드를 선택하세요');
exit;
end;
if Edit2.Text = '' then
begin
ShowMessage('통신사용시간 입력');
EditClear;
exit;
end;
with Form2.StringGrid1 do
begin
Cells[0, RowCount-1]:= Edit1.Text;
Cells[1, RowCount-1]:= Combobox1.Text;
Cells[2, RowCount-1]:= Edit2.Text;
if Combobox1.Text = 'SM' then //고객등급이 'SM'인 경우 요금 계산
begin
if StrToInt(Edit2.Text) <= 300 then //통신사용시간이 기본시간 이하
begin
Cells[3, RowCount-1] := IntToStr(50000 + ( StrToInt(Edit2.Text) * 80 ));
end
else if StrToInt(Edit2.Text) > 300 then //통신사용시간이 기본시간 초과
begin
Cells[3, RowCount-1] := IntToStr(50000 + ( 300 * 80 ) + ((StrToInt(Edit2.Text) - 300 ) * 90));
end;
end;
if Combobox1.Text = 'PM' then //고객등급이 'PM'인 경우 요금 계산
begin
if StrToInt(Edit2.Text) <= 250 then //통신사용시간이 기본시간 이하
begin
Cells[3, RowCount-1] := IntToStr(25000 + ( StrToInt(Edit2.Text) * 75 ));
end
else if StrToInt(Edit2.Text) > 250 then //통신사용시간이 기본시간 초과
begin
Cells[3, Form2.StringGrid1.RowCount-1] := IntToStr(25000 + ( 250 * 75 ) + ((StrToInt(Edit2.Text) - 250 ) * 75));
end;
end;
if Combobox1.Text = 'GM' then //고객등급이 'GM'인 경우 요금 계산
begin
if StrToInt(Edit2.Text) <= 100 then //통신사용시간이 기본시간 이하
begin
Cells[3, RowCount-1] := IntToStr(15000 + ( StrToInt(Edit2.Text) * 100 ));
end
else if StrToInt(Edit2.Text) > 100 then //통신사용시간이 기본시간 초과
begin
Cells[3, RowCount-1] := IntToStr(15000 + ( 100 * 90 ) + ((StrToInt(Edit2.Text) - 100 ) * 100));
end;
end;
//*******비고값 넣기 및 모든고객 사용시간과 총통화요금 구하기***********
// 비고값 구하기
with Form2.StringGrid1 do
begin
money := StrToIntDef(Cells[3, RowCount-1], 0) ;
if money = 0 then
showMessage('수치데이터 변환에러')
else if money >= 50000 then
Cells[4, RowCount-1] := '우수' ;
// 모든고객 총사용시간 및 총통화요금 구하기
totaltime := totaltime + StrToInt(Cells[2, RowCount-1]) ;
totalmoney := totalmoney + StrToInt(Cells[3, RowCount-1]) ;
end ;
//************************************************************
RowCount := RowCount + 1
end; //end of with
EditClear;
Edit1.SetFocus;
Inc(Count);
//*****************모든고객 총통화시간 및 통통화요금 출력하기 ************
with form2 do
begin
Edit1.Text := IntToStr(totaltime) ;
Edit2.Text := IntToStr(totalmoney) ;
end ;
//***************************************
end;
위에서 , 고객코드중복방지 루틴에서 exit를 빠뜨렸더군여. 그것도
함께 추가하셔야 합니다. ^^
그리고, totaltime과 totalmoney변수는 외부변수로 하셔야 합니다.
외부변수는 굳이 0으로 초기화 안해도 integer변수는 자동 0으로
초기화 됩니다. 그래도 가식성을 위해서 늘 해주는것이 좋습니다 ^^
그럼 이젠 form2에서는 제가 말씀드린대로 eidt1, edit2를 올려놓으시구여.
아래와같이 하시면 됩니다.
const //상수로 정의 - 고정된 특정한 변수 사용 가능
sub: array[0..4] of string[13] = ('고객번호', '고객종류코드', '통신사용시간', '통신사용요금', '비 고');
//스트링 그리드의 제목을 초기화 위해 배열로 선언
procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
i: integer; //반복을 위한 임시 변수 선언
begin
for i:= 0 to 4 do
StringGrid1.Cells[i,0]:= sub[i]; //제목을 초기화
end;
이상 님것과 함 비교해보세요.
문제 있으면 연락주십시요.
참, 숫자는 기본적으로 오른쪽 정렬을 하셔야하구여,
숫자에는 천단위마다 콤마가 찍히는것이 기본입니다.
아시죠? 이것까지 잘 처리해주시기 바랍니다. ^^;
그런데, 방통대 다니시면 지금 제 친구가 방통대 전산실에서
일하고 있는데 ㅋㅋㅋ(단기직으로 ^^;)
아무튼, 건투를 빕니다.