Delphi는 사용하기 쉬운 데이터 액세스 및 데이터 인식 컨트롤이 많기 때문에 C/S 응용 프로그램을 개발하기에 편리하고 빠릅니다. 그러나 모든 것이 완전하기가 어렵습니다. Delphi의 DBEDIT 제어는 날짜와 시간 분야를 입력하기 위해 매우 불편합니다. 위젯을 만들 때 가장 중요한 단계는 올바른 상위 클래스를 선택하여 코드 작성을 줄일 수 있습니다. Delphi의 구성 요소 라이브러리에는 이미 TdateTimePicker 구성 요소가 있으며,이 구성 요소는 캘린더를 당기거나 SpinButton 증가 및 감소를 사용하여 날짜와 시간을 쉽게 입력하고 변경할 수 있지만 데이터를 감지하는 기능은 없습니다. 따라서, 우리는 그것을 부모 클래스로 받아들이고 새로운 컨트롤과 데이터 세트와 통신 할 수있는 데이터 인식 기능을 도출 할 수 있습니다. 데이터 인식 제어는 Datalink 객체를 통해 DataSource와 상호 작용하므로 컨트롤에 데이터 인식을 추가하려면 컨트롤의 구성원으로서 tdatalink (또는 파생 클래스) 객체를 생성하고 컨트롤을위한 공개 데이터 필드 및 데이터 소스 속성을 생성해야합니다 TDATALINK 객체 ONDATACHANGE 및 ONUPDATEDATA 이벤트에. 다음은 제어의 주요 소스 코드이며 해당 주석과 함께 다음과 같습니다. DB는 장치 인터페이스, DBCTRLS 참조} 유형에 추가해야합니다.
tdbdatetime = class (tdatetimepicker)
사적인
fdatalink : tfielddatalink;
// tfielddatalink는 단일 필드와 데이터 소스의 상호 작용을 처리하는 파생 된 클래스의 tdatalink입니다.
ProcessEdataChange (Sender : Tobject);
// 데이터 세트의 레코드 (예 : 브라우징 기록)가 변경 될 때 OnDatachange 이벤트가 트리거되면 Datachange는 이벤트의 이벤트 처리 핸들로 사용됩니다.
ProcedureUpdatedata (sender : tobject);
// OnupDatedAta 이벤트가 데이터 세트를 업데이트하기 전에 트리거되며, 업데이트는 이벤트의 이벤트 처리 핸들로 사용됩니다.
FunctionGetDatasource : Tdatasource;
ProcessETDATASORCE (value : tdatasource);
functiongetDatafield : 문자열;
ProcessEtDataField (값 : 문자열);
ProcessEcMexit (varmessage : tcmexit); 메시지 cm_exit; // 컨트롤이 초점을 잃으면 cm_exit 메시지를 플래시합니다
보호
ProcedureChange; 재정의; // onchange 이벤트는 제어 변경의 날짜와 시간이 트리거됩니다.
절차 대상 (Acomponent : tcomponent;
작동 : 지형); 재정의;
// Delphi의 IDE는이 메소드를 호출하여 양식에서 컨트롤이 제거 될 때 다른 컨트롤에 알립니다.
공공의
ConstructorCreate (Aowner : tcomponent); 재정의;
Destructordestroy; 재정의;
LONID
PropertyDatasource : TdatasourcereadgetDatasource
writesetdatasource; // 데이터 소스 구성 요소에 연결할 수 있도록 컨트롤에 데이터 소스 속성 추가
PropertyDataField : StringReadGetDataField
WritesEtDataField;
끝; // 컨트롤에 데이터 필드 속성 추가,
필드를 나타내는 tfield 객체를 가리 킵니다.
Procedureergister; // 등록 구성 요소
구현
ProcedUreTdBdateTime.cmexit;
시작하다
노력하다
fdatalink.updaterecord;
// 컨트롤이 초점을 잃으면 데이터 세트를 업데이트하여 OnupDatedATA 이벤트를 트리거합니다.
제외하고
세트 포커스;
들어올리다;
끝;
doexit;
끝;
constructortdbdateTime.create (aowner : tcomponent);
시작하다
상속 된 크리징 (AOWNER);
// Datalink 객체 생성, Mount OnDatachange,
onupdatedata 이벤트 처리 핸들
fdatalink : = tfielddatalink.create;
fdatalink.ondatachange : = datachange;
fdatalink.onupdatedata : = updatedata;
끝;
DestructortdbdateTime.destroy;
시작하다
fdatalink.ondatachange : = nil;
fdatalink.onupdatedata : = nil;
fdatalink.free;
상속 대상;
끝;
functiontdbdateTime.getDatasource : tdatasource;
시작하다
결과 : = fdatalink.datasource;
끝;
ProcedUreTdBdateTime.SetDatasource (값 : Tdatasource);
시작하다
fdatalink.datasource : = value;
끝;
functiontdbdateTime.getDataField : String;
시작하다
결과 : = fdatalink.fieldName;
끝;
ProcessEtdBdateTime.SetDataField (값 : 문자열);
시작하다
fdatalink.fieldName : = value;
끝;
ProcessEtdBdateTime.Datachange (Sender : Tobject);
시작하다
DateTime : = 지금;
// 컨트롤이 활성 데이터 세트에 연결되면 데이터 세트가 변경됩니다.
컨트롤은 현재 레코드의 해당 필드 값을 표시합니다.
iffdatalink.field nilthen
iffdatalink.field.text 그러면
DateTime : = fdatalink.field.asdateMe;
끝;
ProcedUreTdBdateTime.updatedata (sender : tobject);
시작하다
fdatalink.field.asdateTime : = dateTime;
// 컨트롤의 날짜와 시간으로 해당 필드를 업데이트합니다.
끝;
ProcedUreTdBdateTime.Change;
시작하다
// 사용자가 컨트롤의 컨텐츠를 변경할 때 상태를 편집하도록 데이터 세트를 설정합니다.
fdatalink. 모형;
ifnotfdatalink.editingthen
fdatalink.edit;
상속 체인지;
끝;
ProcessEtDBDATETIME.Notification (Acomponent :
tcomponent; 작동 : 지형);
시작하다
유전 화 (Acomponent, Operation);
// 컨트롤에 연결된 Tdatasource가있을 때
삭제 될 때 컨트롤의 데이터 소스 속성을 비워 지도록 설정하십시오
if (Operation = OpreMove) 및 (FDATALINK NIL)
그리고 (acomponent = dataSource)
DataSource : = nil;
끝;
절차 보충제;
시작하다
RegisterComponents (Datacontrols,
[TDBDATETIME]); // 컨트롤이 등록 된 후 Datacontrols 페이지에 설치됩니다.
끝;
끝.
설치 후이 컨트롤은 캘린더를 끌어 내고 데이터베이스의 날짜 및 시간 필드를 늘리거나 감소시킬 수 있으며 편리하고 실용적인 두 형식으로 날짜를 표시 할 수 있습니다. 컨트롤은 Delphi3 및 Delphi4에서 안전하고 신뢰할 수 있습니다.