Q&A

  • 델파이 배우는 학생인데 질문이요!!


안녕하세요. 델파이를 공부중인 초보 학생입니다. 소스 입력후 실행 후 다 되는데

질문이 하나 있습니다.(밑에는 소스 입니다.)

일단 첨부파일 보시면 제가 입력값에 100 이상의 값을 입력했습니다. 그러면 팝업창이 뜨는데

0부터 100까지 사이의 수를 입력하라고 하면서 팝업이 닫힙니다. 이 다음부터가 질문입니다.

팝업창이 닫히고 나서 해당값이 초기화 되고 그 자리에 커서가 자동으로 들어갈수 있게 하는

방법에 대한 질문입니다. 고수분들의 답변 부탁드립니다.

unit sm3_1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    btnInput: TButton;
    btnOutput: TButton;
    btnExit: TButton;
    procedure btnOutputClick(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
    procedure btnInputClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  //전역변수 선언
  Count : integer;
  Ground : array[1..40, 1..8] of string;
  //인원수 40명 제한, 동적배열로 처리(?)
  //각 행은 8열(총점, 평균 포함)

implementation

uses sm3_2;     //유닛2 이용

{$R *.DFM}

procedure TForm1.btnOutputClick(Sender: TObject);
var
  i, j, k, sum1, sum2, sav_sum, rank,  sav_rank  : integer;
  temp : string;
begin
//총점 내림차순 정렬
  for  i := 1 to Count-2 do
    for j := i+1  to Count-1 do begin
      sum1 := StrToInt(Ground[i, 7]);
      sum2 := StrToInt(Ground[j, 7]);
      if (sum1 < sum2) then
        for k := 1 to 8 do
          begin
            temp := Ground[i, k];
            Ground[i, k] := Ground[j, k];
            Ground[j, k] := temp;
          end;
    end;
//석차부여(동일 총점은 동일 석차)
  rank := 0;
  for  i := 1 to Count-1 do begin
   if sav_sum <> StrToInt(Ground[i, 7]) then  begin
      rank := rank + 1;
      Ground[i, 1] := IntToStr(rank);
      sav_sum := StrToInt(Ground[i, 7]);
      sav_rank := StrToInt(Ground[i, 1]);
    end
    else  begin
        Ground[i, 1] := IntToStr(sav_rank);
        rank := rank + 1;
      end;
  end;

  //배열 Ground의 값을 Form2의 스트링그리드로 이동
  for i := 1 to Count-1 do begin
     for j := 1 to 8 do  begin
       Form2.StringGrid1.Cells[j-1, i] := Ground[i, j];
     end;
   end;
  Form2.Show;  //Form2 보기
end;

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

procedure TForm1.btnInputClick(Sender: TObject);
var
  sum : integer;
begin  // 첫번째
   if (Edit1.Text='') then
       // 만약에 Edit1.text에 널값 입력시
     MessageDlg('학번을 입력하세요',mtConfirmation,[mbOK],0)
       // 동그란 물음표 표시로 Edit1에 널값으로 입력시 메시지창이 뜬다.
   else if
      (Edit2.Text='') then
      // 만약에 Edit2.text에 널값 입력시
     MessageDlg('이름을 입력하세요',mtConfirmation,[mbOK],0)
      // 동그란 물음표 표시로 Edit2에 널값으로 입력시 메시지창이 뜬다.
    else if StrToInt(Edit3.Text) < 0 then // 정수값 Edit3.Text가 0보다 작을 경우
      MessageDlg('0부터 100사이의 수를 입력하세요',mtInformation,[mbOK],0)
      // 동그란 느낌표 표시로 Edit3에 0보다 작은 수를  입력시 메시지창이 뜬다.
    else if StrToInt(Edit3.Text) > 100 then // 정수값 Edit3.Text가 100보다 클 경우
      MessageDlg('0부터 100사이의 수를 입력하세요',mtInformation,[mbOK],0)
      // 동그란 느낌표 표시로 Edit3에 100보다 큰 수를  입력시 메시지창이 뜬다.
    else if StrToInt(Edit4.Text) < 0 then // 정수값 Edit4.Text가 0보다 작을 경우
      MessageDlg('0부터 100사이의 수를 입력하세요',mtInformation,[mbOK],0)
      // 동그란 느낌표 표시로 Edit4에 0보다 작은 수를  입력시 메시지창이 뜬다.
    else if StrToInt(Edit4.Text) > 100 then // 정수값 Edit4.Text가 100보다 클 경우
      MessageDlg('0부터 100사이의 수를 입력하세요',mtInformation,[mbOK],0)
      // 동그란 느낌표 표시로 Edit4에 100보다 큰 수를  입력시 메시지창이 뜬다.
    else if StrToInt(Edit5.Text) < 0 then // 정수값 Edit5.Text가 0보다 작을 경우
      MessageDlg('0부터 100사이의 수를 입력하세요',mtInformation,[mbOK],0)
      // 동그란 느낌표 표시로 Edit5에 0보다 작은 수를  입력시 메시지창이 뜬다.
    else if StrToInt(Edit5.Text) > 100 then // 정수값 Edit5.Text가 100보다 클 경우
      MessageDlg('0부터 100사이의 수를 입력하세요',mtInformation,[mbOK],0)
      // 동그란 느낌표 표시로 Edit5에 100보다 큰 수를  입력시 메시지창이 뜬다.
     else
      begin
        Form2.StringGrid1.RowCount := Count+1;
        Ground[Count, 2] := Edit1.Text;
        Ground[Count, 3] := Edit2.Text;
        Ground[Count, 4] := Edit3.Text;
        Ground[Count, 5] := Edit4.Text;
        Ground[Count, 6] := Edit5.Text;
        sum := StrToInt(Edit3.Text) + StrToInt(Edit4.Text) + StrToInt(Edit5.Text);
        Ground[Count, 7] := IntToStr(sum);  //총점
        Ground[Count, 8] := Format('%4.1f', [sum/3]);  //평균
        Inc(Count);
        Edit1.Text :='';
        Edit2.Text :='';
        Edit3.Text :='';
        Edit4.Text :='';
        Edit5.Text :='';
        Edit1.SetFocus;
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);  //폼 생성 시에 실행
begin
  Count := 1;
end;

end.



3  COMMENTS
  • Profile
    유재호 2009.05.27 06:23
    아. 참고로 오류나는건 아니구요. 추가로 질문한것에 대한 소스에 대해 알고 싶은데 제가 초짜라 힘드네요..-_ㅠ
  • Profile
    최용일 2009.05.27 06:30
    예외가 발생하는 상황을 피하실려면 StrToInt보다는 StrToIntDef를 쓰시는것이 좋습니다.

    if StrToIntDef(Edit4.Text, -1) < 0 then // 정수값 Edit4.Text가 0보다 작을 경우
    begin
    MessageDlg('0부터 100사이의 수를 입력하세요',mtInformation,[mbOK],0);
    Edit4.Text := ''; // 값 초기화
    Edit4.SetFocus; // 포커스 이동
    end;
  • Profile
    유재호 2009.05.29 01:11
    답변 감사합니다..^^