Alguns pensamentos sobre hábitos de desenvolvimento parecem estar presos na sua garganta e você não será capaz de cuspi-los. Olhando para a motivação da postagem, é claro que não descarto a possibilidade de fraudar pontos de participação, mas por outro lado, também espero fornecer algumas sugestões ou referências para colegas praticantes (Nian Xing) (espero não estar enganando outros). Ao mesmo tempo, espero também que vocês possam expressar suas opiniões sobre esses meus maus hábitos e fazer críticas e correções. Obrigado.
um. Criar diretório do projeto
Em primeiro lugar, o primeiro passo é, claro, criar um diretório separado para o novo projeto (não ria). O nome do diretório deve ter o mesmo nome do projeto, ou outro nome poderá ser utilizado, desde que seja claro e conciso. Em seguida, crie cada um dos seguintes diretórios dentro deste diretório:
<Doc>: utilizado para armazenar documentos de desenvolvimento relacionados ao projeto (descrição de requisitos, esboço, desenho detalhado, etc.);
<Fonte>: utilizado para armazenar ".DPR", ".Pas", ".Dfm" e outros arquivos no programa fonte Delphi;
<Dcu>: Os arquivos ".Dcu" são armazenados neste diretório. O objetivo de armazenar os arquivos ".Pas" e ".Dcu" separadamente é apenas tornar o conteúdo do diretório Fonte mais claro;
<Bin>: Armazena os arquivos de saída do projeto, como ".Exe", ".Dll" ou ".Ocx", etc.;
<Log>: usado para armazenar arquivos de log; normalmente colocarei um arquivo "<Nome do Projeto>Programmer Log.Txt" neste diretório.
<Imagens>: Claro, é o diretório onde as imagens utilizadas no projeto são armazenadas. Em circunstâncias normais, este diretório é indispensável. Se outros recursos também forem usados, crie também seus próprios diretórios, como Wav, Avi, etc.
dois. Definir opções de projeto
Crie um novo projeto em Delphi, salve este projeto no diretório Source e ao mesmo tempo:
a. Escolha um ícone que seja atraente e de alguma forma relacionado ao projeto como ícone para este projeto. Claro, este ícone só pode ser usado temporariamente, mas deve ser melhor do que aquele feio que o Delphi usa como padrão. Caso contrário, como você pode ser digno de si mesmo?
b. Defina o diretório de saída na página Opções do projeto -> Diretórios/Condicionais para o diretório Bin;
c. Defina o diretório de saída da unidade para o diretório Dcu.
três. Adicionar unidade constante
Adicione uma nova Unit e salve-a como "unt<nome do projeto> Consts.Pas" para salvar as constantes utilizadas no projeto.
Quatro. Sobre Formulário e Unidade
Nomeie o formulário de acordo com a convenção de nomenclatura húngara. Um formulário usado para efetuar login pode ser denominado 'FrmLogin' e seu nome de unidade pode ser 'untLogin'. Em geral, os nomes de duas Formas e Unidades correspondentes devem ser consistentes, exceto pela abreviatura de 'Frm' ou 'unt'.
Adicione um comentário para esta unidade no cabeçalho da Unidade. O formato do comentário pode referir-se ao código-fonte do Delphi, mas deve incluir pelo menos os seguintes itens: autor da descrição da função; histórico de modificação, etc.
Defina a legenda do formulário recém-criado com o nome da classe Form em vez de usar o nome padrão do Delphi. Por exemplo, após renomear Form1 para FrmLogin, obtemos a nova classe de formulário TFrmLogin, e o Delphi atualiza automaticamente a legenda do formulário para 'FrmLogin'. Na minha opinião, a legenda deveria ser 'TFrmLogin', porque estamos projetando uma classe de formulário TFrmLogin, em vez de apenas operar em FrmLogin.
Para uma classe de formulário com funções claras como TFrmLogin, muitas pessoas têm o hábito de definir sua legenda com um nome como "Login do Operador" durante a fase de design. Meu hábito é que constantes como "login do operador" geralmente sejam armazenadas em unt<project name>Consts.Pas e definidas com ResourceString ou Const. Quanto à nomeação da legenda do formulário, deve ser uma tarefa em tempo de execução. Portanto, muitas vezes opero Caption apenas quando o evento TForm.OnCreate é acionado, como:
procedimento TFrmLogin.FormCreate(Remetente: TObject);
começar
Legenda := csLoginTitle;
....
fim;
cinco. Sobre o uso da função Formatar
Existem três dados: iYear, iMonth e iDay Para exibir informações como "Aniversário: 18/03/1976", o que você costuma fazer? Use s := 'Aniversário:'+IntToStr(iYear)+'.'+IntToStr(iMonth)+'.'+IntToStr(iDay);? Isso é realmente cansativo. Meu hábito é adicionar uma constante csBirthDayFormat = 'Birthday: %d/%d/%d' em unt<project name>Consts.Pas para salvar o formato de exibição e, em seguida, usar s := Format(csBirthDayFormat, [iYear, iMonth , iDay]); Tais declarações completam a montagem dos dados. A vantagem de fazer isso é óbvia, ou seja, basta manter o formato de exibição dos dados em um só lugar.
A função Formatar é poderosa e eu recomendo fortemente.
seis. Sobre o armazenamento de registros ou arquivos Ini
Originalmente, eu normalmente usava TRegistry para acessar o registro e TIniFile para acessar arquivos Ini. O uso dessas duas classes é diferente, por isso é quase impossível usar o mesmo código para acessar o registro e o arquivo Ini. Que dor de cabeça!
Finalmente encontrei um salvador! É a classe TRegistryIniFile. Olhando para a unidade Registro, descobrimos que TRegistryIniFile herda de TCusomIniFile. TIniFile também herda de TCusomIniFile. Portanto, usar a classe abstrata TCusomIniFile para obter acesso ao registro ou arquivo Ini é matar dois coelhos com uma cajadada só. por exemplo:
var
csmIniFile:TCusomIniFile;
começar
se blUseIniFile então // Se estiver usando arquivo Ini
csmIniFile:= TIniFile.Create(csRootKey)
outro
csmIniFile:= TRegistryIniFile.Create(csRootKey);
//Então você pode usar csmIniFile para acessar o arquivo Ini.
//Ou acesse o registro de forma semelhante ao acesso ao arquivo Ini.
Sete. Sobre fluxos TStream e TFileStream, TMemoryStream, etc.
Tanto TFileStream quanto TMemoryStream herdam da classe abstrata TStream, o que significa que podemos usar um conjunto de códigos para completar operações de acesso a arquivos e memória. Portanto, ao definir algumas interfaces, tendo a definir os tipos de parâmetros como classes abstratas em vez de classes concretas. Por exemplo, uma função para completar a função de salvamento é definida como
função Salvar (AStream: TStream): Boolean;
do que definido como
função Salvar (AStream: TFileStream): Boolean;
Seja muito mais flexível.
A primeira definição é prospectiva porque pode ser aplicada a novos tipos de fluxos que possam surgir no futuro. A última definição só se aplica a fluxos como TFileStream (incluindo subclasses de TFileStream, é claro), que é muito mais rígido.
Meu hábito: Se existe uma classe abstrata, tente definir os parâmetros como o tipo da classe abstrata. Afinal, não podemos prever o futuro.
oito. Use mais o TAction
Delphi 4 e posteriores introduziram o conceito de Action e adicionaram o componente TActionList à barra de componentes Standard. A vantagem de usar Action é que as preocupações com a sincronização do estado de controle desapareceram!
Mais artigos
Musicwind®@HangZhou.Zj.China