Q&A

  • 과제물인데요...소스좀 봐주세요....
{*
고객별 정보 이용 요금 프로그램
고객번호,나이,정보종류코드,사용시간,정보포인트를 입력받아 프로그램 작성하시오.
*}
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Grids;

type
  TForm1 = class(TForm)

    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Edit1 : TEdit;
    Edit2 : TEdit;
    Edit3 : TEdit;
    Edit4 : TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;
   //입력 자료 변수 선언
  TOutData = Record
    sNumber : Integer;
    Age : Integer;
    sCode : string;
    Base : Integer;
    Time : Integer;
    Amount : Integer;
  end;

  TInfoTab = Record
    sInfoCd : String;
    SInfoNm : String;
    Amount : Integer;
    Count  : Integer;
  end;

var
  Form1: TForm1;
  DataBuf : Array[1..7] of TOutData;
  InfoBuf : Array[1..5] of TInfoTab;
  i, Cnt : integer;
implementation
uses Unit2;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 버퍼 초기화
   for i := 1 to 7 do begin
    DataBuf[i].sNumber := 0;
    DataBuf[i].Age    := 0;
    DataBuf[i].sCode   := '';
    DataBuf[i].Base   := 0;
    DataBuf[i].Time   := 0;
    DataBuf[i].Amount := 0;
    if i < 6 then InfoBuf[i].Count := 0;
  end;

  // 정보종류 초기화
  InfoBuf[1].sInfoCd := 'AA';
  InfoBuf[1].sInfoNm := '여행';
  InfoBuf[1].Amount := 4000;
  InfoBuf[2].sInfoCd := 'BB';
  InfoBuf[2].sInfoNm := '서적';
  InfoBuf[2].Amount := 2000;
  InfoBuf[3].sInfoCd := 'CC';
  InfoBuf[3].sInfoNm := '영화';
  InfoBuf[3].Amount := 3000;
  InfoBuf[4].sInfoCd := 'DD';
  InfoBuf[4].sInfoNm := '주식';
  InfoBuf[4].Amount := 4000;
  InfoBuf[5].sInfoCd := 'EE';
  InfoBuf[5].sInfoNm := '운세';
  InfoBuf[5].Amount := 5000;

  Cnt := 0;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  {*******************************
    입력폼 설계시 조건 체크 한다.
  ********************************}

  // 최대 입력자료의 건수(7건) 체크
  if Cnt > 7 then
  begin
    ShowMessage('최대 입력자료의 건수(7건) 확인하세요!!');
    exit;
  end;

  // 고객번호 두자리 정수값 범위(10-99) 체크
  if (StrToIntdef(Trim(Edit1.Text),-99) = -99) or
     (StrToInt(Trim(Edit1.Text)) < 10) or
     (StrToInt(Trim(Edit1.Text)) > 99) then
  begin
    ShowMessage('고객번호 두자리 정수값 범위(10-99) 확인하세요!!');
    Edit1.SetFocus;
    exit;
  end;

  // 나이 정수값 범위(1-99) 체크
  if (StrToIntdef(Trim(Edit2.Text),-99) = -99) or
     (StrToInt(Trim(Edit2.Text)) < 1) or
     (StrToInt(Trim(Edit2.Text)) > 99) then
  begin
    ShowMessage('나이 정수값 범위(1-99) 확인하세요!!');
    Edit2.SetFocus;
    exit;
  end;

  // 정보종류코드 영문자 두자리 체크
  if (Length (Trim(Edit3.Text)) <> 2) or
     (Trim(Edit3.Text) <> 'AA') and
     (Trim(Edit3.Text) <> 'BB') and
     (Trim(Edit3.Text) <> 'CC') and
     (Trim(Edit3.Text) <> 'DD') and
     (Trim(Edit3.Text) <> 'EE') then
  begin
    ShowMessage('정보종류코드 영문자 두자리 확인하세요!!');
    Edit3.SetFocus;
    exit;
  end;

  // 사용시간 정수값 범위(1-99) 체크
  if (StrToIntdef(Trim(Edit4.Text),-99) = -99) or
     (StrToInt(Trim(Edit4.Text)) < 1) or
     (StrToInt(Trim(Edit4.Text)) > 99) then
  begin
    ShowMessage('사용시간 정수값 범위(1-99) 확인하세요!!');
    Edit4.SetFocus;
    Exit;
  end;
  //고객별로 입력 Data를 1회로 제한
begin
for i:= 1 to Cnt do
begin
if Form2.stringGrid1.Cells[0,i] = Trim(Edit4.Text) then
begin
//고객이 이용할 수 있는 정보종류의 수는 1개로 제한한다.
if Form2.stringGrid1.Cells[2,i] = Trim(Form2.Edit1.Text) then
begin
showMessage('고객이 이용한 정보종류가 존재합니다.!!');
Edit4.SetFocus;
Exit;
end;
showMessage('고객의 입력 데이타가 존재합니다.!!');
Edit4.SetFocus;
Exit;
end;
end;
end;

  {*******************************
    입력 데이타를 배열에 저장한다.
  ********************************}
  Inc(Cnt);
  DataBuf[Cnt].sNumber := StrToInt(Trim(Edit1.Text));
  DataBuf[Cnt].Age := StrToInt(Trim(Edit2.Text));
  DataBuf[Cnt].Time := StrToInt(Trim(Edit3.Text));
  if StrToInt(Trim(Edit2.Text)) < 16 then DataBuf[Cnt].Base := 1000
   else if StrToInt(Trim(Edit2.Text)) < 30 then DataBuf[Cnt].Base := 1500
   else DataBuf[Cnt].Base := 2000;



  begin
    if Trim(Edit4.Text) = InfoBuf[i].sInfoCd then
    begin
      DataBuf[Cnt].Amount := DataBuf[Cnt].Base + DataBuf[Cnt].Time * InfoBuf[i].Amount; //고객정보이용료
      DataBuf[Cnt].sCode := InfoBuf[i].sInfoNm; //정보종류명
      InfoBuf[i].Count := InfoBuf[i].Count + 1; //최고이용횟수 누적
    end;
  end;
    Form2.FormCreate(nil);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Cnt < 1 then
  begin
    ShowMessage('데이타를 1건이상 입력하세요!!');
    Exit;
  end;

  Form2.Caption := '200334-175841 김정미';
  Form2.ShowModal;
  Form2 := TForm2.Create(nil);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Close;
