Q&A

  • [질문]DBF파일을 ADO 또는 BDE로 선택적으로 연결하는 간결한 소스로 정리할 수 있을까요?
DBF파일을 ADO 또는 BDE로 선택적으로 연결하는 간결한 소스로 정리할 수 있을까요?

조건
<!--CodeS-->
1. DBF파일을 사용하여야 합니다.
2. BDE설치를 싫어하기에 기본적으로 ADO를 사용하였으나 속도나 너무 나쁩니다.
3. 그래서 선택적으로 사용자에게 속도를 내기 위해 BDE설치를 원유합니다.
4. DBE설치한 사람은 TDataSource와 TDatabase, TQuery를 사용하도록하고,
    설치 안한 사람은 TADOConnection와 TADOQuery를 타도록하였습니다
5. 그런데, 소스를 간결하게 만들고 싶습니다. 일단은 아래 처럼 했지만,
    with문이나 다른 방법으로 소스를 간결하게 만들고 싶습니다

* 윈도우 비스타일경우는 DB연결(BDE접속)을 위해 프로그램 실행시 관리자권한으로 실행
* 속도 차이는 첨부한 데모는 간단하나 실제 구현한건 너무 차이가 납니다 http://cafe.naver.com/gisapplication/118
<!--CodeE-->

소스(첨부파일중에서...)
<!--CodeS-->
//------------------------------------------------------------------------------//
//bde설치여부
function BDEInstalled: Boolean;
begin
  Result := (dbiInit(nil) = 0)
end;
//------------------------------------------------------------------------------//
procedure TForm5.FormShow(Sender: TObject);
const
  CSConnStr = 'Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files;Initial Catalog=%s;MaxBufferSize=4096';
begin
  //DB폴더
  DataBaseDirectory := ExtractFilePath(Forms.Application.Name) + 'DB';
  if DirectoryExists(DataBaseDirectory) then begin
     //DB연결
     if BDEInstalled then begin
        //bde사용
        Database1.Params.Append('PATH=' + DataBaseDirectory);
        Database1.Params.Append('DEFAULT DRIVER=PARADOX');
        Database1.Params.Append('ENABLE BCD=FALSE');
     end
     else begin
        //ADO사용
        ADOConnection1.ConnectionString := format (CSConnStr, [DataBaseDirectory]);
        ADOConnection1.Open;;
     end;
  end;
end;


procedure TForm5.Btn_SearchClick(Sender: TObject);
var
  SelectStr, WhereStr, Field_Name, sDataValues : string;
  BdeUse: boolean;
  QueryEof: boolean;
begin
  if FileExists(DataBaseDirectory + '\ZIPCODE.dbf') then begin
     //공통사용 셋팅
     Memo1.Clear;
     BdeUse := BDEInstalled;//bde설치여부
     SelectStr := 'Select * from ZIPCODE ';
     WhereStr := ' where ( ( SEQ >= 100 ) and ( SEQ <= 1000 ) )';
     Field_Name := 'ZIPCODE';

     //Query
     if BdeUse then begin
        if Query_BDE.Active then Query_BDE.Close;
        Query_BDE.SQL.Clear;
        Query_BDE.SQL.Add(SelectStr + WhereStr);
        Query_BDE.Open;
        QueryEof := Query_BDE.Eof;
     end
     else begin
        if ADOQuery1.Active then ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add(SelectStr + WhereStr);
        ADOQuery1.Open;
        QueryEof := ADOQuery1.Eof;
     end;
     //데이터 읽기
     while Not QueryEof do begin //Query1.Eof 대신 boolean 변수사용
        if BdeUse then begin
            sDataValues := Query_BDE.FieldByName(Field_Name).AsString;
            Query_BDE.Next;
            QueryEof := Query_BDE.Eof;
         end
         else begin
            sDataValues := ADOQuery1.FieldByName(Field_Name).AsString;
            ADOQuery1.Next;
            QueryEof := ADOQuery1.Eof;
         end;

         Memo1.Lines.Add(sDataValues);
     end;
     //닫기
     if BdeUse then Query_BDE.Close
     else ADOQuery1.Close;
  end;
