Aqui tentarei trazer alguma ajuda ao desenvolvimento de programas em Delphi. Se voce gostar delas ou tiver algo a compartilhar, mande um e-mail.
Quando voce exeuta um programa DOS no Windows95, sua janela permanece aberta até ser fechada pelo usuário. Para executar um programa DOS que fecha sua janela após a execução, deve ser especificado "command.com /c programa"na linha de comando. Usando a função da API WinExec para executar um programa chamado progdos.exe, a chamada deve ser:
WinExec('command.com /c progdos.exe',sw_ShowNormal);
Se o programa deve ser executado sem que seja visualizado pelo usuário, o segundo parâmetro deve ser sw_Hide. Deve ser especificada a extensão .com senão o programa não será executado.
Se o texto de um TEdit for mudado no seu evento OnChange, este evento será chamado recursivamente até acabar com o espaço de pilha. Para fazer isso, deve-se setar o evento OnChange para NIL antes de mudar o texto, voltando ao original depois, desta maneira:
procedure Edit1Change(Sender : TObject);
begin
Edit1.OnChange := NIL;
if Edit1.Text = 'Texto' then
Edit1.Text := 'Novo Texto';
Edit1.OnChange := Edit1Change;
end;
Esta dica também vale para evento OnValidate.
Em Delphi 1.0, marcando a checkbox Optimize for size and load time, em Options/Project/Linker não funciona (aparece uma mensagem de disco cheio, mesmo com muito espaço). Delphi 1.0 vem com um programa DOS, W8LOSS, que faz o mesmo. Para usá-lo, deve-se teclar o seguinte:
W8LOSS programa.exe
Isto encolherá o executável em aproximadamente 20%, diminuindo o tempo de carga.
Para pegar a linha e coluna de um memo voce deve utilizar o seguinte:
With Memo1 do begin
Line := Perform(EM_LINEFROMCHAR,SelStart, 0);
Column := SelStart - Perform(EM_LINEINDEX, Line, 0);
end;
Para mudar o fonte de um menu voce deve esquecer o Menu Designer e criar os itens usando a função da API AppendMenu, utilizando o parâmetro MF_OWNERDRAW, no evento OnCreate da Form. Então use as mensagens WM_MEASUREITEM e WM_DRAWITEM para desenhar os menus. Pegue um exemplo.
Normalmente o Delphi pega os formatos de data/hora, moeda e formato numérico da Configuração Internacional do Painel de Controle. Isto pode levar a erros quando avaliando datas, numeros ou listas. Para evitar estes erros, voce pode mudar as constantes definidas no Delphi, como DecimalSeparator, ShortDateFormat e outros desta maneira:
DecimalSeparator := '.';
ShortDateFormat := 'mm/dd/yy';
Para extrair ícones de um executável, deve-se usar a função da API ExtractIcon. Ela usa 3 parâmetros:
Instance - Instancia da aplicação
FileName - Nome do executável. Deve ser um PChar
NumIcon - Número do ícone a ser recuperado. Se for Word(-1), a função retorna a quantidade de ícones no executável.
Para acessar as variáveis de ambiente do DOS, deve-se usar a função da API GetDosEnvironment. Ela retorna um PChar que pode ser avaliado. Pegue um exemplo.
Para filtrar e classificar tabelas em Delphi 1.0, voce pode usar um arquivo QBE (Query by Example) como propriedade TableName de uma TTable. Isto permite filtrar, classificar ou unir tabelas usando o componente TTable. Arquivos QBE podem ser criados no Database Desktop.
O DBNavigator tem uma matriz protegida Buttons que acessa os seus botões. Criando um descendente do DBNavigator permite acessá-los e mudar suas propriedades. TBSNavigator é um componente que permite mudar seu estado Enabled ou sua figura.
Para fazer a tecla Enter funcionar como Tab é um processo de 3 passos
Para compactar (remover fisicamente todos registros apagados) de uma tabela Paradox deve-se utilizar o seguinte código
Para compactar tabelas Dbase use o seguinte comando
As grids multiseleções do Delphi 2.0 têm uma propriedade não documentada chamada SelectedRows, uma lista de TBookmark. Você pode utilizá-la com um código como este:
Para listar (pegar) todas janelas abertas, deve-se usar a funcao da API EnumWindows, que usa uma funcao Callback, com dois parametros, um Handle para a janela e um ponteiro. Voce pode usá-la com um código semelhante a este (Este lista as janelas abertas, mesmo invisíveis, em uma listbox):
Para converter a primeira letra de um EditBox para maiúsculas este código pode ser utilizado:
Para posicionar o cursor em uma linha de um Memo ou RichEdit, deve-se utilizar o seguinte:
With Memo1 do
SelStart := Perform(EM_LINEINDEX, Linha, 0);
Para movimentar uma form sem barra de título, deve-se tratar a mensagem WM_NCHITTEST, desta maneira:
type
TForm1 = class(TForm)
public
procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
if M.Result = htClient then {se o mouse foi clicado na form}
M.Result := htCaption; {faz o Windows pensar que foi na barra de título}
end;
Dica enviada por Serkan Aksu
Para alinhar itens do menu principal à direita, deve-se utilizar o seguinte código:
{Isto justifica todos itens à direita do selecionado}
procedure SetJustify(Menu: TMenu; MenuItem: TMenuItem; Justify: Byte);
{$IFDEF WIN32}
var
ItemInfo: TMenuItemInfo;
Buffer: array[0..80] of Char;
{$ENDIF}
begin
{$IFDEF VER80}
MenuItem.Caption := Chr(8) + MenuItem.Caption;
{$ELSE}
ItemInfo.cbSize := SizeOf(TMenuItemInfo);
ItemInfo.fMask := MIIM_TYPE;
ItemInfo.dwTypeData := Buffer;
ItemInfo.cch := SizeOf(Buffer);
GetMenuItemInfo(Menu.Handle, MenuItem.Command, False, ItemInfo);
if Justify = 1 then
ItemInfo.fType := ItemInfo.fType or MFT_RIGHTJUSTIFY;
SetMenuItemInfo(Menu.Handle, MenuItem.Command, False, ItemInfo);
{$ENDIF}
end;
Dica enviada por Eddie Shipman
Para mostrar as resoluções de vídeo disponíveis, deve-se usar a função da API EnumDisplaySettings: ela pega todos os modos de vídeo disponíveis.
Para alterar os modos, deve-se usar a função ChangeDisplaySettings, que muda a resolução de vídeo e quantidade de cores.
Pegue um exemplo.
Quando o mouse entra na área de um componente, Delphi envia a mensagem CM_MouseEnter. Quando sai, o Delphi envia uma mensagem. Tratando estas duas mensagens, pode-se detectar quando o mouse está sobre um componente. O componente Fly-Over label mostra esta técnica.
Quando o Windows está finalizando, ele envia a mensagem WM_QueryEndSession para todas aplicações abertas. Para detectar (e impedi-la), deve-se definir um manipulador para esta mensagem. Ponha esta definição na seção privada de sua form:
E ponha este método na seção implementation da unit:
procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QueryEndSession;
procedure TForm1.WMQueryEndSession(var Msg : TWMQueryEndSession);
begin
if MessageDlg('Fecha o Windows ?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1;
end;
Para mostrar a barra de tarefas do Windows, usa-se este código:
If you want to be notified of updates, please join the mailing list
Se voce quer ser notificado de atualizações, assine a lista