TDataSet에 대한 연구

VCL의 데이터베이스 프레임워크에는 매우 중요한 추상적인 클래스인 TDataSet이 있는데, 이것은 비BDE의 데이터 원본을 처리할 수 있다.
델피의 많은 데이터베이스 감지 컨트롤러가 TDataSet을 인터페이스와 데이터베이스로 연결한 것을 감안하여 델피의 기존 자원을 중복 사용하기 위해 우리의 소형 데이터베이스를 더욱 튼튼하고 이식할 수 있도록 하기 위해 공공 인터페이스를 제시했고 인터페이스에 대한 절차를 제시했기 때문에 원래의 GPF 컨트롤러를 TDataSet이 계승하는 것으로 바꾸기로 결정했다. 
TDataSet 자체는 레코드 버퍼를 자체적으로 캡슐화했습니다.Buffers는 레코드 버퍼를 기록합니다.버퍼 카운트 레코드는 버퍼를 사용하는 개수입니다.하지만 버퍼스의 개수는 버퍼카운트보다 한 개 더 많다.이 중 하나는 TDataSet이 임시 버퍼로 사용하는 Temp 버퍼입니다.TDataSet은 이미 봉인되었지만 버퍼에 대한 모든 실현은 파생류에서 이루어져야 한다.그러나 밖에서 실현할 수 있는 모든 것은 하나의 기록 버퍼에 대한 것이다.예를 들어 버퍼 신청 공간을 기록하기 위해 공간을 방출하고 버퍼를 초기화하며 버퍼와 관련된 조작을 한다.이것들은 Delphi 5 개발자 가이드의 30장 4절'확장 TDataSet'에 이미 좋은 설명이 있다.
0
1
2
3
. . .
최후
임시로
          
그림 1: 레코드 버퍼 목록 구조
 
TDataSet은 추상 클래스이기 때문에 파생 클래스에서 모든 추상 방법을 실현해야 한다.이러한 추상적인 방법을 실현하는 것도 바로 우리의 GPF(현재 GDB로 개명)를 실현하는 것이다.바로 이러한 추상적인 방법이 DataSet과 데이터베이스 데이터의 연결을 실현했기 때문이다.가장 기본적인 것은 인터넷 오픈과 인터넷 클로즈 두 가지 방법이다.또한 Field를 사용하려면 GetFieldData,SetFieldData를 실현해야 한다.여기서 설명하고자 하는 것은 Fields에 있는 Field의 순서(즉 Fields[I]로 접근하는 순서)와 데이터베이스에 있는 필드의 순서가 다르다는 것이다.나는 이곳에서 일찍이 잘못을 저지른 적이 있다.나의 해결 방법은 Field의 속성 FieldNo를 사용하는 것이다. 이 속성은 이 필드의 물리적 위치를 기록할 수 있다.그런 다음 FieldByNumber를 사용하여 필드에 액세스합니다.스케줄러:좀 귀찮지? 나도 어쩔 수 없어.당연하지, 너도 하나의 목록으로 원시 순서대로 Fields를 기록할 수 있어. 
TDataSet의 기록 번호인 RecNo라는 속성은 현재 접근할 수 있는 것을 표시하기 때문에 기록에서 현재 접근 순서에 따라 RecNo개의 기록을 표시합니다.감지 컨트롤의 표시도 이 속성에 의존합니다.그것은 기록의 물리적 순서를 나타내는 데 쓰이는 것이 아니다.따라서 실현할 때 내부 관리 기록을 할 때 하나의 구성원 변수를 따로 사용하여 표시해야 한다. 이것은 하나의 내부 커서에 해당한다.
개발 가이드에서 언급하지 않은 몇 가지 방법이 있는데 이 몇 가지는 모두 감지 컨트롤러의 디스플레이와 관련이 있기 때문에 모두 Public 아래에 있다. 
TDataSet의 Public에 있는 이 함수를 계승해야 합니다.이 방법은 기록된 조직이 연속적으로 치밀하다는 것을 나타내는 데 쓰인다.이 기능은 데이터베이스 감지 컨트롤에서 사용됩니다.예를 들어 DBGrid의 수직 스크롤 바의 상태는 이것에 따라 결정된다.이 함수가 진짜로 되돌아오면, 기록이 치밀하다는 뜻이다. 스크롤 바는 RecNo에 따라 구체적인 위치를 결정한다.반대로 가짜라면 스크롤 막대는 맨 위, 중간, 맨 아래 세 가지 상태만 있다. 
CompareBookmark 함수는 두 기록의 크기를 판단하는 데 사용됩니다.마찬가지로 이 함수도 감지 컨트롤러와 관련이 있다.DBGrid에서MultiSelect를 선택한 후, 기록을 선택하면, Grid는 이 함수의 반환 값에 따라 인접한 기록을 선택할지 여부를 결정합니다.사실 한마디로 Grid는 이 상태에서 모든 동일한 기록을 선택한다.
GetCanModify는 특성CanModify를 실현하는 함수도 있습니다.DataSet을 제어할 수 있는 ReadOnly를 덮어씁니다. 
세 번째 단락에서 내가 말한 Temp Buffer에 대해 나는 몇 마디를 보충하고 싶다.TempBuffer라는 버퍼는 다른 버퍼와 같은 특성과 조작을 가지고 있으며, 당신에게 '생존 기간 자체 관리' 이기 때문에 매우 큰 역할을 한다.이 점은 당신이 조회 조작을 실현할 때 매우 유용하다는 것을 발견할 수 있을 것이다.너는 이미 두 개의 기록을 비교하는 함수가 있을 것이다. 그러나 조회할 때, 너는 단지 하나의 기록과 조회 조건만 사용할 수 있다.이것은 당신의 검색 조건을 기록으로 바꿀 수 있으며, 이 기록은Temp Buffer에 넣을 수 있습니다.이렇게 하면 너의 실현은 매우 통일될 것이다. 왜냐하면 네가 한 것은 단지 두 가지 기록의 비교이기 때문이다.
TDataSet은 책갈피 기능(Bookmark)을 추가로 봉인했다.일반적으로 북마크는 멤버 변수가 두 개만 있으면 된다.하나는 Data(TBookmark 유형), 하나는 Flag(TBookmark Flag)이다.
Data는 사용자가 이 기록에 접근할 수 있는 값을 기록하는 데 사용됩니다.Pointer 유형의 변수입니다.따라서 당신은 그것을 정수로 사용할 수도 있고 (예를 들어 기록 번호를 저장하는 데 내가 이렇게 사용한다) 기록의 바늘을 가리키거나 심지어는 기록을 가리킬 수도 있다.Flag은 현재 탭의 위치를 기록하는 데 사용됩니다.Delphi에서 TbookmarkFlag는 이렇게 정의된다. TBookmarkFlag = (bfCurrent, bfBOF, bfEOF, bfInserted).여기서 bfCurrent는 현재 위치, 즉 유효한 Data를 나타냅니다.BfBOF 및 bfEOF는 처음과 끝의 위치를 나타냅니다.BfInserted는 커밋되지 않은 레코드를 방금 삽입했음을 나타냅니다.
 
