Ha situacoes nas quais gostariamos de copiar um determinado arquivo. Ate a versao 2009 as bibliotecas de tempo de execucao do Delphi nao nos fornecia uma funcao ou procedure para realizar tal tarefa. No entanto, e possivel chamar a funcao CopyFile() da WinAPI a partir de nossas aplicacoes sem quaisquer esforcos adicionais. Esta funcao requer o nome e caminho do arquivo a ser copiado, o nome e caminho do novo arquivo e um valor true ou false indicando se a funcao deve falhar caso o segundo arquivo ja exista. O retorno sera true se a operacao for realizada com sucesso e false em caso contrario.Veja um trecho de codigo no qual efetuamos a copia de um arquivo:procedure TForm1.Button1Click(Sender: TObject);var arquivo_original, novo_arquivo: string;begin // diretorio e nome do arquivo original arquivo_original := 'C:\arquivo de codigos\dados.txt'; // diretorio e nome do novo arquivo novo_arquivo := 'C:\arquivo de codigos\dados2.txt'; // vamos copiar o arquivo if CopyFile(PChar(arquivo_original), PChar(novo_arquivo), true) then ShowMessage('O arquivo foi copiado com sucesso') else ShowMessage('Nao foi possivel copiar o arquivo');end; Uma das duvidas mais frequentes de programadores vindos de linguagens tais como Java, C/C++, C#, etc, e em relacao ao indice inicial de uma matriz em Delphi. Em outras linguagens, e comum o indice de uma matriz comecar sempre em 0. Felizmente, o Delphi nos oferece uma flexibilidade maior.Em Delphi nos podemos definir o indice inicial da matriz para o valor que desejarmos. Veja alguns exemplos:procedure TForm3.Button1Click(Sender: TObject);var valores: array[5..10] of Integer; codigos: array[5000..10000] of Integer; letras: array[Ord('a')..Ord('z')] of Char;begin // alguma implementacao aquiend;Note que e possivel termos o mesmo valor para o indice inicial e final da matriz. Mas, nao e possivel definir o indice inicial maior que o indice final. Veja:procedure TForm3.Button1Click(Sender: TObject);var valores: array[7..5] of Integer;begin // alguma implementacao aquiend;Ao tentarmos compilar este trecho de codigo teremos a seguinte mensagem de erro:[DCC Error] Unit3.pas(90): E2011 Low bound exceeds high bound. O metodo ExecSQL() da classe TSQLDataSet e usado quando queremos executar comandos SQL que nao retornam um conjunto de dados. Este comando pode ser INSERT, UPDATE, DELETE, CREATE TABLE, etc, exceto SELECT.Veja a assinatura deste metodo:function ExecSQL(ExecDirect: Boolean = False): Integer; override;ExecDirect e usado para indicar que a query nao precisa ser preparada antes de ser executada. Este parametro pode ser definido como True se o comando nao incluir nenhum parametro. Se o valor for False, a query sera preparada antes de ser executada.Vamos ver um exemplo? Veja um trecho de codigo no qual usamos o metodo ExecSQL() para disparar um comando SQL UPDATE. Note que aqui estamos usando um comando SQL preparado (pre-compilado):procedure TForm3.Button1Click(Sender: TObject);var nome: string; id: integer;begin nome := 'OSMAR J. SILVA'; id := 2; // id do registro a ser atualizado // vamos definir o comando SQL a ser executado SQLDataSet1.CommandText := 'UPDATE contatos SET nome = :nome WHERE id = :id'; SQLDataSet1.Params[0].Name := 'nome'; SQLDataSet1.Params[0].Value := nome; SQLDataSet1.Params[1].Name := 'id'; SQLDataSet1.Params[1].Value := id; // como o comando e preparado, vamos definir o valor // False para o parametro ExecDirect SQLDataSet1.ExecSQL(False); // vamos mostrar uma mensagem indicando o sucesso da operacao ShowMessage('Comando SQL executado com sucesso.');end;E