end;

end.


unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    Panel9: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5 : TEdit;
    StringGrid1 : TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation
uses Unit1;
{$R *.DFM}

procedure TForm2.FormCreate(Sender: TObject);
var
  i,j,tmpAmount:integer;
begin
  {*******************************
    문제1번의 결과를 구한다.
  ********************************}
  // 최대정보이용료 비교
  tmpAmount := DataBuf[1].Amount;
  j := 1;
  for i := 2 to Cnt do
  begin
    if DataBuf[i].Amount > tmpAmount then
    begin
      tmpAmount := DataBuf[i].Amount;
      j := i;
    end;
  end;

  // 변수를 Form에 치환한다.
  Edit1.Text := IntToStr(DataBuf[j].sNumber); //고객번호
  Edit2.Text := IntToStr(DataBuf[j].Age);       //고객나이
  Edit3.Text := FormatFloat('###,###',DataBuf[j].Amount); //고객정보이용료

  
  {*******************************
    문제2번의 결과를 구한다.
  ********************************}
  // 최고이용횟수 비교
  tmpAmount := InfoBuf[1].Count;
  for i := 1 to 5 do
  begin
    if tmpAmount <= InfoBuf[i].Count then
    begin
      tmpAmount := InfoBuf[i].Count;
      j := i;
    end;
  end;
  Edit4.Text := InfoBuf[j].sInfoNm; //정보종류명
  Edit5.Text:= IntToStr(InfoBuf[j].Count) + '번'; //최고이용횟수


  {*******************************
    문제3번의 결과를 구한다.
  ********************************}
  // 타이틀 치환한다.
  StringGrid1.Cells[0,0] := '고객번호';
  StringGrid1.Cells[1,0] := '나이';
  StringGrid1.Cells[2,0] := '정보종류명';
  StringGrid1.Cells[3,0] := '기본요금';
  StringGrid1.Cells[4,0] := '사용시간';
  StringGrid1.Cells[5,0] := '고객정보사용금액';

  // 전체고객테이블을 치환한다.
  for i := 1 to Cnt do
  begin
    StringGrid1.Cells[0, i] := IntToStr(DataBuf[i].sNumber);
    StringGrid1.Cells[1, i] := IntToStr(DataBuf[i].Age);
    StringGrid1.Cells[2, i] := DataBuf[i].sCode;
    StringGrid1.Cells[3, i] := FormatFloat('###,###', DataBuf[i].Base)+'원';
    StringGrid1.Cells[4, i] := IntToStr(DataBuf[i].Time);
    StringGrid1.Cells[5, i] := FormatFloat('###,###', DataBuf[i].Amount)+'원';
  end;

end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Close;
end;

end.

입력버튼을 누르면 입력이 안되요..
교수님이 주신 참고자료하구 교과서를 봐도 잘 모르겟어여...
조언 부탁드릴께요

3  COMMENTS
  • Profile
    너구리 2004.05.15 02:26
  • Profile
    김정미 2004.05.15 02:45
    파일 첨부합니다...
    죄송합니다...
  • Profile
    너구리 2004.05.15 03:10
    아 죄송할것 까지는 없는데요,..

    그냥 보기가 너무 힘들어서..(제가 내공이 부족할지도..)

    Unit1의 159줄에

    if Form2.stringGrid1.Cells[0,i] = Trim(Edit4.Text) then

    일단 입력을 해보니..Access violation 이 나네요..

    이건 메모리가 할당되지 않았는데 사용하려 해서 난겁니다.

    Form2 는 아직 만들어 지지 않았습니다.

    그리고 form2를 만들기 위해서는 데이트를 입력해야 되네요..

    이러니 죽어도 입력 할수도 출력 폼을 볼수도 없겠죠..그러니

    스트링그리드로 접근하지 마시고 훌륭한 레코드가 있지 않습니까..

    databuf를 뒤지십시오..

    그리고 더 말씀드린다면 들여 쓰시는 꼭 하시구요..

    아무데나 begin end; 넣지 마시구요..

    185번째 줄에

    DataBuf[Cnt].Time := StrToInt(Trim(Edit3.Text));

    이거 오타인거 같습니다. 시간에 종류코드를 넣었어요..

    그리고 출력 버턴

    Form2.ShowModal;
    Form2 := TForm2.Create(nil);

    저러면 또 access violation 입니다.

    먼저 만들고 그담에 씁시다..

    Form2 := TForm2.Create(nil);
    Form2.ShowModal;

    근데 어느 학교 입니까? 어떤분이 저한테 통채로 만들어 달라고 하셨는데..
    이분을 본받았으면 하네요..

    궁금하신거 있음 더 질문하세요..몇부분만 수정하면 훌륭합니다.

    더 도와 드리고 싶은데 퇴근을 해야되서..

    내일까지 내는걸로 알고 있습니다.

    화이팅이요~~