발달 습관에 대한 어떤 생각은 목에 걸려 뱉어낼 수 없는 것처럼 느껴집니다. 포스팅 동기를 보면 물론 참여 포인트를 사취할 가능성도 배제할 수는 없지만, 한편으로는 동수들(Nian Xing)에게 몇 가지 제안이나 참고가 되기를 바라기도 합니다(오해가 되지 않기를 바라겠습니다) 기타). 동시에 나의 이러한 나쁜 습관에 대해 여러분의 의견을 표현하고 비판과 교정을 제공할 수 있기를 바랍니다. 감사해요.
하나. 프로젝트 디렉토리 생성
우선, 첫 번째 단계는 물론 새 프로젝트를 위한 별도의 디렉터리를 만드는 것입니다(웃지 마세요). 디렉터리 이름은 프로젝트 이름과 동일해야 하며, 명확하고 간결하다면 다른 이름을 사용해도 됩니다. 그런 다음 이 디렉터리 내에 다음 디렉터리를 각각 만듭니다.
<Doc>: 프로젝트와 관련된 개발 문서(요구사항 설명, 개요 설계, 세부 설계 등)를 저장하는 데 사용됩니다.
<Source>: 델파이 소스 프로그램에 ".DPR", ".Pas", ".Dfm" 및 기타 파일을 저장하는 데 사용됩니다.
<Dcu>: ".Dcu" 파일은 이 디렉터리에 저장됩니다. ".Pas" 및 ".Dcu" 파일을 별도로 저장하는 목적은 소스 디렉터리의 내용을 더 명확하게 만드는 것입니다.
<Bin>: ".Exe", ".Dll" 또는 ".Ocx" 등과 같은 프로젝트의 출력 파일을 저장합니다.
<Log>: 로그 파일을 저장하는 데 사용됩니다. 일반적으로 이 디렉터리에 "<Project Name>Programmer Log.Txt" 파일을 넣습니다.
<Images> : 물론, 프로젝트에 사용된 이미지가 저장되는 디렉터리입니다. 일반적인 상황에서는 이 디렉토리가 반드시 필요합니다. 다른 리소스도 사용하는 경우 Wav, Avi 등과 같은 자체 디렉터리도 만듭니다.
둘. 프로젝트 옵션 설정
Delphi에서 새 프로젝트를 생성하고 이 프로젝트를 소스 디렉터리에 저장하는 동시에 다음을 수행합니다.
a. 눈길을 끌고 프로젝트와 어느 정도 관련성이 있는 아이콘을 이 프로젝트의 아이콘으로 선택하세요. 물론 이 아이콘은 일시적으로만 사용될 수 있지만 델파이가 기본으로 사용하는 추악한 아이콘보다 낫습니다. 그렇지 않으면 어떻게 자신의 가치를 가질 수 있습니까?
b. 프로젝트 옵션 -> 디렉터리/조건 페이지에서 출력 디렉터리를 Bin 디렉터리로 설정합니다.
c. 장치 출력 디렉터리를 Dcu 디렉터리로 설정합니다.
삼. 상수 단위 추가
프로젝트에 사용되는 상수를 저장하기 위해 새로운 Unit을 추가하고 "unt<project name> Consts.Pas"로 저장합니다.
4. 형태와 단위에 대하여
로그인에 사용되는 양식의 이름은 'FrmLogin', 단위 이름은 'untLogin'으로 지정할 수 있습니다. 일반적으로 해당하는 두 개의 Form과 Unit의 명칭은 'Frm'이나 'unt'의 약어를 제외하고는 일관되어야 한다.
유닛 헤드에 이 유닛에 대한 주석을 추가하세요. 주석 형식은 Delphi 소스 코드를 참조할 수 있지만 최소한 다음 항목을 포함해야 합니다. 수정 내역 등
Delphi의 기본 이름을 사용하는 대신 새로 생성된 양식의 캡션을 양식 클래스의 이름으로 설정합니다. 예를 들어 Form1의 이름을 FrmLogin으로 바꾼 후 새로운 양식 클래스 TFrmLogin을 얻으면 Delphi는 자동으로 양식의 캡션을 'FrmLogin'으로 업데이트합니다. 제 생각에는 캡션은 'TFrmLogin'이어야 합니다. 왜냐하면 우리는 단지 FrmLogin에서 작동하는 것이 아니라 TFrmLogin 양식 클래스를 설계하고 있기 때문입니다.
TFrmLogin과 같은 명확한 기능을 갖춘 양식 클래스의 경우 많은 사람들이 디자인 단계에서 캡션을 "운영자 로그인"과 같은 이름으로 설정하는 습관을 가지고 있습니다. 내 습관은 "운영자 로그인"과 같은 상수가 일반적으로 unt<project name>Consts.Pas에 저장되고 ResourceString 또는 Const로 정의된다는 것입니다. 양식 캡션의 이름 지정은 런타임 작업이어야 합니다. 따라서 다음과 같이 TForm.OnCreate 이벤트가 트리거될 때만 Caption을 작동하는 경우가 많습니다.
절차 TFrmLogin.FormCreate(Sender: TObject);
시작하다
캡션 := csLoginTitle;
....
끝;
다섯. 포맷 기능 사용에 대해
iYear, iMonth, iDay의 세 가지 데이터가 있습니다. "생일: 1976년 3월 18일"과 같은 정보를 표시하려면 보통 무엇을 하시나요? s := 'Birthday:'+IntToStr(iYear)+'.'+IntToStr(iMonth)+'.'+IntToStr(iDay);?를 사용하세요. 정말 피곤해요. 내 습관은 unt<project name>Consts.Pas에 상수 csBirthDayFormat = 'Birthday: %d/%d/%d'를 추가하여 표시 형식을 저장한 다음 s := Format(csBirthDayFormat, [iYear, iMonth)를 사용하는 것입니다. , iDay]) 이러한 진술은 데이터 조립을 완료합니다. 이렇게 하면 장점은 분명합니다. 즉, 한 곳에서 데이터의 표시 형식만 유지하면 된다는 것입니다.
포맷 기능은 강력하고 강력히 추천합니다.
육. 레지스트리 또는 Ini 파일 저장 정보
원래 저는 주로 TRegistry를 사용하여 레지스트리에 액세스하고 TIniFile을 사용하여 Ini 파일에 액세스했습니다. 이 두 클래스의 사용법이 다르기 때문에 동일한 코드를 사용하여 레지스트리와 Ini 파일에 모두 액세스하는 것은 거의 불가능합니다. 정말 머리가 아프네요!
마침내 구세주를 찾았습니다. 바로 TRegistryIniFile 클래스입니다. 레지스트리 유닛을 살펴보면 TRegistryIniFile이 TCusomIniFile에서 상속된다는 것을 알 수 있습니다. TIniFile은 TCusomIniFile에서도 상속됩니다. 따라서 추상 클래스 TCusomIniFile을 사용하여 레지스트리 또는 Ini 파일에 액세스하는 것은 일석이조입니다. 예를 들어:
var
csmIni파일:TCusomIni파일;
시작하다
if blUseIniFile then//Ini 파일을 사용하는 경우
csmIniFile:= TIniFile.Create(csRootKey)
또 다른
csmIniFile:= TRegistryIniFile.Create(csRootKey);
//그런 다음 csmIniFile을 사용하여 Ini 파일에 액세스할 수 있습니다.
//또는 Ini 파일에 액세스하는 것과 비슷한 방법으로 레지스트리에 액세스합니다.
일곱. TStream 스트림 및 TFileStream, TMemoryStream 등에 대한 정보
TFileStream과 TMemoryStream은 모두 추상 클래스 TStream에서 상속됩니다. 이는 코드 세트를 사용하여 파일 및 메모리에 대한 액세스 작업을 완료할 수 있음을 의미합니다. 따라서 일부 인터페이스를 정의할 때 매개변수의 유형을 구체적인 클래스가 아닌 추상 클래스로 정의하는 경향이 있습니다. 예를 들어, 저장 기능을 완료하는 함수는 다음과 같이 정의됩니다.
function Save(AStream: TStream): 부울;
다음과 같이 정의된 것보다
function Save(AStream: TFileStream): 부울;
훨씬 더 유연해집니다.
전자의 정의는 미래에 나타날 수 있는 새로운 유형의 흐름에 적용될 수 있기 때문에 미래 지향적입니다. 후자의 정의는 훨씬 더 엄격한 TFileStream(물론 TFileStream의 하위 클래스 포함)과 같은 스트림에만 적용됩니다.
내 습관: 추상 클래스가 있으면 매개변수를 추상 클래스의 유형으로 정의하려고 노력하세요. 결국 우리는 미래를 예측할 수 없습니다.
여덟. TAction을 더 많이 사용해보세요
Delphi 4 이상에서는 Action 개념을 도입하고 Standard 컴포넌트 막대에 TActionList 컴포넌트를 추가했습니다. Action을 사용하면 제어 상태 동기화에 대한 걱정이 사라진다는 장점이 있습니다!
더 많은 기사
Musicwind®@HangZhou.Zj.China