<!--CodeE-->
6  COMMENTS
  • Profile
    최용일 2010.10.12 07:52
    저같으면 디자인패턴을 적용해서 코드를 다시 작성할것 같네요.
    초기에 작성해야할 소스는 많아지지만 훨씬 간결하게 만들 수 있습니다.
  • Profile
    홍성락 2010.10.12 18:52
    답변 감사합니다.
    <!--CodeS-->
    if BdeUse then
    with Query1 do
    else
    with ADOQuery1 do;
    <!--CodeE-->
    이런식으로 기존 소스를 안건들고 손쉽게하는 방식은 없나해서요 ㅠㅠ
    제가 너무 편법만 생각하고 있는거 같네요~
  • Profile
    이정욱 2010.10.19 16:34
    여는 부분은 어쩔수 없겠지만, 데이터를 읽는 부분은 통합이 가능할것 같습니다.
    사실 여는 부분도 함수로 하나 쪼개서 만들어 놓으면 같이 쓸수 있을것 같네요.
    데이터를 읽는 부분은...

    DataSet : TDataSet; 으로 선언한 후에
    DataSet에 ADOQuery1 나 Query_BDE를 넣어버리고,
    DataSet.FieldByName 등등으로 써먹으면 됩니다.
  • Profile
    홍성락 2010.10.19 19:45
    답변 감사합니다.
    TDataSet으로 하니깐 뒷부분은 많이 단순화는 되네요.
    쿼리부분 함수만 2개로 빼고 나머진 TDataSet 인자만 넘기면, 기존 함수를 활용하면될거 같습니다.
    기존 쿼리부분만으로 된 함수 하나만 고쳐보려 했는데 욕심이 과했나봐요.
    아래는 테스트로 통으로된거 해보았는데 위 소스 보다는 단순화되었습니다.
    <!--CodeS-->
    procedure TForm5.Btn_SearchClick(Sender: TObject);
    var
    SelectStr, WhereStr, Field_Name, sDataValues : string;
    CommDataSet: TDataSet;
    begin
    if FileExists(DataBaseDirectory + '\ZIPCODE.dbf') then begin
    Memo1.Clear;
    //bde설치여부에 따른 Query
    SelectStr := 'Select * from ZIPCODE ';
    WhereStr := ' where ( ( SEQ >= 100 ) and ( SEQ <= 1000 ) )';
    Field_Name := 'ZIPCODE';
    if BDEInstalled then begin
    if Query_BDE.Active then Query_BDE.Close;
    Query_BDE.SQL.Clear;
    Query_BDE.SQL.Add(SelectStr + WhereStr);
    CommDataSet:= Query_BDE
    end
    else begin
    if ADOQuery1.Active then ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add(SelectStr + WhereStr);
    CommDataSet:= ADOQuery1;
    end;
    with CommDataSet do begin
    Open;
    //데이터 읽기
    while Not Eof do begin
    sDataValues := FieldByName(Field_Name).AsString;
    Memo1.Lines.Add(sDataValues);
    Next;
    end;
    //닫기
    Close;
    end;
    end;
    end;
    <!--CodeE-->
  • Profile
    이정욱 2010.10.21 22:02
    아... 그리고

    Query_BDE.SQL.Clear;
    Query_BDE.SQL.Add(SelectStr + WhereStr);

    이렇게 된 부분도,

    Query_BDE.SQL.Text := SelectStr + WhereStr;

    이렇게 한줄로 하시면 퍼포먼스도 올라갑니다~
  • Profile
    홍성락 2010.10.21 22:09
    예. 감사합니다
    • cdrd
      2010.10.15 23:37
      자답입니다. 위의 마우스다운 이벤트에서 이미지리스트에 있는 이미지를 리스트뷰에 다시 셋팅하는 방...
    • 김현철
    • 2010.10.14 20:44
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박정순
    • 2010.10.14 02:54
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.10.14 06:08
      뭘 질문하시는지 명확히 파악이 안되네요... 대강 유추해보면 아래 내용이 아닐까 생각되는데... htt...
    • 박정순
      2010.10.14 22:02
      답변 감사 합니다.^^ 제가 너무 편하게 하려고 욕심을 내었내요~ 최용일 님의 답글을 토대로 구글링 해...
    • 왕재식
      2010.10.13 03:23
      제가아는 허접한 방법은 마우스다운 이벤트하고 마우스업 이벤트를 이용하면 될 것 같습니다.
    • 이용벽
      2010.10.13 20:36
      아래와 같은 간단한 프로그램을 만들어서 테스트해 보세요. Form의 Mouse Down Event를 이용한 것입니다...
    • 프리랜서
      2010.12.16 09:19
      좋은 정보 감사드립니다.^^
    • 이상행
    • 2010.10.10 00:35
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
    • 2010.10.09 02:09
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.10.12 07:52
      저같으면 디자인패턴을 적용해서 코드를 다시 작성할것 같네요. 초기에 작성해야할 소스는 많아지지만 ...
    • 홍성락
      2010.10.12 18:52
      답변 감사합니다. <!--CodeS--> if BdeUse then with Query1 do else with ADOQuery1 d...
    • 이정욱
      2010.10.19 16:34
      여는 부분은 어쩔수 없겠지만, 데이터를 읽는 부분은 통합이 가능할것 같습니다. 사실 여는 부분도 함수...
    • 홍성락
      2010.10.19 19:45
      답변 감사합니다. TDataSet으로 하니깐 뒷부분은 많이 단순화는 되네요. 쿼리부분 함수만 2개로 빼고 ...
    • 이정욱
      2010.10.21 22:02
      아... 그리고 Query_BDE.SQL.Clear; Query_BDE.SQL.Add(SelectStr + WhereStr); 이렇게 된 부...
    • 홍성락
      2010.10.21 22:09
      예. 감사합니다
    • 이승규
      2010.10.11 00:05
      이상하네요~ 소스를 봐야알뜻하겠는데요~ 혹시 자료를 잘라서 입력하지 않나요? 하나씩 잘라서 입력 할...
    • 김현철
    • 2010.10.08 00:26
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 노이
    • 2010.10.06 13:03
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정대명
    • 2010.10.05 23:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이승규
      2010.10.05 23:59
      몇개 안 깔린듯 하네요~~ 차근 차근 다시 한번 깔아보세요 ^^
    • 밴댕이
    • 2010.10.05 22:47
    • 5 COMMENTS
    • /
    • 0 LIKES
    • cdrd
      2010.10.05 23:55
      프레임으로 입력/수정/삭제/조회 버튼을 만들어서 MDIChild 폼에서 동적생성해서 사용하는 방법은 어떤가요?
    • 이승규
      2010.10.05 23:56
      mdi 폼에서 만든걸 말씀하신것 같네요~ 제가 작업 한건뎅~ 참고하세요 <!--CodeS--> procedure...
    • 이승규
      2010.10.06 00:05
      위 코드 설명하자면~ 처음에 액션을 만들었습니다. 액션을 연결 시켰구요~ 메인에서 버튼을 클릭하면 ...
    • Hyphen
      2010.10.06 02:11
      Tag에 한표!
    • 박성훈
      2010.10.06 20:54
      저같은 경우는 Window Message로 처리하고 있습니다. Main Form에서 Button을 눌렀을 때 Child에 SendM...
    • 노이
    • 2010.10.05 22:23
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 노이
      2010.10.05 23:07
      아... 한번에 설치되네요 제가 파일을 잘못오픈했엇네요.. ㅠㅠ 이런.. ㅋ
    • Hyphen
      2010.10.06 00:49
      TMS꺼 대부분 상용이던데..
    • 최용일
      2010.10.05 20:21
      델파이 7과 6은 기능상 거의 차이가 없으니 컴포넌트들만 있다면 별 문제 없을듯 합니다. 델파이 7은 델...
    • 박준영
      2010.10.05 22:09
      답변 감사합니다.. 그렇군요.. 컴퍼넌트만 있으면 된다니.. 참 다행입니다.. ^^
    • 이승규
      2010.10.05 17:26
      ini 파일 맹그러서~ edit 에 입력 했던 값을 저장하고 edit 하고 ini 하고 비교해서 비슷한걸 동적으로...
    • 다이나믹
      2010.10.05 22:43
      네 답변 감사합니다.
    • 신영일
      2010.10.05 17:13
      거 웃기는 색휘들이네요. 별 거지 같은... 웹 스크립핑은 은행쪽에서 많이 사용 하고 있구요. 자체 ...
    • 서현덕
      2010.10.05 20:08
      단시간에 해보면서 배우라는 목적인것 같아요... 어떤식으로 접근해야 될지 막막하네요 ㅜㅜ; 책에...
    • 이승규
    • 2010.10.04 23:34
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박경록
      2010.10.04 21:48
      win7이 사용자 계정 컨트롤 설정을 변경 하시면 될 듯합니다. 계정 권한을 최하위로 두시면 exe파일 및 B...
    • 아폴론
      2010.10.05 19:42
      win7 64bit에선 BDE 호환되지 않는다는 많은 글 들이 있습니다. 64bit라면 BDE버리고 다른것으로 갈...
    • 따랑
      2010.10.03 09:41
      정말 해결방법이 없는것인가요? 아주 난감합니다. 처음부터 양식을 다시 그릴려하니 그렇습니다. 도움이 ...
    • 박경록
      2010.10.04 21:52
      QRShape의 Properties에 Shape 종류를 바꿔보시면 될듯합니다. 가로 qrsHorLine, 세로 qrsVertLine
    • 이승규
      2010.10.05 00:07
      QRShape 에 보시면 Pen 에서 Style 에 보시면 psInsideFrame 하시면 될꺼에요~ 저두 옛날에 그랬거덩...
    • 로즐리
    • 2010.10.02 01:27
    • 0 COMMENTS
    • /
    • 0 LIKES