Q&A

  • 폼에서 생성한 memo 를 별도로 함수만 모아놓은 pas 내의 함수로...
안녕하세요..
주말 다들 잘 보내셨는지요..^^
항상 좋은 일들만 있으시길 바랍니다.

질문은요.. MDI 폼에서 MDI CHILD(a.pas; af(폼이름)) 로 만들 폼의 MEMO 콤포넌트에..
글을 입력하는 내용인데요...

코딩 길이가 너무 길고, 나중에 좀더 편하게 수정하기 위하여
필요한 함수만 모아놓은 별도 pas(b.pas) 를 하나더 만들어 그곳에...
procedure DayInfoTable(day : string;Rday : string); 함수를 만들어
필요데이타만 을 보내면, 그곳에서 데이타파일을 불러서....  앞의 폼에서
만든  memo 콤포넌트에 쓸려고 합니다...

그래서 우선은 사용한 방법이  uses 절에 앞의 a 를 인클르드 시키고..
밑에서
af.memo 로 해서 입력하면은 될것 같은데요..

생각해 보니.. a.pas 에서 b.pas 를 불르고,  b.pas에서 다시 a.pas 를 부르니.. 많이 무식한 방법 같아요..
그런데.. 그렇게..지금 막 코딩해서 컴파일했더니 컴파일에러는 안 나는데..

메모리에서 충돌이 난다고.. 에러가 나네요. ^^;;

고수님들의 조언 부탁드립니다... 아니면.. a.pas내에서 b.pas내에 함수를 부를때, procedure DayInfoTable(day : string;Rday : string, memo : TForm); 으로 이런 식으로 하는 것인지..잘 개념이....

그리고 하나 더 질문드리면, 맨위의 uses 절과...
implementation
다음의 uses 절에 대한 차이를 모르겠어요..^^;;;;;;;

잘 부탁드리고..모든 분들에 가정에 평화가 있으시길 바랍니다...
3  COMMENTS
  • Profile
    윤수아 2003.10.21 21:47
    질문 내용이 잘 이해가 안 가지만서도...
    음 일반적으로 우리가 쓰기 편한 함수들을 모아서 하나의 Pas화일을 만드는 것은 다른 프로젝트에도 그 Pas화일을 유용하게 쓰고자 함입니다.
    근데 거기서 지금 프로젝트에 포함된 파일을 uses하시면 다른 프로젝트에서 쓰실때는 그 부분을 수정하셔야겠죠?
    그니까 자신만의 함수를 모아서 만드는 Pas 화일은 독립적이어야 합니다.
    가령...
    Memo 컴포넌트에...주어진 숫자(임의로 StartInt)부터 주어진 숫자(임의로 EndInt)까지 1씩 증가해서 입력하는 함수가 필요하다라고 했을 때

    procedure MemoADDInt(MyMemo : TMemo; StartInt : integer; EndInt : integer);
    var
      Loop : integer;
    begin
      for Loop := StartInt to EndInt do
      begin
         MyMemo.Lines.add(IntToStr(Loop));
      end;
    end;

    이렇게 짜두시면... 해당폼에서는 인자 넘겨주시고 위의 함수만을 호출하면 됩니다.. 그럼 괜히 서로가 서로를 uses 해야하는 상황을 피할 수 있습니다.

    더 말씀 드리자면... 저 함수를 더욱 유용하게 만들기 위해서는
    procedure MemoADDInt(MyObject : TObject ; StartInt : integer; EndInt : integer);
    var
      Loop : integer;
    begin
      for Loop := StartInt to EndInt do
      begin
        if (MyObject is TMemo) then
        begin
          TMemo(MyObject) .Lines.add(IntToStr(Loop));
        end else if (MyObject is TListBox) then
        begin
           TListBox(MyObject) .Items.add(IntToStr(Loop));
        end;
      end;
    end;

    이렇게 만드시면 TMemo 뿐만 아니라 TListBox도 넘길 수 있고...코딩을 더
    추가 하신다면 TListView...등등도 넘길 수 있게 되어서...여기저기 프로젝트에서 쉽게 쓸 수 있습니다..

    그리고 저렇게 오브젝트 자체를 넘기는 방식으로 짜고 싶지 않다고 하시면...
    TMemo 혹은 TObject 대신에 TStrings 를 인자로 해서 짜실 수도 있습니다.

    procedure MemoADDInt(MyItems : TStrings; StartInt : integer; EndInt : integer);
    var
      Loop : integer;
    begin
      for Loop := StartInt to EndInt do
      begin
         MyItems.add(IntTOStr(Loop ));
      end;
    end;

    이렇게 하시고 호출하실 때
    MemoAddInt(Memo1.Lines,1,100); 이런식으로 하시면 됩니다..

    어쨌건...결론적으로는 님께서 쓰기 편한 함수들을 모아놓은 Pas화일은
    프로젝트 독립적이어야 한다는 겁니다... 클래스 파일 역시 그 파일 안에서
    프로젝트의 이 폼 저 폼을 uses 시키는 일이 없도록 독립적으로 만들어 놓아야
    다른 프로젝트의 적은 수정으로 그 클래스 파일을 갖다 쓰실 수 있습니다.

  • Profile
    민경철 2003.10.21 22:47
    주신 답변 너무 감사드립니다.

    제가.. 4gl 쪽 프로그래머로 일하다..웹프로그램만 짠지.. 3년가까이 되는동안..
    응용프로그램도 웹 빗스하게 짜게 된거 같아요..(그렇다고 웹프로그램이 안 좋다는 것이 아니라 제가.. 다 허접해서 그런거 같아요..)

    주신답변으로 많은 것을 깨달았습니다......

  • Profile
    윤수아 2003.10.21 23:31
    ㅎㅎ 네~
    저는 제가 질문을 잘못 이해한 게 아닌가..걱정했는데 다행이네요