북마크에 필요한 멤버 변수와 그 의미를 이해했다.TDataSet에서 Delphi가 Bookmark를 어떻게 사용하는지 살펴보겠습니다.설명하기 편리하도록 제가 먼저 GDB를 구현할 때 사용한 북마크를 소개하겠습니다.
 
다음은 구조입니다.

  
  
  
  
  1. PGDBBookmarkInfo = ^TGDBBookmarkInfo;   
  2.  
  3.     TGDBBookmarkInfo = record  
  4.  
  5.        BookmarkData: Integer;  
  6.  
  7.        BookmarkFlag: TbookmarkFlag;  
  8.  
  9.     End

일단 해결해야 할 것은 북마크를 어디에 두느냐다.이것은 사실 대외적으로도 볼 수 없는 것이다.위에서 기록 버퍼에 대해 말했는데 사실 북마크는 기록 버퍼에 연결된 것이다.또는 더 쉽게 말하면 전체 버퍼는 기록과 북마크(TGDBBookmarkInfo 구조)로 구성된다. 
레코드 버퍼
책갈피(TGDBookmarkInfo)
그림 2: 레코드 버퍼 구조
버퍼에 대한 조작은 TDataSet의 파생 클래스에서 이루어진다.몇 가지 추상적인 방법인 SetBookmark Flag, SetBookmark Data, GetBookmark Flag가 있다.이 몇 가지 방법은 버퍼 구역에 직접 조작하는 것이다.
TDataSet은 이러한 방법을 사용하여 Bookmark를 조작합니다.그러나 일반 부크마크 설치는 상속류에서 이뤄진다.실현된 위치는 사실 상상할 수 있는 것이다.북마크는 기록 버퍼와 함께 있기 때문에 기록 버퍼를 조작할 때 (버퍼로 읽을 때), 즉 GetRecord 함수에서 이 기록과 연결된 북마크를 쓸 수 있습니다.위에서 논의한 바와 같이, 당신은 반드시 Bookmark Data에 상응하는 값을 기입해야 합니다.만약 내가 여기에 있다면 기록 번호를 기입할 수 있다.나중에 레코드 번호로 레코드에 액세스할 수 있습니다.   
Internal GotoBookmark은 Bookmark Data를 이용하여 기록을 포지셔닝하는 것이다.InternalSetToRecord 도 이와 유사합니다. 
또 다른 데이터 감지 컨트롤러가 빈번하게 사용하는 것은 CompareBookmarks다.그것의 두 파라미터는 TBookmark 유형이다.너는 이 지침에 근거하여 네가 저장한 데이터에 접근한다.나의 실현과 같이 Integer(Bookmark1^)를 사용할 수 있다.또한 GetRecNo는ActiveBuffer(현재 활동을 기록하는 버퍼)에 대한 접근을 통해 얻을 수 있습니다.

좋은 웹페이지 즐겨찾기