델파이의 컴포넌트 읽기 및 쓰기 메커니즘(1)
1. 스트리밍 객체(Stream)와 읽기-쓰기 객체(Filer) 소개
객체 지향 프로그래밍에서는 객체 기반 데이터 관리가 중요한 역할을 합니다. Delphi에서는 객체 기반 데이터 관리 지원이 주요 기능입니다.
Delphi는 객체지향 시각적 디자인과 객체지향 언어를 결합한 통합 개발 환경입니다. 델파이의 핵심은 컴포넌트입니다. 구성 요소는 개체 유형입니다. Delphi 애플리케이션은 전적으로 구성 요소로 구성되므로 고성능 Delphi 애플리케이션을 개발하려면 필연적으로 객체 기반 데이터 관리 기술이 필요합니다.
객체 데이터 관리에는 다음 두 가지 측면이 포함됩니다.
● 개체를 사용하여 데이터 관리
● 다양한 데이터 객체(객체, 구성요소 포함) 관리
Delphi는 객체 기반 데이터 관리 클래스를 스트림 객체(Stream)와 파일러 객체(Filer)로 요약하고 이를 VCL(Visual Component Class Library)의 모든 측면에 적용합니다. 메모리, 외부 저장소 및 Windows 리소스의 개체를 관리하기 위한 풍부한 기능을 제공합니다.
스트리밍 객체라고도 하는 스트림 객체는 TStream, THandleStream, TFileStream, TMemoryStream, TResourceStream 및 TBlobStream의 총칭입니다. 이들은 각각 다양한 미디어에 데이터를 저장하는 기능을 나타내며, 메모리, 외부 메모리 및 데이터베이스 필드에 있는 다양한 데이터 유형(객체 및 구성 요소 포함)의 관리 작업을 객체 방식으로 추상화하고 객체 지향 기술을 최대한 활용합니다. 장점은 응용 프로그램이 다양한 Stream 개체의 데이터를 매우 쉽게 복사할 수 있다는 것입니다.
읽기-쓰기 개체(Filer)에는 TFiler 개체, TReader 개체 및 TWriter 개체가 포함됩니다. TFiler 객체는 파일 읽기 및 쓰기를 위한 기본 객체입니다. TReader와 TWriter는 주로 응용 프로그램에서 사용됩니다. TReader 및 TWriter 객체는 모두 TFiler 객체에서 직접 상속됩니다. TFiler 객체는 Filer 객체의 기본 속성과 메서드를 정의합니다.
Filer 개체는 주로 두 가지 주요 기능을 완료합니다.
● 양식 파일 및 양식 파일의 구성요소에 액세스
●데이터 버퍼링을 제공하여 데이터 읽기 및 쓰기 작업 속도를 높입니다.
스트리밍 개체와 읽기-쓰기 개체에 대한 지각적 이해를 돕기 위해 먼저 예를 살펴보겠습니다.
a) 파일 쓰기
PROcedure TFomr1.WriteData(보내는 사람: TObject) r;
바르
FileStream:TFilestream;
마이라이터:TWriter;
i: 정수
시작하다
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//파일 스트림 객체 생성
Mywriter:=TWriter.create(FileStream,1024); //Mywriter를 FileStream과 연결
Mywriter.writelistbegin; //쓰기 목록 시작 플래그
i:=0에서 Memo1.lines.count-1까지 수행
Mywriter.writestring(memo1.lines[i]); //메모 컴포넌트의 텍스트 정보를 파일에 저장합니다.
Mywriter.writelistend; //목록 끝 표시 쓰기
FileStream.seek(0,sofrombeginning); //파일 스트림 객체 포인터가 스트림의 시작 부분으로 이동합니다.
Mywriter.free; //Mywriter 객체를 해제합니다.
FileStream.free; //FileStream 객체를 해제합니다.
끝;
b) 파일 읽기
절차 TForm1.ReadData(Sender: TObject);
바르
FileStream:TFilestream;
Myreader:TReader;
시작하다
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //Myreader를 FileStream과 연결
Myreader.readlistbegin; //작성된 목록 시작 표시를 읽습니다.
Memo1.lines.clear; //Memo1 구성 요소의 텍스트 내용을 지웁니다.
myreader.endoflist는 아니지만 //TReader의 메소드에 주의하세요: endoflist
시작하다
Memo1.lines.add(myreader.readstring); //읽은 문자열을 Memo1 구성 요소에 추가합니다.
끝;
Myreader.readlistend; //작성된 목록 끝 표시를 읽습니다.
Myreader.free; //Myreader 객체를 해제합니다.
FileStream.free; //FileStream 객체를 해제합니다.
끝;
위의 두 가지 프로세스 중 하나는 쓰기 프로세스이고 다른 하나는 읽기 프로세스입니다. 쓰기 과정은 TWriter를 거쳐 TFilestream을 이용하여 메모에 있는 내용(텍스트 정보)을 바이너리 파일로 디스크에 저장합니다. 읽기 과정은 쓰기 과정의 반대입니다. TReader를 통해 TFilestream을 사용하여 바이너리 파일의 내용을 텍스트 정보로 변환하고 메모에 표시합니다. 프로그램을 실행해보면, 쓰기 과정에서 저장한 정보가 읽기 과정에서 충실히 복원되는 것을 확인할 수 있습니다.
다음 다이어그램에서는 데이터 개체(개체 및 구성 요소 포함), 스트리밍 개체, 읽기 및 쓰기 개체 간의 관계를 설명합니다.
그림(1)
TFiler 객체, TReader 객체 및 TWriter 객체와 같은 읽기-쓰기 객체는 애플리케이션 작성자가 직접 호출하는 경우가 거의 없으며 일반적으로 구성 요소의 상태를 읽고 쓰는 데 사용됩니다. 읽기에서 매우 중요한 역할을 합니다. -구성 요소 메커니즘을 작성하는 것이 중요합니다.
스트리밍 개체 Stream의 경우 많은 참조 자료에 매우 자세한 소개가 있는 반면, TFiler 개체, TReader 개체 및 TWriter 개체, 특히 구성 요소 읽기 및 쓰기 메커니즘에 대한 참조 자료는 VCL 원본 코드를 분석합니다. 그리고 쓰기 메커니즘.
2. 객체 읽기 및 쓰기(파일러) 및 구성 요소 읽기 및 쓰기 메커니즘
Filer 객체는 주로 델파이 폼 파일과 폼 파일 내의 컴포넌트에 접근하기 위해 사용되므로 Filer 객체를 명확하게 이해하려면 델파이 폼 파일(DFM 파일)의 구조를 알아야 합니다.
DFM 파일은 Delphi 저장 양식에 사용됩니다. Form은 Delphi 시각적 프로그래밍의 핵심입니다. 폼은 델파이 애플리케이션의 창에 해당하고, 폼의 시각적 구성 요소는 창의 인터페이스 요소에 해당하며, TTimer 및 TOpenDialog와 같은 비시각적 구성 요소는 델파이 애플리케이션의 특정 기능에 해당합니다. Delphi 애플리케이션의 디자인은 실제로 폼 디자인에 중점을 두고 있습니다. 따라서 DFM 파일은 Delphi 애플리케이션 디자인에서도 매우 중요한 위치를 차지합니다. 양식 자체의 속성을 포함하여 양식의 모든 요소가 DFM 파일에 포함됩니다.
Delphi 애플리케이션 창에서는 인터페이스 요소가 소유권 관계에 따라 서로 관련되어 있으므로 트리 구조가 가장 자연스러운 표현 형태입니다. 따라서 양식의 구성 요소도 트리 구조에 따라 구성됩니다. DFM 파일에도 이 관계를 표현합니다. DFM 파일은 물리적으로 텍스트 형식으로 저장되며(Delphi2.0 버전 이전에는 바이너리 파일로 저장됨), 논리적으로는 컴포넌트 간의 관계가 트리 구조로 정리되어 있습니다. 이 텍스트에서 양식의 트리 구조를 명확하게 볼 수 있습니다. 다음은 DFM 파일의 내용입니다.
개체 Form1: TForm1
왼쪽 = 197
최고 = 124
…
PixelsPerInch = 96
텍스트 높이 = 13
객체 Button1: TButton
왼쪽 = 272
…
캡션 = 'Button1'
탭순서 = 0
끝
개체 Panel1: TPanel
왼쪽 = 120
…
캡션 = 'Panel1'
탭순서 = 1
개체 CheckBox1: TCheckBox
왼쪽 = 104
…
캡션 = 'CheckBox1'
탭순서 = 0
끝
끝
끝
이 DFM 파일은 스트리밍 객체 Stream을 통해 TWriter에 의해 생성됩니다. 물론 바이너리 파일에서 텍스트 정보 파일로의 변환 프로세스도 이 문서의 대상이 아니므로 이러한 프로세스는 무시됩니다.
프로그램이 실행되기 시작하면 TReader는 스트리밍 개체 Stream을 통해 양식과 구성 요소를 읽습니다. 왜냐하면 Delphi가 프로그램을 컴파일할 때 컴파일 명령 {$R *.dfm}을 사용하여 DFM 파일 정보를 실행 파일로 컴파일했기 때문입니다. TReader가 읽는 것은 실제로 실행 파일로 컴파일되는 양식 및 구성 요소에 대한 정보입니다.
TReader 및 TWriter는 오브젝트 파스칼의 대부분의 표준 데이터 유형을 읽고 쓸 수 있을 뿐만 아니라 List 및 Variant와 같은 고급 유형을 읽고 쓸 수 있으며 속성 및 구성 요소도 읽고 쓸 수 있습니다. 그러나 TReader와 TWriter 자체는 실제로 매우 제한된 기능을 제공하며 대부분의 실제 작업은 매우 강력한 클래스 TStream에 의해 수행됩니다. 즉, TReader와 TWriter는 실제로 구성 요소 읽기 및 쓰기 작업만 담당하는 도구일 뿐입니다.
TFiler는 TReader와 TWriter의 공통 조상 클래스이므로 TReader와 TWriter를 이해하려면 먼저 TFiler부터 시작해야 합니다.