Function JOemToAnsiStr(const OemStr: string): string;
begin
SetLength(Result, Length(OemStr));
if Length(Result) > 0 then
{$IFDEF WIN32}
OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result));
{$ELSE}
OemToAnsiBuff(@OemStr[1], @Result[1], Length(Result));
{$ENDIF}
end;
Exemplo
var
Variavel: String;
begin
//Pode pegar por exemplo de uma variável DOS q venha de um DBF e converter para o padrão Win
Variavel := JOemToAnsiStr('Texto em DOS');
...
P. 1140
quarta-feira, 25 de novembro de 2009
Protegendo uma aplicação com uma senha armazenada na própria aplicaçati
// Evento OnCreate do Form
procedure TForm1.FormCreate(Sender: TObject);
var
Senha : String;
OK : Boolean;
Tentativa : integer;
begin
Tentativa := 0;
OK := False;
while (Tentativa < 3) do
begin
InputQuery(‘Digite a sua senha’, ‘Você tem ‘ + IntToStr(3 - Tentativa) + ‘ tentativas’, senha);
if (senha = ‘Senha’) then
begin
OK := True;
Break;
end;
Inc(Tentativa);
end;
if not OK then
begin
ShowMessage(‘Tentativas excedidas. Pressione OK para terminar.’);
Application.Terminate;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Senha : String;
OK : Boolean;
Tentativa : integer;
begin
Tentativa := 0;
OK := False;
while (Tentativa < 3) do
begin
InputQuery(‘Digite a sua senha’, ‘Você tem ‘ + IntToStr(3 - Tentativa) + ‘ tentativas’, senha);
if (senha = ‘Senha’) then
begin
OK := True;
Break;
end;
Inc(Tentativa);
end;
if not OK then
begin
ShowMessage(‘Tentativas excedidas. Pressione OK para terminar.’);
Application.Terminate;
end;
end;
Uma boa forma de usar mdichild
{Quando uso este recurso nas minhas aplicações eu consigo reduzir em muito o tempo de carregamento do software, sendo assim, resolvi partilhar com todos.
É simples, baseada em uma função (FormExiste), que verifica se um form (MDIChild) já existe na memória. Se existir ele somente dá o foco ao mesmo, senão ele o cria e o deixa na tela pronto para funcionar...
Deixando de conversa, vamos ao código!}
//Função de reconhecimento de MDIChilds
function FormExiste(NomeJanela : TForm) : Boolean;
//Função declarada
//Implementando a função
function TForm1.FormExiste (NomeJanela : TForm) : Boolean;
var i : integer;
begin
formexiste := false;
for i := 0 to ComponentCount -1 do
if Components[i] is TForm then
if TForm(Components[i]) = NomeJanela then
FormExiste := true;
end;
{Para fazer uso correto da função você deve
seguir o exemplo do procedimento abaixo}
procedure TForm1.Button1Click(Sender: TObject);
begin
if FormExiste(frmAlunos) = false then
begin
Screen.Cursor := crhourGlass;
Form2 := TForm2.Create(Self);
Screen.Cursor := crDefault;
end
Else
if FormExiste(Form2 then
begin
Form2.WindowState := wsNormal;
Form2.BringToFront;
Form2.SetFocus;
end;
end;
{Certo?
Espero ter ajudado!
Evaldo Barbosa
evaldobarbosa@hotmail.com}
É simples, baseada em uma função (FormExiste), que verifica se um form (MDIChild) já existe na memória. Se existir ele somente dá o foco ao mesmo, senão ele o cria e o deixa na tela pronto para funcionar...
Deixando de conversa, vamos ao código!}
//Função de reconhecimento de MDIChilds
function FormExiste(NomeJanela : TForm) : Boolean;
//Função declarada
//Implementando a função
function TForm1.FormExiste (NomeJanela : TForm) : Boolean;
var i : integer;
begin
formexiste := false;
for i := 0 to ComponentCount -1 do
if Components[i] is TForm then
if TForm(Components[i]) = NomeJanela then
FormExiste := true;
end;
{Para fazer uso correto da função você deve
seguir o exemplo do procedimento abaixo}
procedure TForm1.Button1Click(Sender: TObject);
begin
if FormExiste(frmAlunos) = false then
begin
Screen.Cursor := crhourGlass;
Form2 := TForm2.Create(Self);
Screen.Cursor := crDefault;
end
Else
if FormExiste(Form2 then
begin
Form2.WindowState := wsNormal;
Form2.BringToFront;
Form2.SetFocus;
end;
end;
{Certo?
Espero ter ajudado!
Evaldo Barbosa
evaldobarbosa@hotmail.com}
Criando formulários no formato de bola
{Para criar uma janela não retangular, você deve criar uma Região do Windows e usar a função da API SetWindowRgn, desta maneira (isto funciona apenas em D2/D3):}
var hR : THandle;
begin
// Cria uma Região elíptica
hR := CreateEllipticRgn(0,0,100,200);
SetWindowRgn(Handle,hR,True);
end;
var hR : THandle;
begin
// Cria uma Região elíptica
hR := CreateEllipticRgn(0,0,100,200);
SetWindowRgn(Handle,hR,True);
end;
Marcadores:
Criando formulários no formato de bola
Criando evento em tempo de execução
Memo.onchange := memo1Change;
procedure TForm1.Memo1Change(Sender: TObject);
begin
panel1.caption:='Conteúdo alterado';
end;
procedure TForm1.Memo1Change(Sender: TObject);
begin
panel1.caption:='Conteúdo alterado';
end;
Marcadores:
Criando evento em tempo de execução
Criando e excluindo tfields em tempo de execução
{Objetos TField (e seus descendentes) podem ser criados em tempo de desenvolvimento através do Fields Editor.
O Fileds Editor é acionado quando damos um clique duplo no componente de acesso a dados, ou seja, TTable ou TQuery. Mas nós podemos fazer isto em tempo de execução também.
Descendentes do TField componente (como TStringField, TIntegerField, etc.) são criados para que possamos chamar o métodos Create para o tipo de campo desejado.
Após criar o componente, precisamos especificar algumas propriedades para que a conexão com os dados funcione e assim poderemos alterar dados das tabelas. São
eles:
FieldName: nome do campo na tabela.
Name: nome do componente, usado pelo Delphi.
Index: É um número de identificação para o campo. Este número nunca é repetido,
automaticamente é controlado pelo Delphi.}
DataSet: O componente TTable ou TQuery ao qual queremos associar o campo.
O Código abaixo mostra a criação de um campo String. Usaremos o Objeto Query1
para nos referenciarmos ao DataSet.
procedure TForm1.Button2Click(Sender: TObject);
var T: TStringField;
begin
Query1.Close;
T := TStringField.Create(Self);
T.FieldName := 'CO_NAME';
T.Name := Query1.Name + T.FieldName;
T.Index := Query1.FieldCount;
T.DataSet := Query1;
Query1.FieldDefs.UpDate;
Query1.Open;
end;
Note que é necessário fechar o DataSet(Query1) antes de adicionarmos o novo campo.
Usamos a propriedade "Fieldcount" para definir o número da chave do campo criado, usando esta propriedade obteremos o número de TFileds que o DataSet(Query1) possui no momento, assim sempre estaremos criando um campo novo, pois se o primeiro começa com 0
Excluir um campo é bem mais simples, para isto basta criar um instância do tipo TComponent, e usar a função FindComponent para referenciá-lo ao objeto, para isto basta sabermos o nome do Objeto. A exclusão é feita através do método Free.
procedure TForm1.Button1Click(Sender: TObject);
var TC: TComponent;
begin
TC := FindComponent('Query1CO_NAME');
if not (TC = nil) then
begin
Query1.Close;
TC.Free;
Query1.Open;
end;
end;
O Fileds Editor é acionado quando damos um clique duplo no componente de acesso a dados, ou seja, TTable ou TQuery. Mas nós podemos fazer isto em tempo de execução também.
Descendentes do TField componente (como TStringField, TIntegerField, etc.) são criados para que possamos chamar o métodos Create para o tipo de campo desejado.
Após criar o componente, precisamos especificar algumas propriedades para que a conexão com os dados funcione e assim poderemos alterar dados das tabelas. São
eles:
FieldName: nome do campo na tabela.
Name: nome do componente, usado pelo Delphi.
Index: É um número de identificação para o campo. Este número nunca é repetido,
automaticamente é controlado pelo Delphi.}
DataSet: O componente TTable ou TQuery ao qual queremos associar o campo.
O Código abaixo mostra a criação de um campo String. Usaremos o Objeto Query1
para nos referenciarmos ao DataSet.
procedure TForm1.Button2Click(Sender: TObject);
var T: TStringField;
begin
Query1.Close;
T := TStringField.Create(Self);
T.FieldName := 'CO_NAME';
T.Name := Query1.Name + T.FieldName;
T.Index := Query1.FieldCount;
T.DataSet := Query1;
Query1.FieldDefs.UpDate;
Query1.Open;
end;
Note que é necessário fechar o DataSet(Query1) antes de adicionarmos o novo campo.
Usamos a propriedade "Fieldcount" para definir o número da chave do campo criado, usando esta propriedade obteremos o número de TFileds que o DataSet(Query1) possui no momento, assim sempre estaremos criando um campo novo, pois se o primeiro começa com 0
Excluir um campo é bem mais simples, para isto basta criar um instância do tipo TComponent, e usar a função FindComponent para referenciá-lo ao objeto, para isto basta sabermos o nome do Objeto. A exclusão é feita através do método Free.
procedure TForm1.Button1Click(Sender: TObject);
var TC: TComponent;
begin
TC := FindComponent('Query1CO_NAME');
if not (TC = nil) then
begin
Query1.Close;
TC.Free;
Query1.Open;
end;
end;
Copiando registros de uma tabela para outra incluindo valores
NULL
procedure TtableCopiaRegistro(Origem, Destino: Ttable);
begin
with TabelaOrig do
begin
for i := 0 to FieldCount -1 do
if not Fields[i].IsNull then TabelaDest.Fields[i].Assign(Fields[i]);
end;
end;
procedure TtableCopiaRegistro(Origem, Destino: Ttable);
begin
with TabelaOrig do
begin
for i := 0 to FieldCount -1 do
if not Fields[i].IsNull then TabelaDest.Fields[i].Assign(Fields[i]);
end;
end;
Convertendo valores
{No delphi podemos ler um campo armazenado numa tabela, alterando seu tipo, ou seja, podemos ler um campo numérico, por exemplo, como um campo string, e vice-versa. Este recurso é útil e prático, pois permite maior agilidade e menos programação.
Exemplo:
Se quisermos converter um campo numérico armazendo em Tabela1 para string, armazenando-o na variável S, podemos fazer o seguinte:}
S:=tabela1.camponumerico.asstring;
{Pode-se utilizar as seguintes conversões:
Asboolean - Converte para valores booleanos (lógicos)
AsDateTime - Converte para Data/Hora
AsFloat - Converte para valores numéricos de ponto flutuante
AsInteger - Converte para valors numéricos inteiros
AsString - Converte para strings de caracteres}
Exemplo:
Se quisermos converter um campo numérico armazendo em Tabela1 para string, armazenando-o na variável S, podemos fazer o seguinte:}
S:=tabela1.camponumerico.asstring;
{Pode-se utilizar as seguintes conversões:
Asboolean - Converte para valores booleanos (lógicos)
AsDateTime - Converte para Data/Hora
AsFloat - Converte para valores numéricos de ponto flutuante
AsInteger - Converte para valors numéricos inteiros
AsString - Converte para strings de caracteres}
Convertendo valor hexadecimal para inteiro
Function HexToInt(const HexStr: string): longint;
var iNdx: integer;
cTmp: Char;
begin
Result := 0;
for iNdx := 1 to Length(HexStr) do
begin
cTmp := HexStr[iNdx];
case cTmp of
'0'..'9': Result := 16 * Result + (Ord(cTmp) - $30);
'A'..'F': Result := 16 * Result + (Ord(cTmp) - $37);
'a'..'f': Result := 16 * Result + (Ord(cTmp) - $57);
else
raise EConvertError.Create('Illegal character in hex string');
end;
end;
end;
var iNdx: integer;
cTmp: Char;
begin
Result := 0;
for iNdx := 1 to Length(HexStr) do
begin
cTmp := HexStr[iNdx];
case cTmp of
'0'..'9': Result := 16 * Result + (Ord(cTmp) - $30);
'A'..'F': Result := 16 * Result + (Ord(cTmp) - $37);
'a'..'f': Result := 16 * Result + (Ord(cTmp) - $57);
else
raise EConvertError.Create('Illegal character in hex string');
end;
end;
end;
Marcadores:
Convertendo valor hexadecimal para inteiro
Convertendo um número real para string com 2 casas
ValorReal : Real;
ValorString : String;
ValorReal := 5;
ValorString := floattostrf(ValorReal,ffFixed,18,2);
ValorString : String;
ValorReal := 5;
ValorString := floattostrf(ValorReal,ffFixed,18,2);
Convertendo pchar para string
Var sWinDir: AnsiString;
nTam: Integer;
begin
nTam := MAX_PATH;
SetLength(sWinDir,nTam);
GetWindowsDirectory( PChar( sWinDir ), nTam )
SetLength(sWinDir,nTam);
end;
nTam: Integer;
begin
nTam := MAX_PATH;
SetLength(sWinDir,nTam);
GetWindowsDirectory( PChar( sWinDir ), nTam )
SetLength(sWinDir,nTam);
end;
Conectando uma unidade de rede
Var NRW: TNetResource;
begin
with NRW do
begin
dwType := RESOURCETYPE_ANY;
lpLocalName := 'G:';
lpRemoteName := '\servidorc';
lpProvider := '';
end;
WNetAddConnection2(NRW, 'MyPassword', 'MyUserName', CONNECT_UPDATE_PROFILE);
end;
begin
with NRW do
begin
dwType := RESOURCETYPE_ANY;
lpLocalName := 'G:';
lpRemoteName := '\servidorc';
lpProvider := '';
end;
WNetAddConnection2(NRW, 'MyPassword', 'MyUserName', CONNECT_UPDATE_PROFILE);
end;
obtendo o espaço livre em disco.
procedure TForm1.Button1Click(Sender: TObject);
var
FreeAvailable,TotalSpace,TotalFree : Int64;
begin
GetDiskFreeSpaceEx('c:',FreeAvailable,TotalSpace,@TotalFree);
ShowMessage('Espaço livre: '+FormatFloat('#,0',TotalFree)+#13+
'Espaço disponível: '+FormatFloat('#,0',FreeAvailable)+#13+
'Espaço total do disco: '+FormatFloat('#,0',TotalSpace));
end;
var
FreeAvailable,TotalSpace,TotalFree : Int64;
begin
GetDiskFreeSpaceEx('c:',FreeAvailable,TotalSpace,@TotalFree);
ShowMessage('Espaço livre: '+FormatFloat('#,0',TotalFree)+#13+
'Espaço disponível: '+FormatFloat('#,0',FreeAvailable)+#13+
'Espaço total do disco: '+FormatFloat('#,0',TotalSpace));
end;
Usando mutex pra não deixar seu aplicativo ser executado mais de uma vez.
{1o. Coloque o código abaixo no seu projeto, clicando no menu Project/View Source.
2o. Adicione a Unit Windows no uses de seu projeto.
Esta dica serve para não deixar que seu aplicativo seja executado mais de uma vez, inclusive no Windows XP }
{$R *.res}
Var
MutexHandle: THandle;
hwind:HWND;
begin
MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'Este programa já está em execução!','', mb_IconHand);
CloseHandle(MutexHandle);
hwind:=0;
repeat
hwind:=Windows.FindWindowEx(0,hwind,'TApplication','My sampleapp');
until (hwind<>Application.Handle);
if (hwind<>0) then
begin
Windows.ShowWindow(hwind,SW_SHOWNORMAL);
Windows.SetForegroundWindow(hwind);
end;
Halt;
end
end;
Application.Initialize;
Application.CreateForm(Tf_principal, f_principal);
Application.Run;
end.
2o. Adicione a Unit Windows no uses de seu projeto.
Esta dica serve para não deixar que seu aplicativo seja executado mais de uma vez, inclusive no Windows XP }
{$R *.res}
Var
MutexHandle: THandle;
hwind:HWND;
begin
MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'Este programa já está em execução!','', mb_IconHand);
CloseHandle(MutexHandle);
hwind:=0;
repeat
hwind:=Windows.FindWindowEx(0,hwind,'TApplication','My sampleapp');
until (hwind<>Application.Handle);
if (hwind<>0) then
begin
Windows.ShowWindow(hwind,SW_SHOWNORMAL);
Windows.SetForegroundWindow(hwind);
end;
Halt;
end
end;
Application.Initialize;
Application.CreateForm(Tf_principal, f_principal);
Application.Run;
end.
Como criar uma variante de carregamento
{1º para que serve uma variante de carregamento?
Uma variante de carregamento serve para você indicar que o programa a ser usado está carregando, como se fosse uma especíe de downloads.
Ai Vai.}
procedure TForm1.Button1Click(Sender: TObject);
var
time1, time2:tdatetime;
n1, n2, total: variant;
begin
time1:= now;
n1:= 0;
n2:= 0;
progressbar1.position:= 0;
while n1 < 5000000 do
begin
n2:=n2 + n1;
inc (n1);
if (n1 mod 50000) = 0 then
begin
progressbar1.position:= n1 div 50000;
application.ProcessMessages;
end;
end;
// devemos usar o resultado
total:=n2;
time2:=now;
label1.caption:= formatdatetime('n:ss', time1-time2) + ' segundos';
end;
//obs: progressbar está em win32.
Uma variante de carregamento serve para você indicar que o programa a ser usado está carregando, como se fosse uma especíe de downloads.
Ai Vai.}
procedure TForm1.Button1Click(Sender: TObject);
var
time1, time2:tdatetime;
n1, n2, total: variant;
begin
time1:= now;
n1:= 0;
n2:= 0;
progressbar1.position:= 0;
while n1 < 5000000 do
begin
n2:=n2 + n1;
inc (n1);
if (n1 mod 50000) = 0 then
begin
progressbar1.position:= n1 div 50000;
application.ProcessMessages;
end;
end;
// devemos usar o resultado
total:=n2;
time2:=now;
label1.caption:= formatdatetime('n:ss', time1-time2) + ' segundos';
end;
//obs: progressbar está em win32.
Marcadores:
Como criar uma variante de carregamento
Como criar uma variante de carregamento
{1º para que serve uma variante de carregamento?
Uma variante de carregamento serve para você indicar que o programa a ser usado está carregando, como se fosse uma especíe de downloads.
Ai Vai.}
procedure TForm1.Button1Click(Sender: TObject);
var
time1, time2:tdatetime;
n1, n2, total: variant;
begin
time1:= now;
n1:= 0;
n2:= 0;
progressbar1.position:= 0;
while n1 < 5000000 do
begin
n2:=n2 + n1;
inc (n1);
if (n1 mod 50000) = 0 then
begin
progressbar1.position:= n1 div 50000;
application.ProcessMessages;
end;
end;
// devemos usar o resultado
total:=n2;
time2:=now;
label1.caption:= formatdatetime('n:ss', time1-time2) + ' segundos';
end;
//obs: progressbar está em win32.
Uma variante de carregamento serve para você indicar que o programa a ser usado está carregando, como se fosse uma especíe de downloads.
Ai Vai.}
procedure TForm1.Button1Click(Sender: TObject);
var
time1, time2:tdatetime;
n1, n2, total: variant;
begin
time1:= now;
n1:= 0;
n2:= 0;
progressbar1.position:= 0;
while n1 < 5000000 do
begin
n2:=n2 + n1;
inc (n1);
if (n1 mod 50000) = 0 then
begin
progressbar1.position:= n1 div 50000;
application.ProcessMessages;
end;
end;
// devemos usar o resultado
total:=n2;
time2:=now;
label1.caption:= formatdatetime('n:ss', time1-time2) + ' segundos';
end;
//obs: progressbar está em win32.
Marcadores:
Como criar uma variante de carregamento
Como obter a data e hora de acesso, criação e alteração de um arquivo
//Usamos o objeto TSearchRec para retornar as datas e horas de um arquivo.
var
SearchFile: TSearchRec;
lpSystemTime: TSystemTime;
begin
{ arquivo }
FindFirst(‘c:ActiveDelphi.exe’,faAnyFile,SearchFile);
try
{ Criação }
FileTimeToSystemTime
(SearchFile.FindData.ftCreationTime,lpSystemTime);
Edit1.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Modificado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastWriteTime,lpSystemTime);
Edit2.text:=DateTimeToStr
(SystemTimeToDateTime(lpSystemTime));
{ Acessado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastAccessTime,lpSystemTime);
Edit3.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
finally
FindClose(SearchFile);
end;
end;
var
SearchFile: TSearchRec;
lpSystemTime: TSystemTime;
begin
{ arquivo }
FindFirst(‘c:ActiveDelphi.exe’,faAnyFile,SearchFile);
try
{ Criação }
FileTimeToSystemTime
(SearchFile.FindData.ftCreationTime,lpSystemTime);
Edit1.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Modificado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastWriteTime,lpSystemTime);
Edit2.text:=DateTimeToStr
(SystemTimeToDateTime(lpSystemTime));
{ Acessado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastAccessTime,lpSystemTime);
Edit3.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
finally
FindClose(SearchFile);
end;
end;
Obter status da memória do sistema
//Adicione um TButton e um TMemo, no evento Onclick do TButton insira o código abaixo.
procedure TForm1.Button1Click(Sender: TObject);
const
cBytesPorMb = 1024 * 1024;
var
M: TMemoryStatus;
begin
M.dwLength := SizeOf(M);
GlobalMemoryStatus(M);
Memo1.Clear;
with Memo1.Lines do begin
Add(Format('Memória em uso: %d%%', [M.dwMemoryLoad]));
Add(Format('Total de memória física: %f MB', [M.dwTotalPhys / cBytesPorMb]));
Add(Format('Memória física disponível: %f MB', [M.dwAvailPhys / cBytesPorMb]));
Add(Format('Tamanho máximo do arquivo de paginação: %f MB', [M.dwTotalPageFile / cBytesPorMb]));
Add(Format('Disponível no arquivo de paginação: %f MB', [M.dwAvailPageFile / cBytesPorMb]));
Add(Format('Total de memória virtual: %f MB', [M.dwTotalVirtual / cBytesPorMb]));
Add(Format('Memória virtual disponível: %f MB', [M.dwAvailVirtual / cBytesPorMb]));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
cBytesPorMb = 1024 * 1024;
var
M: TMemoryStatus;
begin
M.dwLength := SizeOf(M);
GlobalMemoryStatus(M);
Memo1.Clear;
with Memo1.Lines do begin
Add(Format('Memória em uso: %d%%', [M.dwMemoryLoad]));
Add(Format('Total de memória física: %f MB', [M.dwTotalPhys / cBytesPorMb]));
Add(Format('Memória física disponível: %f MB', [M.dwAvailPhys / cBytesPorMb]));
Add(Format('Tamanho máximo do arquivo de paginação: %f MB', [M.dwTotalPageFile / cBytesPorMb]));
Add(Format('Disponível no arquivo de paginação: %f MB', [M.dwAvailPageFile / cBytesPorMb]));
Add(Format('Total de memória virtual: %f MB', [M.dwTotalVirtual / cBytesPorMb]));
Add(Format('Memória virtual disponível: %f MB', [M.dwAvailVirtual / cBytesPorMb]));
end;
end;
como abrir um relatório criado no ms access pelo delphi
procedure TForm1.ImprimeClick(Sender: TObject);
var access : variant;
const
print = $00000000;
viewDesign = $00000001;
preview = $00000002;
begin
// Abre a aplicaçao Access
try
Access := GetActiveOleObject('Access.Application');
except
Access := CreateOleObject('Access.Application');
end;
Access.Visible := true;
// Abre o database
// Informe no primeiro parâmetro o local do arquivo.mdb
// No Segundo parâmetro especificar se o banco de dados do Access abrirá no modo exclusivo, não compartilhado.
Access.OpenCurrentDatabase('C:Mes documentostestearquivo.mdb', True);
{
Abre o relatório criado no Access; informar seu nome no primeiro parâmetro.
O valor do segundo parâmetro deve ser: preview, viewDesign(estrutura) ou print(o qual é default e imprime o relatório imediatamente).
O *terceiro parâmetro, é para uma expressão de sequência que seja o nome válido de uma consulta no banco de dados atual.
O *quarto parâmetro é para cláusula WHERE SQL válida, sem a palavra WHERE.
*não foi usado neste exemplo
}
Access.DoCmd.OpenReport('Relatorio_de_Clientes', preview,
EmptyParam, EmptyParam);
end;
procedure TForm1.FecharAccessClick(Sender: TObject);
var access : variant;
begin
// depois de imprimir, use esse código para fechar:
try
Access := GetActiveOleObject('Access.Application');
except
Access := CreateOleObject('Access.Application');
end;
Access.CloseCurrentDatabase;
Access.Quit;
end;
var access : variant;
const
print = $00000000;
viewDesign = $00000001;
preview = $00000002;
begin
// Abre a aplicaçao Access
try
Access := GetActiveOleObject('Access.Application');
except
Access := CreateOleObject('Access.Application');
end;
Access.Visible := true;
// Abre o database
// Informe no primeiro parâmetro o local do arquivo.mdb
// No Segundo parâmetro especificar se o banco de dados do Access abrirá no modo exclusivo, não compartilhado.
Access.OpenCurrentDatabase('C:Mes documentostestearquivo.mdb', True);
{
Abre o relatório criado no Access; informar seu nome no primeiro parâmetro.
O valor do segundo parâmetro deve ser: preview, viewDesign(estrutura) ou print(o qual é default e imprime o relatório imediatamente).
O *terceiro parâmetro, é para uma expressão de sequência que seja o nome válido de uma consulta no banco de dados atual.
O *quarto parâmetro é para cláusula WHERE SQL válida, sem a palavra WHERE.
*não foi usado neste exemplo
}
Access.DoCmd.OpenReport('Relatorio_de_Clientes', preview,
EmptyParam, EmptyParam);
end;
procedure TForm1.FecharAccessClick(Sender: TObject);
var access : variant;
begin
// depois de imprimir, use esse código para fechar:
try
Access := GetActiveOleObject('Access.Application');
except
Access := CreateOleObject('Access.Application');
end;
Access.CloseCurrentDatabase;
Access.Quit;
end;
Exportando timage no formato wmf.
procedure ExportaBMPtoWMF(Imagem:TImage; Dest:Pchar);
var
Metafile : TMetafile;
MetafileCanvas : TMetafileCanvas;
DC : HDC;
ScreenLogPixels : Integer;
begin
Metafile := TMetafile.Create;
try
DC := GetDC(0);
ScreenLogPixels := GetDeviceCaps(DC, LOGPIXELSY);
Metafile.Inch := ScreenLogPixels;
Metafile.Width := Imagem.Picture.Bitmap.Width;
Metafile.Height := Imagem.Picture.Bitmap.Height;
MetafileCanvas := TMetafileCanvas.Create(Metafile, DC);
ReleaseDC(0, DC);
try
MetafileCanvas.Draw(0, 0, Imagem.Picture.Bitmap);
finally
MetafileCanvas.Free; end;
Metafile.Enhanced := FALSE;
Metafile.SaveToFile(Dest);
finally
Metafile.Destroy;
end;
end;
var
Metafile : TMetafile;
MetafileCanvas : TMetafileCanvas;
DC : HDC;
ScreenLogPixels : Integer;
begin
Metafile := TMetafile.Create;
try
DC := GetDC(0);
ScreenLogPixels := GetDeviceCaps(DC, LOGPIXELSY);
Metafile.Inch := ScreenLogPixels;
Metafile.Width := Imagem.Picture.Bitmap.Width;
Metafile.Height := Imagem.Picture.Bitmap.Height;
MetafileCanvas := TMetafileCanvas.Create(Metafile, DC);
ReleaseDC(0, DC);
try
MetafileCanvas.Draw(0, 0, Imagem.Picture.Bitmap);
finally
MetafileCanvas.Free; end;
Metafile.Enhanced := FALSE;
Metafile.SaveToFile(Dest);
finally
Metafile.Destroy;
end;
end;
Exportando timage no formato wmf.
procedure ExportaBMPtoWMF(Imagem:TImage; Dest:Pchar);
var
Metafile : TMetafile;
MetafileCanvas : TMetafileCanvas;
DC : HDC;
ScreenLogPixels : Integer;
begin
Metafile := TMetafile.Create;
try
DC := GetDC(0);
ScreenLogPixels := GetDeviceCaps(DC, LOGPIXELSY);
Metafile.Inch := ScreenLogPixels;
Metafile.Width := Imagem.Picture.Bitmap.Width;
Metafile.Height := Imagem.Picture.Bitmap.Height;
MetafileCanvas := TMetafileCanvas.Create(Metafile, DC);
ReleaseDC(0, DC);
try
MetafileCanvas.Draw(0, 0, Imagem.Picture.Bitmap);
finally
MetafileCanvas.Free; end;
Metafile.Enhanced := FALSE;
Metafile.SaveToFile(Dest);
finally
Metafile.Destroy;
end;
end;
var
Metafile : TMetafile;
MetafileCanvas : TMetafileCanvas;
DC : HDC;
ScreenLogPixels : Integer;
begin
Metafile := TMetafile.Create;
try
DC := GetDC(0);
ScreenLogPixels := GetDeviceCaps(DC, LOGPIXELSY);
Metafile.Inch := ScreenLogPixels;
Metafile.Width := Imagem.Picture.Bitmap.Width;
Metafile.Height := Imagem.Picture.Bitmap.Height;
MetafileCanvas := TMetafileCanvas.Create(Metafile, DC);
ReleaseDC(0, DC);
try
MetafileCanvas.Draw(0, 0, Imagem.Picture.Bitmap);
finally
MetafileCanvas.Free; end;
Metafile.Enhanced := FALSE;
Metafile.SaveToFile(Dest);
finally
Metafile.Destroy;
end;
end;
Administrando memória
// Declare ShareMem na seção USES.
// Esta procedure faz ocorrência com borlndmm.dll
procedure InitMemoryManager;
var
SharedMemoryManager: TMemoryManager;
MM: Integer;
begin
SharedMemoryManager.GetMem := SysGetMem;
MM := GetModuleHandle(DelphiMM);
SharedMemoryManager.GetMem := GetProcAddress(MM,'@Borlndmm@SysGetMem$qqri');
SharedMemoryManager.FreeMem := GetProcAddress(MM,'@Borlndmm@SysFreeMem$qqrpv');
SharedMemoryManager.ReallocMem := GetProcAddress(MM, '@Borlndmm@SysReallocMem$qqrpvi');
SetMemoryManager(SharedMemoryManager);
end;
// Esta procedure faz ocorrência com borlndmm.dll
procedure InitMemoryManager;
var
SharedMemoryManager: TMemoryManager;
MM: Integer;
begin
SharedMemoryManager.GetMem := SysGetMem;
MM := GetModuleHandle(DelphiMM);
SharedMemoryManager.GetMem := GetProcAddress(MM,'@Borlndmm@SysGetMem$qqri');
SharedMemoryManager.FreeMem := GetProcAddress(MM,'@Borlndmm@SysFreeMem$qqrpv');
SharedMemoryManager.ReallocMem := GetProcAddress(MM, '@Borlndmm@SysReallocMem$qqrpvi');
SetMemoryManager(SharedMemoryManager);
end;
Administrando memória
// Declare ShareMem na seção USES.
// Esta procedure faz ocorrência com borlndmm.dll
procedure InitMemoryManager;
var
SharedMemoryManager: TMemoryManager;
MM: Integer;
begin
SharedMemoryManager.GetMem := SysGetMem;
MM := GetModuleHandle(DelphiMM);
SharedMemoryManager.GetMem := GetProcAddress(MM,'@Borlndmm@SysGetMem$qqri');
SharedMemoryManager.FreeMem := GetProcAddress(MM,'@Borlndmm@SysFreeMem$qqrpv');
SharedMemoryManager.ReallocMem := GetProcAddress(MM, '@Borlndmm@SysReallocMem$qqrpvi');
SetMemoryManager(SharedMemoryManager);
end;
// Esta procedure faz ocorrência com borlndmm.dll
procedure InitMemoryManager;
var
SharedMemoryManager: TMemoryManager;
MM: Integer;
begin
SharedMemoryManager.GetMem := SysGetMem;
MM := GetModuleHandle(DelphiMM);
SharedMemoryManager.GetMem := GetProcAddress(MM,'@Borlndmm@SysGetMem$qqri');
SharedMemoryManager.FreeMem := GetProcAddress(MM,'@Borlndmm@SysFreeMem$qqrpv');
SharedMemoryManager.ReallocMem := GetProcAddress(MM, '@Borlndmm@SysReallocMem$qqrpvi');
SetMemoryManager(SharedMemoryManager);
end;
Como criar um about box igual ao do windows
{Esta dica mostra como usar o About box do windows na sua aplicação, sem a necessidade de criar um novo form.
Declare ShellApi no uses clause da unit.}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellAbout( Application.Handle, //Handle da sua aplicação
PChar( 'Nome da sua aplicação' ),
PChar( 'Comentários sobre a sua aplicação' ),
Application.Icon.Handle ); //icone que aparece na janela, neste caso o próprio da aplicação
end;
Declare ShellApi no uses clause da unit.}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellAbout( Application.Handle, //Handle da sua aplicação
PChar( 'Nome da sua aplicação' ),
PChar( 'Comentários sobre a sua aplicação' ),
Application.Icon.Handle ); //icone que aparece na janela, neste caso o próprio da aplicação
end;
Marcadores:
Como criar um about box igual ao do windows
Abrindo o browser ou e-mail ao clicar num label ou timage
public
{ Public declarations }
procedure Executa(const aAdress: String);
//Declare a biblioteca ShellAPI na cláusula uses do Form
procedure TForm1.Executa(const aAdress: String);
var
buffer: String;
begin
buffer := aAdress;
ShellExecute(Application.Handle, nil, PChar(buffer), nil, nil, SW_SHOWNORMAL);
end;
//Adicione o código abaixo no evento OnClick do Label1 - aqui será aberto o Outlook para o envio de e-mails
procedure TForm1.Label1Click(Sender: TObject);
begin
Executa('mailto: miguelmm3@ibest.com.br ');
end;
//Adicione o código abaixo no evento OnClick do Image1
procedure TForm1.Image1Click(Sender: TObject);
begin
Executa('http://www.miguelmm3.kit.net');
end;
{ Public declarations }
procedure Executa(const aAdress: String);
//Declare a biblioteca ShellAPI na cláusula uses do Form
procedure TForm1.Executa(const aAdress: String);
var
buffer: String;
begin
buffer := aAdress;
ShellExecute(Application.Handle, nil, PChar(buffer), nil, nil, SW_SHOWNORMAL);
end;
//Adicione o código abaixo no evento OnClick do Label1 - aqui será aberto o Outlook para o envio de e-mails
procedure TForm1.Label1Click(Sender: TObject);
begin
Executa('mailto: miguelmm3@ibest.com.br ');
end;
//Adicione o código abaixo no evento OnClick do Image1
procedure TForm1.Image1Click(Sender: TObject);
begin
Executa('http://www.miguelmm3.kit.net');
end;
Mostrar a janela de diálogo de propriedades do windows
// Precisa declarar a shellapi no projeto
{ Aqui está um código que mostra a janela de diálogo de propriedades do Windows.
Usage:
ShowProperties(Application.Handle, 'c:autoexec.bat') }
function ShowProperties (hWndOwner: HWND; const FileName: string) : boolean;
var
Info: TShellExecuteInfo;
Handle : THandle;
begin
{ Fill in the SHELLEXECUTEINFO structure }
with Info do
begin
cbSize := SizeOf(Info);
fMask := SEE_MASK_NOCLOSEPROCESS or
SEE_MASK_INVOKEIDLIST or
SEE_MASK_FLAG_NO_UI;
wnd := hWndOwner;
lpVerb := 'properties';
lpFile := pChar(FileName);
lpParameters := nil;
lpDirectory := nil;
nShow := 0;
hInstApp := 0;
lpIDList := nil;
end;
{ Call Windows to display the properties dialog. }
Result := ShellExecuteEx(@Info);
end;
{ Aqui está um código que mostra a janela de diálogo de propriedades do Windows.
Usage:
ShowProperties(Application.Handle, 'c:autoexec.bat') }
function ShowProperties (hWndOwner: HWND; const FileName: string) : boolean;
var
Info: TShellExecuteInfo;
Handle : THandle;
begin
{ Fill in the SHELLEXECUTEINFO structure }
with Info do
begin
cbSize := SizeOf(Info);
fMask := SEE_MASK_NOCLOSEPROCESS or
SEE_MASK_INVOKEIDLIST or
SEE_MASK_FLAG_NO_UI;
wnd := hWndOwner;
lpVerb := 'properties';
lpFile := pChar(FileName);
lpParameters := nil;
lpDirectory := nil;
nShow := 0;
hInstApp := 0;
lpIDList := nil;
end;
{ Call Windows to display the properties dialog. }
Result := ShellExecuteEx(@Info);
end;
Criar um documento no word.
Uses ComObj
procedure TForm1.Button1Click(Sender: TObject);
var
MSWord: Variant;
begin
MSWord:= CreateOleObject ('Word.Basic');
MSWord.AppShow;//mostra o word
MSWord.FileNew;//inicia um novo documento
MSWord.insert('Contrato de Locação'); //Escreve algo
MSWord.insert(#13+'Contrato de Locação');//Pula uma linha e escreve
MSWord.FontSize(24);//muda o tamanho da fonte
MSWord.italic;//coloca italico
MSWord.bold;//coloca negrito
MSWord.underline;//sublina
MSWord.insert(#13+'Contrato de Locação');//pula a linha e escreve novamente
MSWord.FontSize(12);//muda o tamanho da fonte
MSWord.Font('Arial');//muda a fonte usada
MSWord.underline(false);//retira o sublinhado
MSWord.italic(false);//retira o italico
MSWord.bold(false);//retira o bold
MSWord.insert(#13 +'teste');
MSWord.insert(#13+#9 +'teste');//nova linha e um TAB
MSWord.insert(#13+Table1Razao_Social.Value);//insere algo de uma tabela
MSWord.LineUp(2, 1); //seleciona uma parte do texto
MSWord.TextToTable(ConvertFrom := 2, NumColumns := 1);// monta uma tabela com o texto selecionado
MSWord.FileSaveAs('c:temptest.txt', 3); //Salva o arquivo
end;
Obs:
MSWord.JustifyPara; // alinhamento justificado
MSWord.RightPara; // alinhamento a direita
MSWord.LeftPara; // alinhamento a esquerda
MSWord.InsertPageBreak; // quebrar página
procedure TForm1.Button1Click(Sender: TObject);
var
MSWord: Variant;
begin
MSWord:= CreateOleObject ('Word.Basic');
MSWord.AppShow;//mostra o word
MSWord.FileNew;//inicia um novo documento
MSWord.insert('Contrato de Locação'); //Escreve algo
MSWord.insert(#13+'Contrato de Locação');//Pula uma linha e escreve
MSWord.FontSize(24);//muda o tamanho da fonte
MSWord.italic;//coloca italico
MSWord.bold;//coloca negrito
MSWord.underline;//sublina
MSWord.insert(#13+'Contrato de Locação');//pula a linha e escreve novamente
MSWord.FontSize(12);//muda o tamanho da fonte
MSWord.Font('Arial');//muda a fonte usada
MSWord.underline(false);//retira o sublinhado
MSWord.italic(false);//retira o italico
MSWord.bold(false);//retira o bold
MSWord.insert(#13 +'teste');
MSWord.insert(#13+#9 +'teste');//nova linha e um TAB
MSWord.insert(#13+Table1Razao_Social.Value);//insere algo de uma tabela
MSWord.LineUp(2, 1); //seleciona uma parte do texto
MSWord.TextToTable(ConvertFrom := 2, NumColumns := 1);// monta uma tabela com o texto selecionado
MSWord.FileSaveAs('c:temptest.txt', 3); //Salva o arquivo
end;
Obs:
MSWord.JustifyPara; // alinhamento justificado
MSWord.RightPara; // alinhamento a direita
MSWord.LeftPara; // alinhamento a esquerda
MSWord.InsertPageBreak; // quebrar página
como saber se a impressora atual possui determinada fonte
//Inclua na seção uses: Printers
{ Coloque este código no OnClick de um botão }
with Printer.Fonts do
if IndexOf('Draft 10cpi') >= 0 then
ShowMessage('A impressora possui a fonte.')
else
ShowMessage('A impressora NÃO possui a fonte.');
{ Observações
Isto pode ser útil quando queremos usar fonte da impressora quando for uma matricial ou fonte do Windows quando for uma Jato de Tinta ou Laser. }
{ Coloque este código no OnClick de um botão }
with Printer.Fonts do
if IndexOf('Draft 10cpi') >= 0 then
ShowMessage('A impressora possui a fonte.')
else
ShowMessage('A impressora NÃO possui a fonte.');
{ Observações
Isto pode ser útil quando queremos usar fonte da impressora quando for uma matricial ou fonte do Windows quando for uma Jato de Tinta ou Laser. }
Usando um for select dentro da storedprocedure no firebird/interbase
Create procedure SP_RETORNO(PCOD INTEGER)
returns (COD INTEGER, NOME VARCHAR(30),
VALOR NUMERIC(15,4))
as
begin
for select CODIGO, NOME from CLIENTES
where CODIGO = :PCOD
into :COD, :NOME do
begin
select VALOR from VALORES
where CODIGO = :COD
into :VALOR;
if ((VALOR IS NULL) or (VALOR = 0)) then
VALOR = 1;
suspend;
end
end;
{Para visualizar os registros retornados desta StoredProcedure podemos fazer um Select dentro da Query,
ficando a instrução da seguinte forma: }
select * from SP_RETORNO( 10 )
returns (COD INTEGER, NOME VARCHAR(30),
VALOR NUMERIC(15,4))
as
begin
for select CODIGO, NOME from CLIENTES
where CODIGO = :PCOD
into :COD, :NOME do
begin
select VALOR from VALORES
where CODIGO = :COD
into :VALOR;
if ((VALOR IS NULL) or (VALOR = 0)) then
VALOR = 1;
suspend;
end
end;
{Para visualizar os registros retornados desta StoredProcedure podemos fazer um Select dentro da Query,
ficando a instrução da seguinte forma: }
select * from SP_RETORNO( 10 )
Criando drivers odbc através do delphi
Unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure CreateODBCDriver(Const cDSNName,cExclusive,cDescription,cDataBase,cDefaultPath,cConfigSql,cDriver: string);
type
TSQLConfigDataSource = function( hwndParent: HWND; fRequest: WORD; lpszDriver: LPCSTR; lpszAttributes: LPCSTR ): BOOL; stdcall;
const
ODBC_ADD_DSN = 1; // Adiciona uma fonte de dados (data source)
ODBC_CONFIG_DSN = 2; // Configura a fonte de dados (data source)
ODBC_REMOVE_DSN = 3; // Remove a fonte de dados (data source)
ODBC_ADD_SYS_DSN = 4; // Adiciona um DSN no sistema
ODBC_CONFIG_SYS_DSN = 5; // Configura o DSN do sistema
ODBC_REMOVE_SYS_DSN = 6; // Remove o DSN do sistema
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
ModName: array[0..MAX_PATH] of Char;
srInfo : TSearchRec;
begin
Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
strHome := ModName;
while ( strHome[length(strHome)] <> '' ) do
Delete( strHome, length(strHome), 1 );
strFile := strHome + cDatabase; // Teste com access (Axes = Access)
hLib := LoadLibrary( pChar(cDefaultPath) ); // carregando para o diretório padrão
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib, pChar(cConfigSql) );
if( @pFn <> nil ) then
begin
strDriver := cDriver;
strAttr := Format( 'DSN=%s'+#0+ 'DBQ=%s'+#0+'Exclusive=%s'+#0+'Description=%s'+#0+#0,[cDSNName,strFile,cExclusive,cDescription] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then
ShowMessage( 'Falha ao tentar criar o DSN (Data source).' );
if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
begin
strDriver := cDriver;
strAttr := Format( 'DSN=%s'+#0+'DBQ=%s'+#0+'Exclusive=%s'+#0+'Description= %s'+#0+#0+'CREATE_DB="%s"'#0+#0, [cDSNName,strFile,cExclusive,cDescription,strFile]);
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then
ShowMessage( 'Falha ao tentar criar o banco de dados' );
end;
FindClose( srInfo );
end;
FreeLibrary( hLib );
if fResult then
ShowMessage( 'Banco de dados criado.' );
end
else
begin
ShowMessage( 'o sistema não pode carregar a biblioteca ODBCCP32.DLL' );
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateOdbcDriver('Cludelphi DSN','1','clubedelphi','clubedelphi.MDB','ODBCCP32','SQLConfigDataSource','Microsoft Access Driver (*.mdb)');
end;
end.
{ Concluções: Com esta dica você poderá criar drivers ODBC em tempo de execução, softwares de instalação, economizando tempo e deixando suas aplicações mais dinâmicas. }
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure CreateODBCDriver(Const cDSNName,cExclusive,cDescription,cDataBase,cDefaultPath,cConfigSql,cDriver: string);
type
TSQLConfigDataSource = function( hwndParent: HWND; fRequest: WORD; lpszDriver: LPCSTR; lpszAttributes: LPCSTR ): BOOL; stdcall;
const
ODBC_ADD_DSN = 1; // Adiciona uma fonte de dados (data source)
ODBC_CONFIG_DSN = 2; // Configura a fonte de dados (data source)
ODBC_REMOVE_DSN = 3; // Remove a fonte de dados (data source)
ODBC_ADD_SYS_DSN = 4; // Adiciona um DSN no sistema
ODBC_CONFIG_SYS_DSN = 5; // Configura o DSN do sistema
ODBC_REMOVE_SYS_DSN = 6; // Remove o DSN do sistema
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
ModName: array[0..MAX_PATH] of Char;
srInfo : TSearchRec;
begin
Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
strHome := ModName;
while ( strHome[length(strHome)] <> '' ) do
Delete( strHome, length(strHome), 1 );
strFile := strHome + cDatabase; // Teste com access (Axes = Access)
hLib := LoadLibrary( pChar(cDefaultPath) ); // carregando para o diretório padrão
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib, pChar(cConfigSql) );
if( @pFn <> nil ) then
begin
strDriver := cDriver;
strAttr := Format( 'DSN=%s'+#0+ 'DBQ=%s'+#0+'Exclusive=%s'+#0+'Description=%s'+#0+#0,[cDSNName,strFile,cExclusive,cDescription] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then
ShowMessage( 'Falha ao tentar criar o DSN (Data source).' );
if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
begin
strDriver := cDriver;
strAttr := Format( 'DSN=%s'+#0+'DBQ=%s'+#0+'Exclusive=%s'+#0+'Description= %s'+#0+#0+'CREATE_DB="%s"'#0+#0, [cDSNName,strFile,cExclusive,cDescription,strFile]);
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then
ShowMessage( 'Falha ao tentar criar o banco de dados' );
end;
FindClose( srInfo );
end;
FreeLibrary( hLib );
if fResult then
ShowMessage( 'Banco de dados criado.' );
end
else
begin
ShowMessage( 'o sistema não pode carregar a biblioteca ODBCCP32.DLL' );
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateOdbcDriver('Cludelphi DSN','1','clubedelphi','clubedelphi.MDB','ODBCCP32','SQLConfigDataSource','Microsoft Access Driver (*.mdb)');
end;
end.
{ Concluções: Com esta dica você poderá criar drivers ODBC em tempo de execução, softwares de instalação, economizando tempo e deixando suas aplicações mais dinâmicas. }
Marcadores:
Criando drivers odbc através do delphi
Utilizando captions em componentes dbnavigator
Declare a seguinte classe:
type
TDBNewNavigator = class ( TDBNavigator );
uses Buttons;
procedure TForm1.FormCreate(Sender: TObject);
var
B: TNavigateBtn;
begin
for B := Low ( TNavigateBtn ) to High ( TNavigateBtn ) do
with TDBNewNavigator ( DBNavigator1 ).Buttons [ B ] do
begin
Case Index of
nbFirst : Caption := 'Primeiro';
nbPrior : Caption := 'Anterior';
nbNext : Caption := 'Próximo';
nbLast : Caption := 'Último';
nbInsert : Caption := 'Novo';
nbDelete : Caption := 'Excluir';
nbEdit : Caption := 'Editar';
nbPost : Caption := 'Salvar';
nbCancel : Caption := 'Cancelar';
nbRefresh : Caption := 'Atualizar';
End;
Layout := blGlyphTop;
Hint := Caption;
ShowHint := True;
end;
end;
type
TDBNewNavigator = class ( TDBNavigator );
uses Buttons;
procedure TForm1.FormCreate(Sender: TObject);
var
B: TNavigateBtn;
begin
for B := Low ( TNavigateBtn ) to High ( TNavigateBtn ) do
with TDBNewNavigator ( DBNavigator1 ).Buttons [ B ] do
begin
Case Index of
nbFirst : Caption := 'Primeiro';
nbPrior : Caption := 'Anterior';
nbNext : Caption := 'Próximo';
nbLast : Caption := 'Último';
nbInsert : Caption := 'Novo';
nbDelete : Caption := 'Excluir';
nbEdit : Caption := 'Editar';
nbPost : Caption := 'Salvar';
nbCancel : Caption := 'Cancelar';
nbRefresh : Caption := 'Atualizar';
End;
Layout := blGlyphTop;
Hint := Caption;
ShowHint := True;
end;
end;
Marcadores:
Utilizando captions em componentes dbnavigator
Descobrindo url's visitadas
//Saiba todos os endereços da internet que você visitou:
uses Registry;
procedure ShowTypedUrls(Urls: TStrings);
var
Reg: TRegistry;
S: TStringList;
i: Integer;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('SoftwareMicrosoftInternet ExplorerTypedURLs', False) then
begin
S := TStringList.Create;
try
reg.GetValueNames(S);
for i := 0 to S.Count - 1 do
begin
Urls.Add(reg.ReadString(S.Strings[i]));
end;
finally
S.Free;
end;
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowTypedUrls(ListBox1.Items);
end;
uses Registry;
procedure ShowTypedUrls(Urls: TStrings);
var
Reg: TRegistry;
S: TStringList;
i: Integer;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('SoftwareMicrosoftInternet ExplorerTypedURLs', False) then
begin
S := TStringList.Create;
try
reg.GetValueNames(S);
for i := 0 to S.Count - 1 do
begin
Urls.Add(reg.ReadString(S.Strings[i]));
end;
finally
S.Free;
end;
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowTypedUrls(ListBox1.Items);
end;
Criando arrays ramdomicos
Var
a: array[0..4] of integer;
i: Integer;
begin
for i:= 0 to 4 do
begin
a[i]:= random(99) + 1;
end;
end;
// obs: o 99 no random é o intervalo a ser sorteado
a: array[0..4] of integer;
i: Integer;
begin
for i:= 0 to 4 do
begin
a[i]:= random(99) + 1;
end;
end;
// obs: o 99 no random é o intervalo a ser sorteado
Como clonar formulários em tempo de execução
procedure TForm1.Button1Click(Sender: TObject);
var
ms: TMemoryStream;
newform: TForm1;
begin
ms := TMemoryStream.Create;
try
ms.WriteComponent(Form1);
newform := TForm1.CreateNew(Application);
ms.Position := 0;
ms.ReadComponent(newform);
newform.Show;
finally
ms.Free
end;
end;
var
ms: TMemoryStream;
newform: TForm1;
begin
ms := TMemoryStream.Create;
try
ms.WriteComponent(Form1);
newform := TForm1.CreateNew(Application);
ms.Position := 0;
ms.ReadComponent(newform);
newform.Show;
finally
ms.Free
end;
end;
Marcadores:
Como clonar formulários em tempo de execução
Criando um banco de dados ms-access via programação
//Isso é possível utilizando uma API chamada SQLConfigDataSource() que está disponível na ODBCCP32.DLL.
var
Form1: TForm1;
{ constante utilizada na API }
const
ODBC_ADD_DSN = 1;
{ declara a API fazendo referencia a DLL }
function SQLConfigDataSource( hwndParent: HWND; fRequest: WORD; lpszDriver: LPCSTR; lpszAttributes: LPCSTR): BOOL; stdcall; external ‘ODBCCP32.DLL’;
implementation
{$R *.DFM}
procedure CreateDatabase(DbName: String);
begin
SQLConfigDataSource(0, ODBC_ADD_DSN, ‘Microsoft Access Driver (*.mdb)’, PChar (‘CREATE_DB=’ + DbName + #0));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if FileExists(‘c:Teste.mdb’) then
DeleteFile(‘c:Teste.mdb’);
try
CreateDatabase(‘c:Teste.mdb’);
ShowMessage(‘MDB criado com sucesso!’);
except
ShowMessage(‘Problemas ao criar o MDB!’);
end;
end;
end.
var
Form1: TForm1;
{ constante utilizada na API }
const
ODBC_ADD_DSN = 1;
{ declara a API fazendo referencia a DLL }
function SQLConfigDataSource( hwndParent: HWND; fRequest: WORD; lpszDriver: LPCSTR; lpszAttributes: LPCSTR): BOOL; stdcall; external ‘ODBCCP32.DLL’;
implementation
{$R *.DFM}
procedure CreateDatabase(DbName: String);
begin
SQLConfigDataSource(0, ODBC_ADD_DSN, ‘Microsoft Access Driver (*.mdb)’, PChar (‘CREATE_DB=’ + DbName + #0));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if FileExists(‘c:Teste.mdb’) then
DeleteFile(‘c:Teste.mdb’);
try
CreateDatabase(‘c:Teste.mdb’);
ShowMessage(‘MDB criado com sucesso!’);
except
ShowMessage(‘Problemas ao criar o MDB!’);
end;
end;
end.
Como obter fatorial de um número
Ex: Fatorial(5) = 120.
function Fatorial(Valor: Integer):LongInt;
begin
{ Verifica se o valor é inválido }
if Valor < 1 then
raise Exception.Create(‘Valor inválido para ser fatorado!’);
if Valor = 1 then
Result := 1
else
{ Chamada recursiva }
Result := Valor * Fatorial(Valor - 1);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
{ Teste o valor }
Edit1.Text := IntToStr(Fatorial(SpinEdit1.Value));
end;
function Fatorial(Valor: Integer):LongInt;
begin
{ Verifica se o valor é inválido }
if Valor < 1 then
raise Exception.Create(‘Valor inválido para ser fatorado!’);
if Valor = 1 then
Result := 1
else
{ Chamada recursiva }
Result := Valor * Fatorial(Valor - 1);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
{ Teste o valor }
Edit1.Text := IntToStr(Fatorial(SpinEdit1.Value));
end;
Acessando uma propriedade, evento, função ou procedimento privado de um objeto ancestr
Type
TControlHack = class(TControl)
Public
Property OnMouseDown;
end;
procedure TDBXGrid.MouseDown(Button: TMouseButton;ShiftState:TShiftState; X,Y:Integer);
begin
if Assigned(TControlHack(Self).OnMouseDown) then
TControlHack(Self).OnMouseDown(Self, Button, FShiftState, X,Y);
end;
Type
TCustomGridHack = class(TCustomGrid)
Public
Property Options;
end;
procedure TDBXGrid.SetRowSizingAllowed(Value:Boolean);
begin
if Value<>FRowSizingAllowed Then
begin
FRowSizingAllowed:=Value;
if FRowSizingAllowed Then
TCustomGridHack(Self).Options:=TCustomGridHack(Self).Options+[goRowSizing]
else
TCustomGridHack(Self).Options:=TCustomGridHack(Self).Options-[goRowSizing];
end
end; // SetRowSizingAllowed
TControlHack = class(TControl)
Public
Property OnMouseDown;
end;
procedure TDBXGrid.MouseDown(Button: TMouseButton;ShiftState:TShiftState; X,Y:Integer);
begin
if Assigned(TControlHack(Self).OnMouseDown) then
TControlHack(Self).OnMouseDown(Self, Button, FShiftState, X,Y);
end;
Type
TCustomGridHack = class(TCustomGrid)
Public
Property Options;
end;
procedure TDBXGrid.SetRowSizingAllowed(Value:Boolean);
begin
if Value<>FRowSizingAllowed Then
begin
FRowSizingAllowed:=Value;
if FRowSizingAllowed Then
TCustomGridHack(Self).Options:=TCustomGridHack(Self).Options+[goRowSizing]
else
TCustomGridHack(Self).Options:=TCustomGridHack(Self).Options-[goRowSizing];
end
end; // SetRowSizingAllowed
Executa o windows explorer a partir de uma pasta especificada
Function ExecExplorer(OpenAtPath: string; OpenWithExplorer, OpenAsRoot: Boolean): boolean;
// Requer a unit ShellApi
// ex: execExplorer('C:Temp', True,True);
var
s: string;
begin
if OpenWithExplorer then
begin
if OpenAsRoot then
s := ' /e,/root,"' + OpenAtPath + '"'
else
s := ' /e,"' + OpenAtPath + '"';
end
else
s := '"' + OpenAtPath + '"';
result := ShellExecute(Application.Handle,PChar('open'),PChar('explorer.exe'),PChar(s),nil,SW_NORMAL) > 32;
end;
// Requer a unit ShellApi
// ex: execExplorer('C:Temp', True,True);
var
s: string;
begin
if OpenWithExplorer then
begin
if OpenAsRoot then
s := ' /e,/root,"' + OpenAtPath + '"'
else
s := ' /e,"' + OpenAtPath + '"';
end
else
s := '"' + OpenAtPath + '"';
result := ShellExecute(Application.Handle,PChar('open'),PChar('explorer.exe'),PChar(s),nil,SW_NORMAL) > 32;
end;
Alinha um valor real, em um determinado espaço
function Alinhar(Pe_Num:Real; Pe_QtdPos:Byte; EDC :Char):string;
// EDC: C = Centralizado
// D = Direita
// E = Esquerda
//
var
I : integer;
S : string;
Num : string;
begin
if EDC = 'D' then
begin
Num := Format('%*.*n', [Pe_QtdPos, 2, Pe_Num]);
Alinhar := Num;
end;
if EDC = 'E' then
begin
Num := FormatFloat('###,###,###,##0.00',Pe_Num);
Alinhar := Num;
end;
if EDC = 'C' then
begin
Num := FormatFloat('###,###,###,##0.00',Pe_Num);
i := Pos(',',Num);
i := i + 2;
i := Pe_QtdPos - i;
i := Round( i / 2 );
i := Pe_QtdPos - i;
Num := Format('%*.*n', [i,2,Pe_Num]);
str(i,s);
Alinhar := Num ;
end;
end;
// EDC: C = Centralizado
// D = Direita
// E = Esquerda
//
var
I : integer;
S : string;
Num : string;
begin
if EDC = 'D' then
begin
Num := Format('%*.*n', [Pe_QtdPos, 2, Pe_Num]);
Alinhar := Num;
end;
if EDC = 'E' then
begin
Num := FormatFloat('###,###,###,##0.00',Pe_Num);
Alinhar := Num;
end;
if EDC = 'C' then
begin
Num := FormatFloat('###,###,###,##0.00',Pe_Num);
i := Pos(',',Num);
i := i + 2;
i := Pe_QtdPos - i;
i := Round( i / 2 );
i := Pe_QtdPos - i;
Num := Format('%*.*n', [i,2,Pe_Num]);
str(i,s);
Alinhar := Num ;
end;
end;
Marcadores:
Alinha um valor real,
em um determinado espaço
Pesquisando por parte de uma string
Procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Query1.Close;
Query1.Sql.Clear;
Query1.Sql.Add(‘Select Teste1.Codigo,Teste1.Nome’);
Query1.Sql.Add(‘From Teste1 ‘);
Query1.Sql.Add(‘Where ‘);
Query1.Sql.Add(‘(Teste1.Codigo >= :Codigo1) and’);
Query1.Sql.Add(‘(Teste1.Codigo <= :Codigo2)’);
Query1.Params[0].AsString := Edit1.Text;
Query1.Params[1].AsString := Edit2.Text;
Query1.Open;
end;
begin
Query1.Close;
Query1.Sql.Clear;
Query1.Sql.Add(‘Select Teste1.Codigo,Teste1.Nome’);
Query1.Sql.Add(‘From Teste1 ‘);
Query1.Sql.Add(‘Where ‘);
Query1.Sql.Add(‘(Teste1.Codigo >= :Codigo1) and’);
Query1.Sql.Add(‘(Teste1.Codigo <= :Codigo2)’);
Query1.Params[0].AsString := Edit1.Text;
Query1.Params[1].AsString := Edit2.Text;
Query1.Open;
end;
Marcadores:
Pesquisando por parte de uma string
Abreviar nomes
Function AbreviarNome(Nome: String): String;
var
Nomes: array[1..20] of string;
i, TotalNomes: Integer;
begin
Nome := Trim(Nome);
Result := Nome;
Nome := Nome + #32;
i := Pos(#32, Nome);
if i > 0 then
begin
TotalNomes := 0;
while i > 0 do
begin
Inc(TotalNomes);
Nomes[TotalNomes] := Copy(Nome, 1, i - 1);
Delete(Nome, 1, i);
i := Pos(#32, Nome);
end;
if TotalNomes > 2 then begin for i := 2 to TotalNomes - 1 do begin if Length(Nomes[i]) > 3 then
Nomes[i] := Nomes[i][1] + '.';
End;
Result := '';
for i := 1 to TotalNomes do
Result := Result + Trim(Nomes[i]) + #32;
Result := Trim(Result);
end;
end;
end;
var
Nomes: array[1..20] of string;
i, TotalNomes: Integer;
begin
Nome := Trim(Nome);
Result := Nome;
Nome := Nome + #32;
i := Pos(#32, Nome);
if i > 0 then
begin
TotalNomes := 0;
while i > 0 do
begin
Inc(TotalNomes);
Nomes[TotalNomes] := Copy(Nome, 1, i - 1);
Delete(Nome, 1, i);
i := Pos(#32, Nome);
end;
if TotalNomes > 2 then begin for i := 2 to TotalNomes - 1 do begin if Length(Nomes[i]) > 3 then
Nomes[i] := Nomes[i][1] + '.';
End;
Result := '';
for i := 1 to TotalNomes do
Result := Result + Trim(Nomes[i]) + #32;
Result := Trim(Result);
end;
end;
end;
Carregando imagem para o rave (run-time).
Procedure CarregaImagemRave(NomeProjeto: TRvProject; NomeRelatorio, NomeImagem, PathImagem: String);
var
MyPage : TRavePage;
MyPicture : TRaveBitmap;
begin
NomeProjeto.Open;
with NomeProjeto.ProjMan do
begin
MyPage := FindRaveComponent(NomeRelatorio,nil) as TRavePage;
MyPicture := FindRaveComponent(NomeImagem,MyPage) as TRaveBitmap;
MyPicture.Image.LoadFromFile(PathImagem);
end;
end;
var
MyPage : TRavePage;
MyPicture : TRaveBitmap;
begin
NomeProjeto.Open;
with NomeProjeto.ProjMan do
begin
MyPage := FindRaveComponent(NomeRelatorio,nil) as TRavePage;
MyPicture := FindRaveComponent(NomeImagem,MyPage) as TRaveBitmap;
MyPicture.Image.LoadFromFile(PathImagem);
end;
end;
Marcadores:
Carregando imagem para o rave (run-time).
Como mostrar as fontes truetype instaladas no window
{Inclua no seu form um componente Button, um componente ListBox e um componente Label.}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
// Evento OnClick do componente ListBox
procedure TForm1.ListBox1Click(Sender: TObject);
begin
// A linha abaixo atribui a propriedade Caption do componente Label o nome da fonte selecionada no componente ListBox
Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];
// A linha abaixo muda a fonte de letra de acordo com a fonte selecionada no componente Listbox
Label1.Font.Name := ListBox1.Items[ListBox1.ItemIndex];
end;
// Evento OnClick do componente Button
procedure TForm1.Button1Click(Sender: TObject);
begin
// Carrega as fontes instaladas no Windows para o componente ListBox
ListBox1.Items := Screen.Fonts;
end;
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
// Evento OnClick do componente ListBox
procedure TForm1.ListBox1Click(Sender: TObject);
begin
// A linha abaixo atribui a propriedade Caption do componente Label o nome da fonte selecionada no componente ListBox
Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];
// A linha abaixo muda a fonte de letra de acordo com a fonte selecionada no componente Listbox
Label1.Font.Name := ListBox1.Items[ListBox1.ItemIndex];
end;
// Evento OnClick do componente Button
procedure TForm1.Button1Click(Sender: TObject);
begin
// Carrega as fontes instaladas no Windows para o componente ListBox
ListBox1.Items := Screen.Fonts;
end;
Extensões de arquivos paradox
{.DB - Tabela Paradox
.FAM - Lista de arquivos relacionados
.LCK - Arquivo de Lock
.MB - Campos Blobs
.PX - Indice Primário
.TV - Guarda as configurações da tabela (não usado pelo BDE)
.VAL - Valid checks e integridade referencial.
.Xnn - índice secundário de campo único
.Ynn - índice secundário de campo único.
.XGn - índice secundário composto
.YGn - índice secundário composto}
.FAM - Lista de arquivos relacionados
.LCK - Arquivo de Lock
.MB - Campos Blobs
.PX - Indice Primário
.TV - Guarda as configurações da tabela (não usado pelo BDE)
.VAL - Valid checks e integridade referencial.
.Xnn - índice secundário de campo único
.Ynn - índice secundário de campo único.
.XGn - índice secundário composto
.YGn - índice secundário composto}
Verificando qual o idioma do windows
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
TheWindow: HWND;
Lingua: array[0..255] of char;
begin
VerLanguageName(GetSystemDefaultLangID, Lingua, 255);
{ Verifica se o Windows é Português ou Brasileiro }
if Lingua <> ‘Português (Brasileiro)’ then
TheWindow:=FindWindow(nil,’Calculadora’)
else if Lingua <> ‘English (United States)’ then
TheWindow:=FindWindow(nil,’Calculator’)
{ Procura a janela da calculadora }
if TheWindow <> 0 then
begin
// Chama calculadora se já estiver carregada
SetForegroundWindow(TheWindow);
ShowWindow(TheWindow, SW_RESTORE);
end
else
// Carrega calculadora se estiver fechada
ShellExecute(Handle, ‘Open’, ‘Calc.exe’, nil, ‘c:windows’, sw_show);
end;
var
TheWindow: HWND;
Lingua: array[0..255] of char;
begin
VerLanguageName(GetSystemDefaultLangID, Lingua, 255);
{ Verifica se o Windows é Português ou Brasileiro }
if Lingua <> ‘Português (Brasileiro)’ then
TheWindow:=FindWindow(nil,’Calculadora’)
else if Lingua <> ‘English (United States)’ then
TheWindow:=FindWindow(nil,’Calculator’)
{ Procura a janela da calculadora }
if TheWindow <> 0 then
begin
// Chama calculadora se já estiver carregada
SetForegroundWindow(TheWindow);
ShowWindow(TheWindow, SW_RESTORE);
end
else
// Carrega calculadora se estiver fechada
ShellExecute(Handle, ‘Open’, ‘Calc.exe’, nil, ‘c:windows’, sw_show);
end;
Marcadores:
Verificando qual o idioma do windows
Como adicionar campos fisicamente em uma tabela paradox via programação
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBTables, BDE, DBCtrls, Menus, ComCtrls,
Buttons ;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
Table1: TTable;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
type
ChangeRec = packed record
szName: DBINAME;
iType: Word;
iSubType: Word;
iLength: Word;
iPrecision: Byte;
end;
var
MyChangeRec: ChangeRec;
procedure AddField(Table: TTable; NewField: ChangeRec);
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
MyChangeRec.szName := ‘NovoCampo’;
MyChangeRec.iType := fldPDXCHAR;
MyChangeRec.iSubType:=0;
MyChangeRec.iLength := 45;
MyChangeRec.iPrecision := 0;
Table1.Close;
Table1.Exclusive := True;
Table1.Open;
AddField(Table1, MyChangeRec);
Table1.Close;
Table1.Exclusive := False;
Table1.Open;
end;
procedure AddField(Table: TTable; NewField: ChangeRec);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
pFlds: pFLDDesc;
pOp: pCROpType;
B: byte;
begin
if Table.Active = False then
raise EDatabaseError.Create(‘A tabela precisa estar aberta’);
if Table.Exclusive = False then
raise EDatabaseError.Create(‘A tabela precisa estar aberta em modo Exclusivo’);
Check(DbiSetProp(hDBIObj(Table.Handle), curxltMODE, integer(xltNONE)));
Check(DbiGetCursorProps(Table.Handle, Props));
pFlds := AllocMem((Table.FieldCount + 1) * sizeof(FLDDesc));
FillChar(pFlds^, (Table.FieldCount + 1) * sizeof(FLDDesc), 0);
Check(DbiGetFieldDescs(Table.handle, pFlds));
for B := 1 to Table.FieldCount do begin
pFlds^.iFldNum := B;
Inc(pFlds, 1);
end;
try
StrCopy(pFlds^.szName, NewField.szName);
pFlds^.iFldType := NewField.iType;
pFlds^.iSubType := NewField.iSubType;
pFlds^.iUnits1 := NewField.iLength;
pFlds^.iUnits2 := NewField.iPrecision;
pFlds^.iFldNum := Table.FieldCount + 1;
finally
Dec(pFlds, Table.FieldCount);
end;
pOp := AllocMem((Table.FieldCount + 1) * sizeof(CROpType));
Inc(pOp, Table.FieldCount);
pOp^ := crADD;
Dec(pOp, Table.FieldCount);
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table’s cursor handle...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Close the table so the restructure can complete...
TableDesc.iFldCount := Table.FieldCount + 1;
Tabledesc.pfldDesc := pFlds;
TableDesc.pecrFldOp := pOp;
Table.Close;
// Call DbiDoRestructure...
try
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, FALSE));
finally
FreeMem(pFlds);
FreeMem(pOp);
Table.Open;
end;
end;
{ ******* Tipos dos campos a ser declarado no iType, *********
******* Veja exemplo ... MyChangeRec.iType := fldPDXCHAR *********
Tipos fisicos do Paradox Tipos fisicos do dBase e FoxPro
fldPDXCHAR fldDBCHAR
fldPDXNUM fldDBNUM
fldPDXMONEY fldDBMEMO
fldPDXDATE fldDBBOOL
fldPDXSHORT fldDBDATE
fldPDXMEMO fldDBFLOAT
fldPDXBINARYBLOB fldDBLOCK (dBASE only)
fldPDXFMTMEMO fldDBBINARY (dBASE only)
fldPDXOLEBLOB fldDBOLEBLOB
fldPDXGRAPHIC fldDBBYTES
fldPDXBLOB fldDBLONG (dBASE 7.0 table format only)
fldPDXLONG fldDBDATETIME (dBASE 7.0 table format only)
fldPDXTIME fldDBDOUBLE (dBASE 7.0 table format only)
fldPDXDATETIME fldDBAUTINC (dBASE 7.0 table format only)
fldPDXBOOL
fldPDXAUTOINC
fldPDXBYTES
fldPDXBCD
}
end.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBTables, BDE, DBCtrls, Menus, ComCtrls,
Buttons ;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
Table1: TTable;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
type
ChangeRec = packed record
szName: DBINAME;
iType: Word;
iSubType: Word;
iLength: Word;
iPrecision: Byte;
end;
var
MyChangeRec: ChangeRec;
procedure AddField(Table: TTable; NewField: ChangeRec);
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
MyChangeRec.szName := ‘NovoCampo’;
MyChangeRec.iType := fldPDXCHAR;
MyChangeRec.iSubType:=0;
MyChangeRec.iLength := 45;
MyChangeRec.iPrecision := 0;
Table1.Close;
Table1.Exclusive := True;
Table1.Open;
AddField(Table1, MyChangeRec);
Table1.Close;
Table1.Exclusive := False;
Table1.Open;
end;
procedure AddField(Table: TTable; NewField: ChangeRec);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
pFlds: pFLDDesc;
pOp: pCROpType;
B: byte;
begin
if Table.Active = False then
raise EDatabaseError.Create(‘A tabela precisa estar aberta’);
if Table.Exclusive = False then
raise EDatabaseError.Create(‘A tabela precisa estar aberta em modo Exclusivo’);
Check(DbiSetProp(hDBIObj(Table.Handle), curxltMODE, integer(xltNONE)));
Check(DbiGetCursorProps(Table.Handle, Props));
pFlds := AllocMem((Table.FieldCount + 1) * sizeof(FLDDesc));
FillChar(pFlds^, (Table.FieldCount + 1) * sizeof(FLDDesc), 0);
Check(DbiGetFieldDescs(Table.handle, pFlds));
for B := 1 to Table.FieldCount do begin
pFlds^.iFldNum := B;
Inc(pFlds, 1);
end;
try
StrCopy(pFlds^.szName, NewField.szName);
pFlds^.iFldType := NewField.iType;
pFlds^.iSubType := NewField.iSubType;
pFlds^.iUnits1 := NewField.iLength;
pFlds^.iUnits2 := NewField.iPrecision;
pFlds^.iFldNum := Table.FieldCount + 1;
finally
Dec(pFlds, Table.FieldCount);
end;
pOp := AllocMem((Table.FieldCount + 1) * sizeof(CROpType));
Inc(pOp, Table.FieldCount);
pOp^ := crADD;
Dec(pOp, Table.FieldCount);
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table’s cursor handle...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Close the table so the restructure can complete...
TableDesc.iFldCount := Table.FieldCount + 1;
Tabledesc.pfldDesc := pFlds;
TableDesc.pecrFldOp := pOp;
Table.Close;
// Call DbiDoRestructure...
try
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, FALSE));
finally
FreeMem(pFlds);
FreeMem(pOp);
Table.Open;
end;
end;
{ ******* Tipos dos campos a ser declarado no iType, *********
******* Veja exemplo ... MyChangeRec.iType := fldPDXCHAR *********
Tipos fisicos do Paradox Tipos fisicos do dBase e FoxPro
fldPDXCHAR fldDBCHAR
fldPDXNUM fldDBNUM
fldPDXMONEY fldDBMEMO
fldPDXDATE fldDBBOOL
fldPDXSHORT fldDBDATE
fldPDXMEMO fldDBFLOAT
fldPDXBINARYBLOB fldDBLOCK (dBASE only)
fldPDXFMTMEMO fldDBBINARY (dBASE only)
fldPDXOLEBLOB fldDBOLEBLOB
fldPDXGRAPHIC fldDBBYTES
fldPDXBLOB fldDBLONG (dBASE 7.0 table format only)
fldPDXLONG fldDBDATETIME (dBASE 7.0 table format only)
fldPDXTIME fldDBDOUBLE (dBASE 7.0 table format only)
fldPDXDATETIME fldDBAUTINC (dBASE 7.0 table format only)
fldPDXBOOL
fldPDXAUTOINC
fldPDXBYTES
fldPDXBCD
}
end.
trabalhando com vários registros no dbgrid.
{Verificando quais os registros que estão selecionados no componente DBGrid. Primeiro altere a propriedade dgMultiSelect que faz parte da propriedade Options para True. }
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Db, DBTables, Grids, DBGrids;
{ Coloque um componente TBitBtn e no evento Onclick do mesmo coloque o código abaixo: }
// Evento OnClick do componente BitBtn
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Table1.First;
While not Table1.Eof do
begin
if DBGrid1.SelectedRows.IndexOf(Table1.BookMark) >= 0 then
ShowMessage(‘Registro selecionado’);
Table1.Next;
end;
end;
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Db, DBTables, Grids, DBGrids;
{ Coloque um componente TBitBtn e no evento Onclick do mesmo coloque o código abaixo: }
// Evento OnClick do componente BitBtn
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Table1.First;
While not Table1.Eof do
begin
if DBGrid1.SelectedRows.IndexOf(Table1.BookMark) >= 0 then
ShowMessage(‘Registro selecionado’);
Table1.Next;
end;
end;
Marcadores:
trabalhando com vários registros no dbgrid.
Como verificar se uma porta serial está em uso.
//Usando APIs do Windows, veja abaixo:
var
portHandle: Integer;
begin
portHandle := 0;
portHandle := CreateFile(Pchar(ComboCOM.Text), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if portHandle > 0 then
ShowMessage(‘Porta em uso!’)
else
raise Exception.Create
(‘Não consegui abrir a porta!’);
end;
var
portHandle: Integer;
begin
portHandle := 0;
portHandle := CreateFile(Pchar(ComboCOM.Text), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if portHandle > 0 then
ShowMessage(‘Porta em uso!’)
else
raise Exception.Create
(‘Não consegui abrir a porta!’);
end;
Marcadores:
Como verificar se uma porta serial está em uso.
Como colorir um ttreeview
Procedure TForm1.TVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
NodeRect: TRect;
begin
with TV.Canvas do
begin
NodeRect := Node.DisplayRect(True);
Font.Style := [fsBold];
Font.Color := clBlue;
Brush.Color := clAqua;
FillRect(NodeRect);
end;
end;
var
NodeRect: TRect;
begin
with TV.Canvas do
begin
NodeRect := Node.DisplayRect(True);
Font.Style := [fsBold];
Font.Color := clBlue;
Brush.Color := clAqua;
FillRect(NodeRect);
end;
end;
Rotina para retornar a hora, minutos, segundos e milisegundos.
Procedure TForm1.Button2Click(Sender: TObject);
var
Hora, Min, Sec, MSec : Word;
begin
DecodeTime(Now, Hora, Min, Sec, MSec);
Label1.Caption := FormatDateTime(‘hh:mm:ss’,Now)+ ’:’+FormatFloat(‘000’,MSec);
end;
var
Hora, Min, Sec, MSec : Word;
begin
DecodeTime(Now, Hora, Min, Sec, MSec);
Label1.Caption := FormatDateTime(‘hh:mm:ss’,Now)+ ’:’+FormatFloat(‘000’,MSec);
end;
Marcadores:
minutos,
Rotina para retornar a hora,
segundos e milisegundos.
Apagando um subdiretório
//Inclua a unit SHELLAPI na clausula uses do seu form.
procedure DeleteDir( hHandle : THandle; Const sPath : String );
var
OpStruc: TSHFileOpStruct;
FromBuffer, ToBuffer: Array[0..128] of Char;
begin
fillChar( OpStruc, Sizeof(OpStruc), 0 );
FillChar( FromBuffer, Sizeof(FromBuffer), 0 );
FillChar( ToBuffer, Sizeof(ToBuffer), 0 );
StrPCopy( FromBuffer, sPath);
With OpStruc Do
Begin
Wnd:= hHandle;
wFunc:=FO_DELETE;
pFrom:= @FromBuffer;
pTo:= @ToBuffer;
fFlags:= FOF_NOCONFIRMATION;
fAnyOperationsAborted:=False;
hNameMappings:=nil;
End;
ShFileOperation(OpStruc);
end;
//Exemplo:
procedure TForm1.Button1Click(Sender: TObject);
begin
DeleteDir( Self.Handle,'C:TESTE');
end;
procedure DeleteDir( hHandle : THandle; Const sPath : String );
var
OpStruc: TSHFileOpStruct;
FromBuffer, ToBuffer: Array[0..128] of Char;
begin
fillChar( OpStruc, Sizeof(OpStruc), 0 );
FillChar( FromBuffer, Sizeof(FromBuffer), 0 );
FillChar( ToBuffer, Sizeof(ToBuffer), 0 );
StrPCopy( FromBuffer, sPath);
With OpStruc Do
Begin
Wnd:= hHandle;
wFunc:=FO_DELETE;
pFrom:= @FromBuffer;
pTo:= @ToBuffer;
fFlags:= FOF_NOCONFIRMATION;
fAnyOperationsAborted:=False;
hNameMappings:=nil;
End;
ShFileOperation(OpStruc);
end;
//Exemplo:
procedure TForm1.Button1Click(Sender: TObject);
begin
DeleteDir( Self.Handle,'C:TESTE');
end;
Pesquisando e substituindo de uma string
procedure TForm1.FindReplace(const Enc, subs: String; Var Texto:TMemo);
Var
i, Posicao: Integer;
Linha: string;
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines[i];
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0 then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines[i]:=Linha;
end;
until Posicao = 0;
end;
end;
Procedure TForm1.Button1Click (Sender: TObject);
Begin
FindReplace(Edit1.Text,Edit2.Text, Memo1);
end;
Basta digitar no Edit1 a string que substituirá a string do Edit2. Feito isso digite qualquer coisa no Memo1.
Var
i, Posicao: Integer;
Linha: string;
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines[i];
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0 then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines[i]:=Linha;
end;
until Posicao = 0;
end;
end;
Procedure TForm1.Button1Click (Sender: TObject);
Begin
FindReplace(Edit1.Text,Edit2.Text, Memo1);
end;
Basta digitar no Edit1 a string que substituirá a string do Edit2. Feito isso digite qualquer coisa no Memo1.
Marcadores:
Pesquisando e substituindo de uma string
terça-feira, 24 de novembro de 2009
Converte um certo número de segundos em horas já formatado.
Function FormatSecsToHMS(Secs: LongInt): string;
var
Hrs, Min: Word;
begin
Hrs := Secs div 3600;
Secs := Secs mod 3600;
Min := Secs div 60;
Secs := Secs mod 60;
Result := Format('%d:%d:%d', [Hrs, Min, Secs]);
end;
p.1091
var
Hrs, Min: Word;
begin
Hrs := Secs div 3600;
Secs := Secs mod 3600;
Min := Secs div 60;
Secs := Secs mod 60;
Result := Format('%d:%d:%d', [Hrs, Min, Secs]);
end;
p.1091
Alterar a cor do ítem selecionado do tradiogroup
procedure TForm1.RadioGroup1Click(Sender: TObject);
var
i : Integer;
begin
for i := 0 to RadioGroup1.Items.Count-1 do begin
TRadioButton(RadioGroup1.Controls[i]).Font.Color := clBlack;
TRadioButton(RadioGroup1.Controls[i]).Font.Style := [];
end;
TRadioButton(RadioGroup1.Controls [RadioGroup1.ItemIndex]).Font.Color := clRed;
TRadioButton(RadioGroup1.Controls [RadioGroup1.ItemIndex]).Font.Style := [fsBold];
end;
var
i : Integer;
begin
for i := 0 to RadioGroup1.Items.Count-1 do begin
TRadioButton(RadioGroup1.Controls[i]).Font.Color := clBlack;
TRadioButton(RadioGroup1.Controls[i]).Font.Style := [];
end;
TRadioButton(RadioGroup1.Controls [RadioGroup1.ItemIndex]).Font.Color := clRed;
TRadioButton(RadioGroup1.Controls [RadioGroup1.ItemIndex]).Font.Style := [fsBold];
end;
Marcadores:
Alterar a cor do ítem selecionado do tradiogroup
copiar arquivo para memoria
Function SaveClipboardTextDataToFile( sFileTo : string ) : boolean;
var
ps1, ps2 : PChar;
dwLen : DWord;
tf : TextFile;
hData : THandle;
begin
Result := False;
with Clipboard do
begin
try
Open;
if( HasFormat( CF_TEXT ) ) then
begin
hData := GetClipboardData( CF_TEXT );
ps1 := GlobalLock( hData );
dwLen := GlobalSize( hData );
ps2 := StrAlloc( 1 + dwLen );
StrLCopy( ps2, ps1, dwLen );
GlobalUnlock( hData );
AssignFile( tf, sFileTo );
ReWrite( tf );
Write( tf, ps2 );
CloseFile( tf );
StrDispose( ps2 );
Result := True;
end;
finally
Close;
end;
end;
end;
SaveClipboardTextDataToFile( 'c:temp.txt' );
var
ps1, ps2 : PChar;
dwLen : DWord;
tf : TextFile;
hData : THandle;
begin
Result := False;
with Clipboard do
begin
try
Open;
if( HasFormat( CF_TEXT ) ) then
begin
hData := GetClipboardData( CF_TEXT );
ps1 := GlobalLock( hData );
dwLen := GlobalSize( hData );
ps2 := StrAlloc( 1 + dwLen );
StrLCopy( ps2, ps1, dwLen );
GlobalUnlock( hData );
AssignFile( tf, sFileTo );
ReWrite( tf );
Write( tf, ps2 );
CloseFile( tf );
StrDispose( ps2 );
Result := True;
end;
finally
Close;
end;
end;
end;
SaveClipboardTextDataToFile( 'c:temp.txt' );
Colocar margem em um memo
Procedure TForm1.Button1Click(Sender: TObject);
var
R : TRect;
MargenIzquierdo:integer;
MargenDerecho:integer;
begin
MargenIzquierdo:=20;
MargenDerecho:=10;
R := Memo1.ClientRect;
R.Left:=R.Left + MargenIzquierdo;
R.Top:=R.Top + 2;
R.Bottom:=R.Bottom - 2;
R.Right:=R.Right-MargenDerecho;
SendMessage(Memo1.Handle, EM_SETRECT, 0, Longint(@R));
end;
var
R : TRect;
MargenIzquierdo:integer;
MargenDerecho:integer;
begin
MargenIzquierdo:=20;
MargenDerecho:=10;
R := Memo1.ClientRect;
R.Left:=R.Left + MargenIzquierdo;
R.Top:=R.Top + 2;
R.Bottom:=R.Bottom - 2;
R.Right:=R.Right-MargenDerecho;
SendMessage(Memo1.Handle, EM_SETRECT, 0, Longint(@R));
end;
converter texto para gif.
Procedure TxtToGif (txt, FileName: String);
var
temp: TBitmap;
GIF : TGIFImage;
begin
temp:=TBitmap.Create;
try
temp.Height :=400;
temp.Width :=60;
temp.Transparent:=True;
temp.Canvas.Brush.Color:=colFondo.ColorValue;
temp.Canvas.Font.Name:=Fuente.FontName;
temp.Canvas.Font.Color:=colFuente.ColorValue;
temp.Canvas.TextOut (10,10,txt);
Imagen.Picture.Assign(nil);
GIF := TGIFImage.Create;
try
// Convert the bitmap to a GIF
GIF.Assign(Temp);
// Save the GIF
GIF.SaveToFile(FileName);
// Display the GIF
Imagen.Picture.Assign (GIF);
finally
GIF.Free;
end;
Finally
temp.Destroy;
end;
end;
var
temp: TBitmap;
GIF : TGIFImage;
begin
temp:=TBitmap.Create;
try
temp.Height :=400;
temp.Width :=60;
temp.Transparent:=True;
temp.Canvas.Brush.Color:=colFondo.ColorValue;
temp.Canvas.Font.Name:=Fuente.FontName;
temp.Canvas.Font.Color:=colFuente.ColorValue;
temp.Canvas.TextOut (10,10,txt);
Imagen.Picture.Assign(nil);
GIF := TGIFImage.Create;
try
// Convert the bitmap to a GIF
GIF.Assign(Temp);
// Save the GIF
GIF.SaveToFile(FileName);
// Display the GIF
Imagen.Picture.Assign (GIF);
finally
GIF.Free;
end;
Finally
temp.Destroy;
end;
end;
Data do servidor interbase, capturando a
{*****
* Retorna a data do servidor INTERBASE
* (Válido somente para INTERBASE)
*
* Autor: Jociel Eloy de Almeida
*
*}
FUNCTION DateOfServer(DataBaseName: String): TDateTime;
var
QryTmp: TQuery;
begin
QryTmp := TQuery.Create(nil);
with QryTmp do begin
DatabaseName := DataBaseName;
SQL.Text := 'SELECT CURRENT_DATE FROM RDB$DATABASE';
try
Open;
Result := FieldByName('CURRENT_DATE').AsDateTime;
except
Result := Date;
end;
end;
end;
* Retorna a data do servidor INTERBASE
* (Válido somente para INTERBASE)
*
* Autor: Jociel Eloy de Almeida
*
*}
FUNCTION DateOfServer(DataBaseName: String): TDateTime;
var
QryTmp: TQuery;
begin
QryTmp := TQuery.Create(nil);
with QryTmp do begin
DatabaseName := DataBaseName;
SQL.Text := 'SELECT CURRENT_DATE FROM RDB$DATABASE';
try
Open;
Result := FieldByName('CURRENT_DATE').AsDateTime;
except
Result := Date;
end;
end;
end;
Marcadores:
capturando a,
Data do servidor interbase
Como converter dbgrig em html
//Inicio do Código
function ColorToHtml(mColor: TColor): string;
begin
mColor := ColorToRGB(mColor);
Result := Format('#%.2x%.2x%.2x',
[GetRValue(mColor), GetGValue(mColor), GetBValue(mColor)]);
end; { ColorToHtml }
function StrToHtml(mStr: string; mFont: TFont = nil): string;
var
vLeft, vRight: string;
begin
Result := mStr;
Result := StringReplace(Result, '&', '&', [rfReplaceAll]);
Result := StringReplace(Result, '<', '<', [rfReplaceAll]);
Result := StringReplace(Result, '>', '>', [rfReplaceAll]);
if not Assigned(mFont) then Exit;
vLeft := Format('',
[mFont.Name, ColorToHtml(mFont.Color)]);
vRight := '';
if fsBold in mFont.Style then begin
vLeft := vLeft + '';
vRight := '' + vRight;
end;
if fsItalic in mFont.Style then begin
vLeft := vLeft + '';
vRight := '' + vRight;
end;
if fsUnderline in mFont.Style then begin
vLeft := vLeft + '';
vRight := '' + vRight;
end;
if fsStrikeOut in mFont.Style then begin
vLeft := vLeft + '';
vRight := '' + vRight;
end;
Result := vLeft + Result + vRight;
end; { StrToHtml }
function DBGridToHtmlTable(mDBGrid: TDBGrid; mStrings: TStrings;
mCaption: TCaption = ''): Boolean;
const
cAlignText: array[TAlignment] of string = ('LEFT', 'RIGHT', 'CENTER');
var
vColFormat: string;
vColText: string;
vAllWidth: Integer;
vWidths: array of Integer;
vBookmark: string;
I, J: Integer;
begin
Result := False;
if not Assigned(mStrings) then Exit;
if not Assigned(mDBGrid) then Exit;
if not Assigned(mDBGrid.DataSource) then Exit;
if not Assigned(mDBGrid.DataSource.DataSet) then Exit;
if not mDBGrid.DataSource.DataSet.Active then Exit;
vBookmark := mDBGrid.DataSource.DataSet.Bookmark;
mDBGrid.DataSource.DataSet.DisableControls;
try
J := 0;
vAllWidth := 0;
for I := 0 to mDBGrid.Columns.Count - 1 do
if mDBGrid.Columns[I].Visible then begin
Inc(J);
SetLength(vWidths, J);
vWidths[J - 1] := mDBGrid.Columns[I].Width;
Inc(vAllWidth, mDBGrid.Columns[I].Width);
end;
if J <= 0 then Exit;
mStrings.Clear;
mStrings.Add(Format('',
');
finally
mDBGrid.DataSource.DataSet.Bookmark := vBookmark;
mDBGrid.DataSource.DataSet.EnableControls;
vWidths := nil;
end;
Result := True;
end; { DBGridToHtmlTable }
///////Fim do Código
function ColorToHtml(mColor: TColor): string;
begin
mColor := ColorToRGB(mColor);
Result := Format('#%.2x%.2x%.2x',
[GetRValue(mColor), GetGValue(mColor), GetBValue(mColor)]);
end; { ColorToHtml }
function StrToHtml(mStr: string; mFont: TFont = nil): string;
var
vLeft, vRight: string;
begin
Result := mStr;
Result := StringReplace(Result, '&', '&', [rfReplaceAll]);
Result := StringReplace(Result, '<', '<', [rfReplaceAll]);
Result := StringReplace(Result, '>', '>', [rfReplaceAll]);
if not Assigned(mFont) then Exit;
vLeft := Format('',
[mFont.Name, ColorToHtml(mFont.Color)]);
vRight := '';
if fsBold in mFont.Style then begin
vLeft := vLeft + '';
vRight := '' + vRight;
end;
if fsItalic in mFont.Style then begin
vLeft := vLeft + '';
vRight := '' + vRight;
end;
if fsUnderline in mFont.Style then begin
vLeft := vLeft + '';
vRight := '' + vRight;
end;
if fsStrikeOut in mFont.Style then begin
vLeft := vLeft + '
vRight := '
end;
Result := vLeft + Result + vRight;
end; { StrToHtml }
function DBGridToHtmlTable(mDBGrid: TDBGrid; mStrings: TStrings;
mCaption: TCaption = ''): Boolean;
const
cAlignText: array[TAlignment] of string = ('LEFT', 'RIGHT', 'CENTER');
var
vColFormat: string;
vColText: string;
vAllWidth: Integer;
vWidths: array of Integer;
vBookmark: string;
I, J: Integer;
begin
Result := False;
if not Assigned(mStrings) then Exit;
if not Assigned(mDBGrid) then Exit;
if not Assigned(mDBGrid.DataSource) then Exit;
if not Assigned(mDBGrid.DataSource.DataSet) then Exit;
if not mDBGrid.DataSource.DataSet.Active then Exit;
vBookmark := mDBGrid.DataSource.DataSet.Bookmark;
mDBGrid.DataSource.DataSet.DisableControls;
try
J := 0;
vAllWidth := 0;
for I := 0 to mDBGrid.Columns.Count - 1 do
if mDBGrid.Columns[I].Visible then begin
Inc(J);
SetLength(vWidths, J);
vWidths[J - 1] := mDBGrid.Columns[I].Width;
Inc(vAllWidth, mDBGrid.Columns[I].Width);
end;
if J <= 0 then Exit;
mStrings.Clear;
mStrings.Add(Format('
DisplayText%d | '#13#10,%s | '#13#10,
finally
mDBGrid.DataSource.DataSet.Bookmark := vBookmark;
mDBGrid.DataSource.DataSet.EnableControls;
vWidths := nil;
end;
Result := True;
end; { DBGridToHtmlTable }
///////Fim do Código
Como desligar/ligar monitor
{Inclua na seção uses: Windows
No Win95 podemos desligar o monitor afim de economizar energia elétrica. Normalmente este recurso é controlado pelo próprio Windows. Porém sua aplicação Delphi também pode fazer isto. O exemplo abaixo desliga o monitor, aguarde 5 segundos e re-liga monitor.}
SendMessage(Application.Handle, WM_SYSCOMMAND,
SC_MONITORPOWER, 0);
Sleep(5000); { Aguarde 5 segundos }
SendMessage(Application.Handle, WM_SYSCOMMAND,
SC_MONITORPOWER, -1);
Observações
{Este recurso pode não funcionar dependendo da configuração do sistema.}
No Win95 podemos desligar o monitor afim de economizar energia elétrica. Normalmente este recurso é controlado pelo próprio Windows. Porém sua aplicação Delphi também pode fazer isto. O exemplo abaixo desliga o monitor, aguarde 5 segundos e re-liga monitor.}
SendMessage(Application.Handle, WM_SYSCOMMAND,
SC_MONITORPOWER, 0);
Sleep(5000); { Aguarde 5 segundos }
SendMessage(Application.Handle, WM_SYSCOMMAND,
SC_MONITORPOWER, -1);
Observações
{Este recurso pode não funcionar dependendo da configuração do sistema.}
Criar atalho na area de trabalho e no menu iniciar do windows
uses ShlObj, ActiveX,ComObj, Registry,FileCtrl;
procedure CriarAtalho (NomeDoPrograma,ParametrosdeExcecucao,DiretoriodeInicializacao, NomedoAtalho,IniciarEm,NomedoGrupo : String);
var
MeuObjeto : IUnknown;
MeuAtalho : IShellLink;
MeuArquivo : IPersistFile;
Diretorio : String;
CriarAtalho : WideString;
Var_Registro : TRegIniFile;
begin
MeuObjeto := CreateComObject(CLSID_ShellLink);
MeuAtalho := MeuObjeto as IShellLink;
MeuArquivo := MeuObjeto as IPersistFile;
with MeuAtalho do
begin
SetArguments(PChar(ParametrosdeExcecucao));
SetPath(PChar(NomeDoPrograma));
SetWorkingDirectory(PChar(DiretoriodeInicializacao));
end;
Var_Registro := TRegIniFile.Create('SoftwareMicrosoftWindowsCurrentVersionExplorer');
Diretorio := Var_Registro.ReadString ('Shell Folders','Programs','');
//Cria o Atalho No Menu Iniciar
if trim(NomedoGrupo)<>'' then
begin
Diretorio:=Diretorio+''+NomedoGrupo;
if not DirectoryExists(Diretorio) then
ForceDirectories(Diretorio);
end;
CriarAtalho := Diretorio + '' + NomedoAtalho + '.lnk';
MeuArquivo.Save (PWChar (CriarAtalho), False);
//Cria o Atal]ho na area de Trabalho
Diretorio := Var_Registro.ReadString ('Shell Folders','Desktop','');
CriarAtalho := Diretorio + '' + NomedoAtalho + '.lnk';
MeuArquivo.Save (PWChar (CriarAtalho), False);
Var_Registro.Free;
end;
procedure TForm1.CriarAtalhoClick(Sender: TObject);
begin
CriarAtalho('Arquivo.Exe','parametro pa abertura','Diretorio onde o Arquivo Esta','Nome do Atalho','onde o Arquivo Esta','Nome do Gupo');
end;
o nome do Grupo é uma pasta onde seu atalho vai Ficar
como por exemplo "acessorios"
procedure CriarAtalho (NomeDoPrograma,ParametrosdeExcecucao,DiretoriodeInicializacao, NomedoAtalho,IniciarEm,NomedoGrupo : String);
var
MeuObjeto : IUnknown;
MeuAtalho : IShellLink;
MeuArquivo : IPersistFile;
Diretorio : String;
CriarAtalho : WideString;
Var_Registro : TRegIniFile;
begin
MeuObjeto := CreateComObject(CLSID_ShellLink);
MeuAtalho := MeuObjeto as IShellLink;
MeuArquivo := MeuObjeto as IPersistFile;
with MeuAtalho do
begin
SetArguments(PChar(ParametrosdeExcecucao));
SetPath(PChar(NomeDoPrograma));
SetWorkingDirectory(PChar(DiretoriodeInicializacao));
end;
Var_Registro := TRegIniFile.Create('SoftwareMicrosoftWindowsCurrentVersionExplorer');
Diretorio := Var_Registro.ReadString ('Shell Folders','Programs','');
//Cria o Atalho No Menu Iniciar
if trim(NomedoGrupo)<>'' then
begin
Diretorio:=Diretorio+''+NomedoGrupo;
if not DirectoryExists(Diretorio) then
ForceDirectories(Diretorio);
end;
CriarAtalho := Diretorio + '' + NomedoAtalho + '.lnk';
MeuArquivo.Save (PWChar (CriarAtalho), False);
//Cria o Atal]ho na area de Trabalho
Diretorio := Var_Registro.ReadString ('Shell Folders','Desktop','');
CriarAtalho := Diretorio + '' + NomedoAtalho + '.lnk';
MeuArquivo.Save (PWChar (CriarAtalho), False);
Var_Registro.Free;
end;
procedure TForm1.CriarAtalhoClick(Sender: TObject);
begin
CriarAtalho('Arquivo.Exe','parametro pa abertura','Diretorio onde o Arquivo Esta','Nome do Atalho','onde o Arquivo Esta','Nome do Gupo');
end;
o nome do Grupo é uma pasta onde seu atalho vai Ficar
como por exemplo "acessorios"
Imprimir em impressora matricial em modo caracter
Procedure TForm1.Button1Click(Sender: TObject);
var Arquivo : TextFile;
begin
AssignFile(Arquivo,'LPT1');
Rewrite(Arquivo);
Writeln(Arquivo,'Teste de impressao - Linha 0');
Writeln(Arquivo,'Teste de impressao - Linha 1');
Writeln(Arquivo,#27#15+'Teste de Impressão - Linha 2');
Writeln(Arquivo,'Teste de impressao - Linha 3');
Writeln(Arquivo,#27#18+'Teste de Impressão - Linha 4');
Writeln(Arquivo,'Teste de impressao - Linha 5');
Writeln(Arquivo,#12); // Ejeta a página
CloseFile(Arquivo);
end;
var Arquivo : TextFile;
begin
AssignFile(Arquivo,'LPT1');
Rewrite(Arquivo);
Writeln(Arquivo,'Teste de impressao - Linha 0');
Writeln(Arquivo,'Teste de impressao - Linha 1');
Writeln(Arquivo,#27#15+'Teste de Impressão - Linha 2');
Writeln(Arquivo,'Teste de impressao - Linha 3');
Writeln(Arquivo,#27#18+'Teste de Impressão - Linha 4');
Writeln(Arquivo,'Teste de impressao - Linha 5');
Writeln(Arquivo,#12); // Ejeta a página
CloseFile(Arquivo);
end;
Como imprimir um campo memo via canvas
//Coloque na clásula Uses a unit printers
procedure TForm1.Button1Click(Sender: TObject);
var
i, altura : Integer;
sMemo : String;
begin
With Printer do
begin
Title:= 'Imprimindo memo';
BeginDoc;
With Canvas do
begin
altura := TextHeight('A');
for i := 1 to Memo1.Lines.Count do
begin
sMemo := Memo1.Lines[I];
TextOut(1, (i - 1) * Altura, sMemo);
end;
end;
EndDoc;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, altura : Integer;
sMemo : String;
begin
With Printer do
begin
Title:= 'Imprimindo memo';
BeginDoc;
With Canvas do
begin
altura := TextHeight('A');
for i := 1 to Memo1.Lines.Count do
begin
sMemo := Memo1.Lines[I];
TextOut(1, (i - 1) * Altura, sMemo);
end;
end;
EndDoc;
end;
end;
Marcadores:
Como imprimir um campo memo via canvas
Problemas delphi x impressora xerox
{Eu já ouvi falar que a própria Xerox já afirmou esta imcompatibilidade entre seu driver e o quickreport.
No meu caso, temos uma impressora Xerox N32PCL e para que não dê problema utilizo o driver da HP LaserJet 5MP. Utilizando este driver a impressão sai sem problemas na impressora Xerox.
Assim, tenho em meu computador instalado duas impressoras (que na realidade são as mesmas). Uma utilizando o driver da HP LaseJet 5MP (para ser utilizada com o Delfi quando a aplicação contém relatórios com o QuickReport) e outra utilizando o próprio drive da Xerox}
No meu caso, temos uma impressora Xerox N32PCL e para que não dê problema utilizo o driver da HP LaserJet 5MP. Utilizando este driver a impressão sai sem problemas na impressora Xerox.
Assim, tenho em meu computador instalado duas impressoras (que na realidade são as mesmas). Uma utilizando o driver da HP LaseJet 5MP (para ser utilizada com o Delfi quando a aplicação contém relatórios com o QuickReport) e outra utilizando o próprio drive da Xerox}
Marcadores:
Problemas delphi x impressora xerox
Como alterar o caption da janela de preview do quickreport
{Para mudar o título da barra de título da janela de Preview de seus relatórios, use o seguinte comando: }
QRPrinter.PreviewCaption := 'Visualização do Relatório';
QRPrinter.PreviewCaption := 'Visualização do Relatório';
Como criar um contador de página para um relatório desenvolvido no quickreport 2.0
{Como criar um contador de página para um relatório desenvolvido no QuickReport 2.0}
var
Form1: TForm1;
i : integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
i := 0 ;
QuickRep1.Prepare;
QrLabel2.Caption := IntToStr(i);
QuickRep1.Preview;
end;
procedure TForm1.QuickRep1StartPage(Sender: TQuickRep);
begin
i := i + 1;
Form2.Label1.caption := IntToStr(i);
end;
var
Form1: TForm1;
i : integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
i := 0 ;
QuickRep1.Prepare;
QrLabel2.Caption := IntToStr(i);
QuickRep1.Preview;
end;
procedure TForm1.QuickRep1StartPage(Sender: TQuickRep);
begin
i := i + 1;
Form2.Label1.caption := IntToStr(i);
end;
Como converte um arquivo jpeg em bmp
Function JpgToBmp(cImage: String): Boolean;
// Requer a Jpeg declarada na clausua uses da unit
var
MyJPEG : TJPEGImage;
MyBMP : TBitmap;
begin
Result := False;
if fileExists(cImage+'.Jpeg') then
begin
MyJPEG := TJPEGImage.Create;
with MyJPEG do
begin
try
LoadFromFile(cImage+'.Jpeg');
MyBMP := TBitmap.Create;
with MyBMP do
begin
Width := MyJPEG.Width;
Height := MyJPEG.Height;
Canvas.Draw(0,0,MyJPEG);
SaveToFile(cImage+'.Bmp');
Free;
Result := True;
end;
finally
Free;
end;
end;
end;
end;
// Requer a Jpeg declarada na clausua uses da unit
var
MyJPEG : TJPEGImage;
MyBMP : TBitmap;
begin
Result := False;
if fileExists(cImage+'.Jpeg') then
begin
MyJPEG := TJPEGImage.Create;
with MyJPEG do
begin
try
LoadFromFile(cImage+'.Jpeg');
MyBMP := TBitmap.Create;
with MyBMP do
begin
Width := MyJPEG.Width;
Height := MyJPEG.Height;
Canvas.Draw(0,0,MyJPEG);
SaveToFile(cImage+'.Bmp');
Free;
Result := True;
end;
finally
Free;
end;
end;
end;
end;
Marcadores:
Como converte um arquivo jpeg em bmp
Como transformar a imagem em negativo de fotografia
Procedure ColorToNegative(ABmp: TBitmap);
//
// Transforma a imagem em negativo de fotografia
//
// Use-o assim:
//
// var x: TBitmap;
// begin
//
// x := TBitmap.create;
// x.LoadFromFile('c:MVC-267S.bmp');
// ColorToNegative(x);
// image1.Picture.Assign(x);
// end;
//
//
const
_high = 255;
var
c: TCursor;
x, y: Integer;
ColorRGB: LongInt;
begin
c := Screen.Cursor;
Screen.Cursor := crHourGlass;
for y := 0 to (ABmp.Height - 1) do
for x := 0 to (ABmp.Width - 1) do
begin
ColorRGB := ColorToRGB(ABmp.Canvas.Pixels[x, y]);
ABmp.Canvas.Pixels[x, y] := PaletteRGB(_high - GetRValue(ColorRGB),_high - GetGValue(ColorRGB), _high - GetBValue(ColorRGB));
end;
Screen.Cursor := c;
end;
//
// Transforma a imagem em negativo de fotografia
//
// Use-o assim:
//
// var x: TBitmap;
// begin
//
// x := TBitmap.create;
// x.LoadFromFile('c:MVC-267S.bmp');
// ColorToNegative(x);
// image1.Picture.Assign(x);
// end;
//
//
const
_high = 255;
var
c: TCursor;
x, y: Integer;
ColorRGB: LongInt;
begin
c := Screen.Cursor;
Screen.Cursor := crHourGlass;
for y := 0 to (ABmp.Height - 1) do
for x := 0 to (ABmp.Width - 1) do
begin
ColorRGB := ColorToRGB(ABmp.Canvas.Pixels[x, y]);
ABmp.Canvas.Pixels[x, y] := PaletteRGB(_high - GetRValue(ColorRGB),_high - GetGValue(ColorRGB), _high - GetBValue(ColorRGB));
end;
Screen.Cursor := c;
end;
Como mudar o texto de um edit no evento onchange
{Se o texto de um TEdit for mudado no seu evento OnChange, este even-to será chamado recursivamente até acabar com o espaço de pilha. Pa-ra fazer isso, deve-se setar o evento OnChange para NIL antes de mu-dar 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;
Isto também vale para evento OnValidate.
procedure Edit1Change(Sender : TObject);
begin
Edit1.OnChange := NIL;
if Edit1.Text = 'Texto' then
Edit1.Text := 'Novo Texto';
Edit1.OnChange := Edit1Change;
end;
Isto também vale para evento OnValidate.
Marcadores:
Como mudar o texto de um edit no evento onchange
Como deixar o string grid colorido
Unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure StringGrid1DblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
C, R: Integer;
Value: Integer;
begin
{Encher o String Grid de valores Inteiros e Ramdomicos}
Randomize;
for C := 1 to StringGrid1.ColCount-1 do
for R := 1 to StringGrid1.RowCount-1 do
begin
Value := Random(10) - 5;
StringGrid1.Cells[C,R] := IntToStr(Value);
StringGrid1.Objects[C,R] := Pointer(clBlack);
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
const
LM = 3; {each indiviual cell's left margin}
TM = 2; {each indiviual cell's top margin}
var
ptr: Pointer;
begin
{qualquer cor é armazenada no ponteiro do objeto}
ptr := StringGrid1.Objects[Col, Row];
StringGrid1.Canvas.Font.Color := LongInt(ptr);
{deixe as filas fixas e as colunas fixas em prata }
if gdFixed in State then
StringGrid1.Canvas.Brush.Color := clSilver;
{puxemos o destaque do modo seguinte quando a celula for selecionada }
if gdSelected in State then
begin
StringGrid1.Canvas.Brush.Color := clHighlight;
StringGrid1.Canvas.Font.Color := clHighlightText;
end;
{finalmente, faça o desenho de celula atual }
StringGrid1.Canvas.TextRect(Rect, Rect.Left + LM, Rect.Top + TM, StringGrid1.Cells[col,row]);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
C, R: Integer;
begin
for C := 1 to StringGrid1.ColCount-1 do
for R := 1 to StringGrid1.RowCount-1 do
begin
{faça os objetos de todos o grid apontar a nada }
StringGrid1.Objects[C, R] := nil;
{se nós tivéssemos armazenado objetos no grid, nós deveríamos os livrar assim:
StringGrid1.Objects[C, R].Free;}
end;
Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure StringGrid1DblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
C, R: Integer;
Value: Integer;
begin
{Encher o String Grid de valores Inteiros e Ramdomicos}
Randomize;
for C := 1 to StringGrid1.ColCount-1 do
for R := 1 to StringGrid1.RowCount-1 do
begin
Value := Random(10) - 5;
StringGrid1.Cells[C,R] := IntToStr(Value);
StringGrid1.Objects[C,R] := Pointer(clBlack);
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
const
LM = 3; {each indiviual cell's left margin}
TM = 2; {each indiviual cell's top margin}
var
ptr: Pointer;
begin
{qualquer cor é armazenada no ponteiro do objeto}
ptr := StringGrid1.Objects[Col, Row];
StringGrid1.Canvas.Font.Color := LongInt(ptr);
{deixe as filas fixas e as colunas fixas em prata }
if gdFixed in State then
StringGrid1.Canvas.Brush.Color := clSilver;
{puxemos o destaque do modo seguinte quando a celula for selecionada }
if gdSelected in State then
begin
StringGrid1.Canvas.Brush.Color := clHighlight;
StringGrid1.Canvas.Font.Color := clHighlightText;
end;
{finalmente, faça o desenho de celula atual }
StringGrid1.Canvas.TextRect(Rect, Rect.Left + LM, Rect.Top + TM, StringGrid1.Cells[col,row]);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
C, R: Integer;
begin
for C := 1 to StringGrid1.ColCount-1 do
for R := 1 to StringGrid1.RowCount-1 do
begin
{faça os objetos de todos o grid apontar a nada }
StringGrid1.Objects[C, R] := nil;
{se nós tivéssemos armazenado objetos no grid, nós deveríamos os livrar assim:
StringGrid1.Objects[C, R].Free;}
end;
Olha o listbox
Selecionar primeiro da lista: combobox1.ItemIndex:=0;
Mostrar atual: listbox1.items[listbox1.itemindex];
Adicionar: ListBox1.Items.Add(ComboBox1.Text);
Apagar: ListBox1.Items.Delete(ListBox1.ItemIndex);
Mostrar atual: listbox1.items[listbox1.itemindex];
Adicionar: ListBox1.Items.Add(ComboBox1.Text);
Apagar: ListBox1.Items.Delete(ListBox1.ItemIndex);
segunda-feira, 23 de novembro de 2009
Hint com quebra de linha
{Para incluir mais de uma linha no Hint você deve utilizar o evento OnMouseMove de cada componente. Veja abaixo como ficará o código em um Edit por exemplo. }
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Edit1.hint := 'Primeira Linha'+#13+'Segunda Linha'+#13+ 'Terceira Linha'+#13+'Quarta Linha';
end;
//Obs. Não esquecer de mudar para TRUE o evento ShowHint
P.1072
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Edit1.hint := 'Primeira Linha'+#13+'Segunda Linha'+#13+ 'Terceira Linha'+#13+'Quarta Linha';
end;
//Obs. Não esquecer de mudar para TRUE o evento ShowHint
P.1072
Como eliminar os hints de uma treeview
Procedure TForm1.Button1Click(Sender: TObject);
begin
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle,GWL_STYLE) or $80);
end;
//para mostrar os hints novamente
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle,GWL_STYLE) and not $80);
begin
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle,GWL_STYLE) or $80);
end;
//para mostrar os hints novamente
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle,GWL_STYLE) and not $80);
Marcadores:
Como eliminar os hints de uma treeview
Codigos de cor de fundo do hint
//Veja as propriedades dp TApplication...
Application.HintColor := clAqua;
Application.HintPause := ...
Application.HintShortPause := ...
Application.HintColor := clAqua;
Application.HintPause := ...
Application.HintShortPause := ...
Função para validar data
{Passar a data como string, neste caso, e depois convertê-lá em date é onde se verificará se a data é válida. O função MSGAviso é uma função minha que já incluí neste site.}
Function ValidaData(sData : String): Boolean;
Begin
Try
sData := DateToStr(StrToDate(sData));
Result := True;
Except
Result := False;
MSGAviso('Data inválida!', 'Erro!');
End;
End;
Function ValidaData(sData : String): Boolean;
Begin
Try
sData := DateToStr(StrToDate(sData));
Result := True;
Except
Result := False;
MSGAviso('Data inválida!', 'Erro!');
End;
End;
Ocultar a aplicação (form)
//No evento OnClick de um TButton coloque o seguinte código trocando o Project1 pelo nome de sua aplicação:
H := FindWindow(Nil,'Project1');
if H <> 0 then
ShowWindow(H,SW_HIDE);
H := FindWindow(Nil,'Project1');
if H <> 0 then
ShowWindow(H,SW_HIDE);
Como ocultar a aplicação da barra de tarefas
//No evento OnClick de um TButton inclua o seguinte codigo e trocar o Project1 pelo nome de sua aplicação:
ShowWindow(FindWindow(nil,'Project1'),SW_HIDE);
ShowWindow(FindWindow(nil,'Project1'),SW_HIDE);
Marcadores:
Como ocultar a aplicação da barra de tarefas
Como ocultar a aplicação
//Coloque um TButton e no evento OnClick coloque o seguinte código:
ShowWindow(FindWindow(nil,'PrjHook'),SW_HIDE);
ShowWindow(FindWindow(nil,'PrjHook'),SW_HIDE);
Completando um tedit ou tdbedit com zeros a esquerda
{A necessidade de completar com zeros a esquerda um TDBEdit qualquer, sempre
aparece, e você tem que repetir o código para verificar o tamanho da string
resultante e completar a dita cuja com zeros.
Para resolver isso, ligue esta procedure no Evento OnExit do TDBEdit:}
procedure StrZeroField(var elemento : TObject);
begin
if elemento is TDBEdit then
if TDBEdit(elemento).GetTextLen <> 0 then
if StrToInt(TDBEdit(elemento).text) = 0 then
TDBEdit(elemento).text := ''
else
while TDBEdit(elemento).GetTextLen <> TDBEdit(elemento).MaxLength do
TDBEdit(elemento).text := '0'+TDBEdit(elemento).text;
end;
{
O procedimento pode ser facilmente alterado para trabalhar com outros tipos de
componentes de edição.}
aparece, e você tem que repetir o código para verificar o tamanho da string
resultante e completar a dita cuja com zeros.
Para resolver isso, ligue esta procedure no Evento OnExit do TDBEdit:}
procedure StrZeroField(var elemento : TObject);
begin
if elemento is TDBEdit then
if TDBEdit(elemento).GetTextLen <> 0 then
if StrToInt(TDBEdit(elemento).text) = 0 then
TDBEdit(elemento).text := ''
else
while TDBEdit(elemento).GetTextLen <> TDBEdit(elemento).MaxLength do
TDBEdit(elemento).text := '0'+TDBEdit(elemento).text;
end;
{
O procedimento pode ser facilmente alterado para trabalhar com outros tipos de
componentes de edição.}
Compilando unit sem o projeto
{O comando compile pode ser usado somente quando você tiver carregado um projeto no editor.
Se nenhum projeto estiver ativo e você carregar um arquivo-fonte Pascal, não poderá compilá-lo. Porém se você carregar o arquivo-fonte como se ele fosse um projeto, isso fará o trabalho}
Se nenhum projeto estiver ativo e você carregar um arquivo-fonte Pascal, não poderá compilá-lo. Porém se você carregar o arquivo-fonte como se ele fosse um projeto, isso fará o trabalho}
Colocando uma barra de progresso na inicialização do sistema
{É bem simples, trata-se de abrir por código todas as tabelas na entrada do programa, portanto deixe todas as tabelas fechadas no datamodule.}
procedure DataModule.OnCreate;
var Tabela, i: Integer;
begin
Tabela := 0;
for I := 0 to ComponentCount -1 do
if Components[I] is TTable then
with TTable(Components[I]) do
if (Tag = 9) and not Active then // Tag = 9 identifica as tabelas à serem
abertas
try
Inc(Tabela); // contador das tabelas q já foram abertas.
lblInfo.Caption := Format('Abrindo as Tabelas (%d/%d)', [Tabela, Total]);
{aqui, informo à uma label o andamento do processo, usei o formato
TotalTabelasAbertas/TotalàAbrir, pode-se trocar para porcentagem ou até usar o
ProgressBar.}
lblInfo.Refresh; // vital para atualizar a tela durante o processo.
Application.ProcessMessages;
Open;
except
Raise; // quem estiver a fim, pode-se colocar aqui uma verificação, se deu zebra
e a zebra é indice corrompido, rodar rotina de recriação de indice da tabela.
end;
procedure DataModule.OnCreate;
var Tabela, i: Integer;
begin
Tabela := 0;
for I := 0 to ComponentCount -1 do
if Components[I] is TTable then
with TTable(Components[I]) do
if (Tag = 9) and not Active then // Tag = 9 identifica as tabelas à serem
abertas
try
Inc(Tabela); // contador das tabelas q já foram abertas.
lblInfo.Caption := Format('Abrindo as Tabelas (%d/%d)', [Tabela, Total]);
{aqui, informo à uma label o andamento do processo, usei o formato
TotalTabelasAbertas/TotalàAbrir, pode-se trocar para porcentagem ou até usar o
ProgressBar.}
lblInfo.Refresh; // vital para atualizar a tela durante o processo.
Application.ProcessMessages;
Open;
except
Raise; // quem estiver a fim, pode-se colocar aqui uma verificação, se deu zebra
e a zebra é indice corrompido, rodar rotina de recriação de indice da tabela.
end;
Colocando um progressbar num statusbar
{- Coloque uma StatusBar no form.
- Adicione dois paineis na StatusBar (propriedade Panels).
- Ajuste as propriedades do primeiro painel conforme abaixo:
Style = psOwnerDraw
Width = 150
- Coloque uma ProgressBar no form e mude sua propriedade
Visible para false.
- No evento OnDrawPanel da StatusBar digite o código abaixo:}
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
const Rect: TRect);
begin
// Se for o primeiro painel...
if Panel.Index = 0 then
begin
// Ajusta a tamanho da ProgressBar de acordo com o tamanho do painel
ProgressBar1.Width := Rect.Right - Rect.Left +1;
ProgressBar1.Height := Rect.Bottom - Rect.Top +1;
// Pinta a ProgressBar no DC (device-context) da StatusBar
ProgressBar1.PaintTo(StatusBar.Canvas.Handle, Rect.Left, Rect.Top);
end;
end;
//- Coloque um Button no form
//- Digite no evento OnClick do Button o código abaixo:
procedure TForm1.Button1Click(Sender: TObject);
var I: integer;
begin
for I := ProgressBar1.Min to ProgressBar1.Max do
begin
{ Atualiza a posição da ProgressBar }
ProgressBar1.Position := I;
{ Repinta a StatusBar para forçar a atualização visual }
StatusBar1.Repaint;
{ Aguarda 50 milisegundos }
Sleep(50);
end;
// Aguarde 500 milisegundos
Sleep(500);
// Reseta (zera) a ProgressBar
ProgressBar1.Position := ProgressBar1.Min;
// Repinta a StatusBar para forçar a atualização visual
StatusBar1.Repaint;
end;
{- Execute e clique no botão para ver o resultado.
Observações:
Com um pouco de criatividade podemos fazer outras coisas interessantes usando o evento OnDrawPanel da StatusBar.
}
- Adicione dois paineis na StatusBar (propriedade Panels).
- Ajuste as propriedades do primeiro painel conforme abaixo:
Style = psOwnerDraw
Width = 150
- Coloque uma ProgressBar no form e mude sua propriedade
Visible para false.
- No evento OnDrawPanel da StatusBar digite o código abaixo:}
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
const Rect: TRect);
begin
// Se for o primeiro painel...
if Panel.Index = 0 then
begin
// Ajusta a tamanho da ProgressBar de acordo com o tamanho do painel
ProgressBar1.Width := Rect.Right - Rect.Left +1;
ProgressBar1.Height := Rect.Bottom - Rect.Top +1;
// Pinta a ProgressBar no DC (device-context) da StatusBar
ProgressBar1.PaintTo(StatusBar.Canvas.Handle, Rect.Left, Rect.Top);
end;
end;
//- Coloque um Button no form
//- Digite no evento OnClick do Button o código abaixo:
procedure TForm1.Button1Click(Sender: TObject);
var I: integer;
begin
for I := ProgressBar1.Min to ProgressBar1.Max do
begin
{ Atualiza a posição da ProgressBar }
ProgressBar1.Position := I;
{ Repinta a StatusBar para forçar a atualização visual }
StatusBar1.Repaint;
{ Aguarda 50 milisegundos }
Sleep(50);
end;
// Aguarde 500 milisegundos
Sleep(500);
// Reseta (zera) a ProgressBar
ProgressBar1.Position := ProgressBar1.Min;
// Repinta a StatusBar para forçar a atualização visual
StatusBar1.Repaint;
end;
{- Execute e clique no botão para ver o resultado.
Observações:
Com um pouco de criatividade podemos fazer outras coisas interessantes usando o evento OnDrawPanel da StatusBar.
}
Marcadores:
Colocando um progressbar num statusbar
Colocando um componente combobox em um componente stringgrid
//Inclua no seu Form um componente ComboBox e um componente StringGrid.
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox1Exit(Sender: TObject);
procedure StringGrid1SelectCell
(Sender: TObject; Col, Row: Integer;
var CanSelect: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Evento OnCreate do Form
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Ajusta a altura do ComboBox com a altura da linha do StringGrid}
StringGrid1.DefaultRowHeight := ComboBox1.Height;
{Esconde o ComboBox}
ComboBox1.Visible := False;
end;
// Evento OnChange do componente ComboBox
procedure TForm1.ComboBox1Change
(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]
:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;
// Evento OnExit do componente ComboBox
procedure TForm1.ComboBox1Exit
(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]
:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;
// Evento OnSelectCell do componente StringGrid
procedure TForm1.StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
var CanSelect: Boolean);
var
R: TRect;
begin
if ((Col = 3) AND
(Row <> 0)) then begin
R := StringGrid1.CellRect(Col, Row);
R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left;
R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top;
ComboBox1.Left := R.Left + 1;
ComboBox1.Top := R.Top + 1;
ComboBox1.Width := (R.Right + 1) - R.Left;
ComboBox1.Height := (R.Bottom + 1) - R.Top;
ComboBox1.Visible := True;
ComboBox1.SetFocus;
end;
CanSelect := True;
end;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox1Exit(Sender: TObject);
procedure StringGrid1SelectCell
(Sender: TObject; Col, Row: Integer;
var CanSelect: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Evento OnCreate do Form
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Ajusta a altura do ComboBox com a altura da linha do StringGrid}
StringGrid1.DefaultRowHeight := ComboBox1.Height;
{Esconde o ComboBox}
ComboBox1.Visible := False;
end;
// Evento OnChange do componente ComboBox
procedure TForm1.ComboBox1Change
(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]
:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;
// Evento OnExit do componente ComboBox
procedure TForm1.ComboBox1Exit
(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]
:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;
// Evento OnSelectCell do componente StringGrid
procedure TForm1.StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
var CanSelect: Boolean);
var
R: TRect;
begin
if ((Col = 3) AND
(Row <> 0)) then begin
R := StringGrid1.CellRect(Col, Row);
R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left;
R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top;
ComboBox1.Left := R.Left + 1;
ComboBox1.Top := R.Top + 1;
ComboBox1.Width := (R.Right + 1) - R.Left;
ComboBox1.Height := (R.Bottom + 1) - R.Top;
ComboBox1.Visible := True;
ComboBox1.SetFocus;
end;
CanSelect := True;
end;
Colocando senha numa tabela paradox em tempo de execução
Session.AddPassword('Senha');
Table1.Active := True;
Table1.Active := True;
Colocando margem para richtext
//Se for um richedit e margens laterais(direita e esquerda) tenta:
RichEdit1.Paragraph.FirstIndent -> Paragrafo
RichEdit1.Paragraph.LeftIndent -> margem esquerda
RichEdit1.Paragraph.RightIndent -> margem direita
RichEdit1.Paragraph.FirstIndent -> Paragrafo
RichEdit1.Paragraph.LeftIndent -> margem esquerda
RichEdit1.Paragraph.RightIndent -> margem direita
Colocando bitmaps num combobox
//Ajuste a propriedade Style do ComboBox para csOwnerDrawVariable.
var
Form1: TForm1;
Bmp1, Bmp2, Bmp3: TBitmap;
implementation{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Bmp1:=TBitmap.Create;
Bmp.Loadfromfile('c:chip16.bmp');
Bmp1:=TBitmap.Create;
Bmp.Loadfromfile('c:zoom.bmp');
Bmp1:=TBitmap.Create;
Bmp.Loadfromfile('c:disk.bmp');
ComboBox1.Items.AddObject('Chip',Bmp1);
ComboBox1.Items.AddObject('Zoom',Bmp2);
ComboBox1.Items.AddObject('Disk',Bmp3);
end;
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect:
TRect; State: TOWnerDrawState);
var
Bitmap: TBitmap;
Offset: Integer;
begin
with (Control as TComboBox).Canvas do
begin
FillRect(Rect); Bitmap:= TBitmap(ComboBox1.Items.Objects[index]);
if Bitmap nil then
begin
BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width,
Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed);
Offset: Bitmap.width + 8;
end;
TextOut(Rect.Left + Offset, Rect.Top, ComboBox1.Items[index]);
end;
end;
procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; var
Height: Integer);
begin
Height:=20;
end;
Colocando BMP's em StringGrids
with StringGrid1.Canvas do
begin
{...}
Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);
{...}
end;
var
Form1: TForm1;
Bmp1, Bmp2, Bmp3: TBitmap;
implementation{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Bmp1:=TBitmap.Create;
Bmp.Loadfromfile('c:chip16.bmp');
Bmp1:=TBitmap.Create;
Bmp.Loadfromfile('c:zoom.bmp');
Bmp1:=TBitmap.Create;
Bmp.Loadfromfile('c:disk.bmp');
ComboBox1.Items.AddObject('Chip',Bmp1);
ComboBox1.Items.AddObject('Zoom',Bmp2);
ComboBox1.Items.AddObject('Disk',Bmp3);
end;
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect:
TRect; State: TOWnerDrawState);
var
Bitmap: TBitmap;
Offset: Integer;
begin
with (Control as TComboBox).Canvas do
begin
FillRect(Rect); Bitmap:= TBitmap(ComboBox1.Items.Objects[index]);
if Bitmap nil then
begin
BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width,
Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed);
Offset: Bitmap.width + 8;
end;
TextOut(Rect.Left + Offset, Rect.Top, ComboBox1.Items[index]);
end;
end;
procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; var
Height: Integer);
begin
Height:=20;
end;
Colocando BMP's em StringGrids
with StringGrid1.Canvas do
begin
{...}
Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);
{...}
end;
Centralizando o formulário no centro da área do windows
Var r : TRect;
osv : TOSVersionInfo;
begin
osv.EdwOSVersionInfoSize := sizeof(osv);
GetVersionEx(osv);
if osv.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @r, 0);
Left := ((r.right - r.left) - Width) div 2;
Top := ((r.bottom - r.top) - Height) div 2;
end
else
begin
Left := (GetSystemMetrics(SM_CXSCREEN) - Width) div 2;
Top := (GetSystemMetrics(SM_CYSCREEN) - Height) div 2;
end;
end;
osv : TOSVersionInfo;
begin
osv.EdwOSVersionInfoSize := sizeof(osv);
GetVersionEx(osv);
if osv.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @r, 0);
Left := ((r.right - r.left) - Width) div 2;
Top := ((r.bottom - r.top) - Height) div 2;
end
else
begin
Left := (GetSystemMetrics(SM_CXSCREEN) - Width) div 2;
Top := (GetSystemMetrics(SM_CYSCREEN) - Height) div 2;
end;
end;
Como trocar o cursor do mouse
{Existem vários cursores no Delphi (crDefault é o cursor padrão, crHourGlass é a ampulheta, crHandPoint é a "mãozinha", etc). Para alterá-lo, basta escolher um na propriedade Cursor do componente em que você quer mudar o cursor (troque no form para trocar o do form inteiro). Mas, se você quiser colocar um cursor diferente, siga os procedimentos abaixo:
Na seção interface da unit que contém o form, coloque as seguintes linhas: }
const
crSeuCursor = 1; // Tem que ser um valor maior que 0 (zero)
//No evento OnCreate do form, digite as seguintes linhas:
Screen.Cursors [crSeuCursor] := LoadCursorFromFile ('Cursor.ani');
// O cursor pode ser dos tipos comum (*.cur) ou animado (*.ani)
// Lembre-se: o arquivo tem que estar na mesma pasta do programa
// ou digite o nome do caminho dele.
//Na hora de trocar de cursor, use o seguinte comando:
Objeto.Cursor := crSeuCursor;
//onde Objeto é o nome do objeto que vai ter o cursor alterado (o form, por exemplo).
Na seção interface da unit que contém o form, coloque as seguintes linhas: }
const
crSeuCursor = 1; // Tem que ser um valor maior que 0 (zero)
//No evento OnCreate do form, digite as seguintes linhas:
Screen.Cursors [crSeuCursor] := LoadCursorFromFile ('Cursor.ani');
// O cursor pode ser dos tipos comum (*.cur) ou animado (*.ani)
// Lembre-se: o arquivo tem que estar na mesma pasta do programa
// ou digite o nome do caminho dele.
//Na hora de trocar de cursor, use o seguinte comando:
Objeto.Cursor := crSeuCursor;
//onde Objeto é o nome do objeto que vai ter o cursor alterado (o form, por exemplo).
Como posicionar o cursor do mouse em um controle
//Inclua na seção uses: Windows
{ Digite a procedure abaixo imediatamente após a palavra implementation no código do seu formulário. }
procedure MouseParaControle(Controle: TControl);
var
IrPara: TPoint;
begin
IrPara.X := Controle.Left + (Controle.Width div 2);
IrPara.Y := Controle.Top + (Controle.Height div 2);
if Controle.Parent <> nil then
IrPara := Controle.Parent.ClientToScreen(IrPara);
SetCursorPos(IrPara.X, IrPara.Y);
end;
{ Para testar, coloque no Form um botão e troque o name dele para btnOK e modifique o evento OnShow do Form conforme abaixo: }
procedure TForm1.FormShow(Sender: TObject);
begin
MouseParaControle(btnOk);
end;
{Observações
A função "MouseParaControle" recebe um parâmetro do tipo TControl. Isto significa que você poderá passar para ela qualquer controle do Delphi, tais como: TEdit, TButton, TSpeedButton, TPanel, etc. Pode ser até mesmo o próprio Form}
{ Digite a procedure abaixo imediatamente após a palavra implementation no código do seu formulário. }
procedure MouseParaControle(Controle: TControl);
var
IrPara: TPoint;
begin
IrPara.X := Controle.Left + (Controle.Width div 2);
IrPara.Y := Controle.Top + (Controle.Height div 2);
if Controle.Parent <> nil then
IrPara := Controle.Parent.ClientToScreen(IrPara);
SetCursorPos(IrPara.X, IrPara.Y);
end;
{ Para testar, coloque no Form um botão e troque o name dele para btnOK e modifique o evento OnShow do Form conforme abaixo: }
procedure TForm1.FormShow(Sender: TObject);
begin
MouseParaControle(btnOk);
end;
{Observações
A função "MouseParaControle" recebe um parâmetro do tipo TControl. Isto significa que você poderá passar para ela qualquer controle do Delphi, tais como: TEdit, TButton, TSpeedButton, TPanel, etc. Pode ser até mesmo o próprio Form}
Marcadores:
Como posicionar o cursor do mouse em um controle
Como ocultar/exibir o cursor do mouse
//Inclua na seção uses: Windows
//- Escreva a função abaixo:
function MouseShowCursor(const Show: boolean): boolean;
var
I: integer;
begin
I := ShowCursor(LongBool(true));
if Show then begin
Result := I >= 0;
while I < 0 do begin
Result := ShowCursor(LongBool(true)) >= 0;
Inc(I);
end;
end else begin
Result := I < 0;
while I >= 0 do begin
Result := ShowCursor(LongBool(false)) < 0;
Dec(I);
end;
end;
end;
//- Exemplos de uso:
MouseShowCursor(false); { Oculta o cursor }
MouseShowCursor(true); { Exibe o cursor }
//- Escreva a função abaixo:
function MouseShowCursor(const Show: boolean): boolean;
var
I: integer;
begin
I := ShowCursor(LongBool(true));
if Show then begin
Result := I >= 0;
while I < 0 do begin
Result := ShowCursor(LongBool(true)) >= 0;
Inc(I);
end;
end else begin
Result := I < 0;
while I >= 0 do begin
Result := ShowCursor(LongBool(false)) < 0;
Dec(I);
end;
end;
end;
//- Exemplos de uso:
MouseShowCursor(false); { Oculta o cursor }
MouseShowCursor(true); { Exibe o cursor }
Marcadores:
Como ocultar/exibir o cursor do mouse
Obter a célula de um stringgrid que está sob o cursor do mouse
//Inclua na seção uses: Windows
procedure MouseCell(Grid: TStringGrid;
var Coluna, Linha: integer);
var
Pt: TPoint;
begin
GetCursorPos(Pt);
Pt := Grid.ScreenToClient(Pt);
if PtInRect(Grid.ClientRect, Pt) then
Grid.MouseToCell(Pt.X, Pt.Y, Coluna, Linha)
else begin
Coluna := -1;
Linha := -1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Coluna, Linha: integer;
begin
MouseCell(StringGrid1, Coluna, Linha);
if (Coluna >= 0) and (Linha >= 0) then
Caption := 'Coluna: ' + IntToStr(Coluna) + ' - ' +
'Linha: ' + IntToStr(Linha);
else
Caption := 'O mouse não está no StringGrid';
end;
procedure MouseCell(Grid: TStringGrid;
var Coluna, Linha: integer);
var
Pt: TPoint;
begin
GetCursorPos(Pt);
Pt := Grid.ScreenToClient(Pt);
if PtInRect(Grid.ClientRect, Pt) then
Grid.MouseToCell(Pt.X, Pt.Y, Coluna, Linha)
else begin
Coluna := -1;
Linha := -1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Coluna, Linha: integer;
begin
MouseCell(StringGrid1, Coluna, Linha);
if (Coluna >= 0) and (Linha >= 0) then
Caption := 'Coluna: ' + IntToStr(Coluna) + ' - ' +
'Linha: ' + IntToStr(Linha);
else
Caption := 'O mouse não está no StringGrid';
end;
Movimentando o ponteiro do mouse sem a intervenção do usuário
{Para movimentar o ponteiro do mouse sem intervenção do usuário, deve-se usar um TTimer e colocar o seguinte código em seu evento OnTimer: }
var
pt:tpoint;
begin
getcursorpos(pt);
pt.x := pt.x + 1;
pt.y := pt.y + 1;
SetCursorPos(pt.x,pt.y);
if pt.x>=screen.width-1 then setcursorpos(0,pt.y);
if pt.y>=screen.height-1 then setcursorpos(pt.x,0);
end;
var
pt:tpoint;
begin
getcursorpos(pt);
pt.x := pt.x + 1;
pt.y := pt.y + 1;
SetCursorPos(pt.x,pt.y);
if pt.x>=screen.width-1 then setcursorpos(0,pt.y);
if pt.y>=screen.height-1 then setcursorpos(pt.x,0);
end;
Limitando a região de movimentação do mouse
{Inclua na seção uses: Windows
Coloque um botão no form e altera o evento OnClick dele conforme abaixo: }
procedure TForm1.Button1Click(Sender: TObject);
var
R: TRect;
begin
{ Pega o retângulo da área cliente do form }
R := GetClientRect;
{ Converte as coordenadas do form em coordenadas da tela }
R.TopLeft := ClientToScreen(R.TopLeft);
R.BottomRight := ClientToScreen(R.BottomRight);
{ Limita a região de movimentação do mouse }
ClipCursor(@R);
ShowMessage('Tente mover o mouse para fora da área cliente do Form');
{ Libera a movimentação }
ClipCursor(nil);
end;
Coloque um botão no form e altera o evento OnClick dele conforme abaixo: }
procedure TForm1.Button1Click(Sender: TObject);
var
R: TRect;
begin
{ Pega o retângulo da área cliente do form }
R := GetClientRect;
{ Converte as coordenadas do form em coordenadas da tela }
R.TopLeft := ClientToScreen(R.TopLeft);
R.BottomRight := ClientToScreen(R.BottomRight);
{ Limita a região de movimentação do mouse }
ClipCursor(@R);
ShowMessage('Tente mover o mouse para fora da área cliente do Form');
{ Libera a movimentação }
ClipCursor(nil);
end;
Marcadores:
Limitando a região de movimentação do mouse
Limitando a região de movimentação do mouse
{Inclua na seção uses: Windows
Coloque um botão no form e altera o evento OnClick dele conforme abaixo: }
procedure TForm1.Button1Click(Sender: TObject);
var
R: TRect;
begin
{ Pega o retângulo da área cliente do form }
R := GetClientRect;
{ Converte as coordenadas do form em coordenadas da tela }
R.TopLeft := ClientToScreen(R.TopLeft);
R.BottomRight := ClientToScreen(R.BottomRight);
{ Limita a região de movimentação do mouse }
ClipCursor(@R);
ShowMessage('Tente mover o mouse para fora da área cliente do Form');
{ Libera a movimentação }
ClipCursor(nil);
end;
Coloque um botão no form e altera o evento OnClick dele conforme abaixo: }
procedure TForm1.Button1Click(Sender: TObject);
var
R: TRect;
begin
{ Pega o retângulo da área cliente do form }
R := GetClientRect;
{ Converte as coordenadas do form em coordenadas da tela }
R.TopLeft := ClientToScreen(R.TopLeft);
R.BottomRight := ClientToScreen(R.BottomRight);
{ Limita a região de movimentação do mouse }
ClipCursor(@R);
ShowMessage('Tente mover o mouse para fora da área cliente do Form');
{ Libera a movimentação }
ClipCursor(nil);
end;
Marcadores:
Limitando a região de movimentação do mouse
Como inverter os botões do mouse
{ Para inverter: }
SwapMouseButton(true);
{ Para voltar ao normal: }
SwapMouseButton(false);
SwapMouseButton(true);
{ Para voltar ao normal: }
SwapMouseButton(false);
Cursor customizado
//Criar um arquivo de recurso com o cursor (vamos chamá-lo de teste.res)
//Vamos chamar o recurso de CUR_1
//Coloque {$R teste.res} na seção implementation
procedure InsereCursor(Num : Smallint);
begin
Screen.Cursors[Num]:= LoadCursor(hInstance, PChar('CUR_1'));
Screen.Cursor := Num;
end;
//Vamos chamar o recurso de CUR_1
//Coloque {$R teste.res} na seção implementation
procedure InsereCursor(Num : Smallint);
begin
Screen.Cursors[Num]:= LoadCursor(hInstance, PChar('CUR_1'));
Screen.Cursor := Num;
end;
Cursor customizado
//Criar um arquivo de recurso com o cursor (vamos chamá-lo de teste.res)
//Vamos chamar o recurso de CUR_1
//Coloque {$R teste.res} na seção implementation
procedure InsereCursor(Num : Smallint);
begin
Screen.Cursors[Num]:= LoadCursor(hInstance, PChar('CUR_1'));
Screen.Cursor := Num;
end;
//Vamos chamar o recurso de CUR_1
//Coloque {$R teste.res} na seção implementation
procedure InsereCursor(Num : Smallint);
begin
Screen.Cursors[Num]:= LoadCursor(hInstance, PChar('CUR_1'));
Screen.Cursor := Num;
end;
Como mostrar o mouse como uma ampulheta
Try
Screen.Cursor := crHourGlass;
{ Escreva o ação a executar aqui }
finally
Screen.Cursor := crDefault;
end;
Application.ProcessMessages;
Screen.Cursor := crHourGlass;
{ Escreva o ação a executar aqui }
finally
Screen.Cursor := crDefault;
end;
Application.ProcessMessages;
Marcadores:
Como mostrar o mouse como uma ampulheta
Como simular um clique
{1 - Insira um ListBox e preencha-o com alguns itens;
2 - Insira um botão qualquer;
3 - No evento OnDblClick do ListBox, digite:}
Button1.Perform(WM_LBUTTONDOWN, 0, 0);
2 - Insira um botão qualquer;
3 - No evento OnDblClick do ListBox, digite:}
Button1.Perform(WM_LBUTTONDOWN, 0, 0);
Carregar um cursor animado (xxx.ani)
Const
cnCursorID1 = 1;
begin
Screen.Cursors[ cnCursorID1 ] :=
LoadCursorFromFile('c:win95cursorscavalo.ani' );
Cursor := cnCursorID1;
end;
cnCursorID1 = 1;
begin
Screen.Cursors[ cnCursorID1 ] :=
LoadCursorFromFile('c:win95cursorscavalo.ani' );
Cursor := cnCursorID1;
end;
Marcadores:
Carregar um cursor animado (xxx.ani)
Como usar eventos de som do windows
{ Evento Som Padrão }
MessageBeep(0); { ou Beep; }
{ Evento Parada Crítica }
MessageBeep(16);
{ Evento Pergunta }
MessageBeep(32);
{ Evento Exclamação }
MessageBeep(48);
{ Evento Asterisco }
MessageBeep(64);
MessageBeep(0); { ou Beep; }
{ Evento Parada Crítica }
MessageBeep(16);
{ Evento Pergunta }
MessageBeep(32);
{ Evento Exclamação }
MessageBeep(48);
{ Evento Asterisco }
MessageBeep(64);
Marcadores:
Como usar eventos de som do windows
Como tocar sons wav
{Para reproduzir sons no formato WAV em um programa em Delphi é simples, o usuário deverá colocar na clásula Uses o MMSystem. E no corpo do programa o comando:}
SndPlaySound('C:WindowsMediaSom.wav',SND_ASYNC);
SndPlaySound('C:WindowsMediaSom.wav',SND_ASYNC);
Como rodar videos em um panel
Begin
if opendialog1.execute then
begin
mediaplayer1.filename:= opendialog1.filename;
mediaplayer1.open;
mediaplayer1.Perform (wm_lbuttondown,0,$00090009);
mediaplayer1.Perform (wm_lbuttonup,0,$00090009);
end;
end;
if opendialog1.execute then
begin
mediaplayer1.filename:= opendialog1.filename;
mediaplayer1.open;
mediaplayer1.Perform (wm_lbuttondown,0,$00090009);
mediaplayer1.Perform (wm_lbuttonup,0,$00090009);
end;
end;
Reproduzir um arquivo wav
//Inclua na seção uses: MMSystem
PlaySound('C:ArqSom.wav', 1, SND_ASYNC);
Observações
//Troque o nome do arquivo (C:ArqSom.wav) pelo arquivo desejado
PlaySound('C:ArqSom.wav', 1, SND_ASYNC);
Observações
//Troque o nome do arquivo (C:ArqSom.wav) pelo arquivo desejado
Executar um avi no form
Procedure TForm1.BitBtn1Click(Sender: TObject);
begin
with MediaPlayer1 do
begin
FileName := 'c:windowshelpscroll.avi';
Open;
Display := Form2;
Form2.Show;
Play;
end;
end;
begin
with MediaPlayer1 do
begin
FileName := 'c:windowshelpscroll.avi';
Open;
Display := Form2;
Form2.Show;
Play;
end;
end;
terça-feira, 10 de novembro de 2009
Transformando ícone (xxx.ico) em bitmap (xxx.bmp)
VAR
Pic : TPicture;
TI : TIcon;
BEGIN
TI := TIcon.Create;
TI.Handle := ExtractIcon(HInstance, FileNameBuf, 0);
Pic := TPicture.Create;
Pic.Icon := TI;
Image1.Picture := Pic; {TImage}
BitBtn1.Glyph := TBitmap.Create;
WITH BitBtn1.Glyph DO
BEGIN
width := TI.Width;
Height := TI.Height;
Canvas.Draw(0, 0, Pic.Icon);
END;
END;
P.1039
Pic : TPicture;
TI : TIcon;
BEGIN
TI := TIcon.Create;
TI.Handle := ExtractIcon(HInstance, FileNameBuf, 0);
Pic := TPicture.Create;
Pic.Icon := TI;
Image1.Picture := Pic; {TImage}
BitBtn1.Glyph := TBitmap.Create;
WITH BitBtn1.Glyph DO
BEGIN
width := TI.Width;
Height := TI.Height;
Canvas.Draw(0, 0, Pic.Icon);
END;
END;
P.1039
Como criptografar imagens
Procedure cripto(const BMP: TBitmap; Key: Integer);
var
BytesPorScan: Integer;
w, h: integer;
p: pByteArray;
begin
try
BytesPorScan := Abs(Integer(BMP.ScanLine[1]) -
Integer(BMP.ScanLine[0]));
except
raise Exception.Create('Erro !');
end;
RandSeed := Key;
for h := 0 to BMP.Height - 1 do
begin
P := BMP.ScanLine[h];
for w := 0 to BytesPorScan - 1 do
P^[w] := P^[w] xor Random(256);
end;
end;
{ Agora vamos ao evento onclick do Button chamar a nossa procedure cripto, basta digitar o seguinte código:}
procedure TForm1.Button1Click(Sender: TObject);
begin
cripto(Image1.Picture.Bitmap, 1);
Image1.Refresh;
end;
{
Ao chamar a rotina passamos como parâmetro o caminho da imagem que no exemplo foi utilizado o componente image e 1 como um valor inteiro para retornamos a imagem normal, logo após a execução da nossa procedure atualizamos o image para que ele possa exibir nossa imagem criptografada.
}
var
BytesPorScan: Integer;
w, h: integer;
p: pByteArray;
begin
try
BytesPorScan := Abs(Integer(BMP.ScanLine[1]) -
Integer(BMP.ScanLine[0]));
except
raise Exception.Create('Erro !');
end;
RandSeed := Key;
for h := 0 to BMP.Height - 1 do
begin
P := BMP.ScanLine[h];
for w := 0 to BytesPorScan - 1 do
P^[w] := P^[w] xor Random(256);
end;
end;
{ Agora vamos ao evento onclick do Button chamar a nossa procedure cripto, basta digitar o seguinte código:}
procedure TForm1.Button1Click(Sender: TObject);
begin
cripto(Image1.Picture.Bitmap, 1);
Image1.Refresh;
end;
{
Ao chamar a rotina passamos como parâmetro o caminho da imagem que no exemplo foi utilizado o componente image e 1 como um valor inteiro para retornamos a imagem normal, logo após a execução da nossa procedure atualizamos o image para que ele possa exibir nossa imagem criptografada.
}
Obtendo o próximo dia útil caso a data informada caia em um fim de semana
Function ProximoDiaUtil (dData : TDateTime) : TDateTime;
begin
if DayOfWeek(dData) = 7 then
dData := dData + 2
else
if DayOfWeek(dData) = 1 then
dData := dData + 1;
ProximoDiaUtil := dData;
end;
begin
if DayOfWeek(dData) = 7 then
dData := dData + 2
else
if DayOfWeek(dData) = 1 then
dData := dData + 1;
ProximoDiaUtil := dData;
end;
Como saber quantas paginas vão ser impressas com quickrep
{Essa é uma dica muito útil!
Antes do .PREVIEW ou .PRINT do relatório, colocar a seguinte rotina:}
QuickReport.Prepare;
QuickReport.QRLabel.Caption := IntToStr(QuickReport.QRPrinter.PageCount);
d//epois é só enviar um
QuickReport.Print;
//ou
QuickReport.Preview;
Antes do .PREVIEW ou .PRINT do relatório, colocar a seguinte rotina:}
QuickReport.Prepare;
QuickReport.QRLabel.Caption := IntToStr(QuickReport.QRPrinter.PageCount);
d//epois é só enviar um
QuickReport.Print;
//ou
QuickReport.Preview;
Como saber quantos dias tem no mes
Function TForm1.AnoBiSexto(Ayear: Integer): Boolean;
begin
// Verifica se o ano é Bi-Sexto
Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or
(AYear mod 400 = 0));
end;
function TForm1.DiasPorMes(Ayear, AMonth: Integer): Integer;
const DaysInMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
Result := DaysInMonth[AMonth];
if (AMonth = 2) and AnoBiSexto(AYear) then
Inc(Result);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntToStr(DiasPorMes(1999, 10));
end;
begin
// Verifica se o ano é Bi-Sexto
Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or
(AYear mod 400 = 0));
end;
function TForm1.DiasPorMes(Ayear, AMonth: Integer): Integer;
const DaysInMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
Result := DaysInMonth[AMonth];
if (AMonth = 2) and AnoBiSexto(AYear) then
Inc(Result);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntToStr(DiasPorMes(1999, 10));
end;
Descobrir se uma data é fim do mês
//Inclua na seção uses: SysUtils
{ Esta função retorna true se a data passada como parâmetro é fim de mês. Retorna false caso contrário. }
function tbFimDoMes(const Data: TDateTime): boolean;
var
Ano, Mes, Dia: Word;
begin
DecodeDate(Data +1, Ano, Mes, Dia);
Result := Dia = 1;
end;
{ Esta função retorna true se a data passada como parâmetro é fim de mês. Retorna false caso contrário. }
function tbFimDoMes(const Data: TDateTime): boolean;
var
Ano, Mes, Dia: Word;
begin
DecodeDate(Data +1, Ano, Mes, Dia);
Result := Dia = 1;
end;
Como incrementar 1 mês numa data
IncMonth(Data, 1);
//a variável Data é do tipo TDateTime.
//obs: para decrementar basta usar assim:
IncMonth(Data, -1);
//a variável Data é do tipo TDateTime.
//obs: para decrementar basta usar assim:
IncMonth(Data, -1);
Como saber se o ano é bisexto
Function TForm1.AnoBiSexto(Ayear: Integer): Boolean;
begin
Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or
(AYear mod 400 = 0));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if AnoBiSexto(1999) Then
ShowMessage('Ano de 1999 é Bisexto')
Else ShowMessage('Ano de 1999 não é Bisexto');
end;
begin
Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or
(AYear mod 400 = 0));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if AnoBiSexto(1999) Then
ShowMessage('Ano de 1999 é Bisexto')
Else ShowMessage('Ano de 1999 não é Bisexto');
end;
Como formatar data para exibição por extenso
{O Delphi permite formatar datas para apresentação por extenso de forma bastante simples. Vejamos os seguintes exemplos:
Para formatar a data 18/03/1999, podemos utilizar:
No create do form colocar}
Shortdateformat:=
dddd, dd/mm/yyyy = Quinta, 18/03/1999
dd/mmm/yyyy = 18/Mar/1999
dddd, dd" de "mmmm" de "yyyy = Quinta, 18 de Março de 1999
dd" de "mmmm" de "yyyy, dddd = 18 de Março de 1999, Quinta
Para formatar a data 18/03/1999, podemos utilizar:
No create do form colocar}
Shortdateformat:=
dddd, dd/mm/yyyy = Quinta, 18/03/1999
dd/mmm/yyyy = 18/Mar/1999
dddd, dd" de "mmmm" de "yyyy = Quinta, 18 de Março de 1999
dd" de "mmmm" de "yyyy, dddd = 18 de Março de 1999, Quinta
Marcadores:
Como formatar data para exibição por extenso
Como acrescentar dias uteis a uma data
Function Datafinal(dataini:tdatetime; dias_uteis:integer):tdatetime;
//
// Retorna uma data acresçida de mais um certo número de dias
// uteis descontando os fins de semana
//
var dw:integer;
begin
dw := DayOfWeek(dataini)-1;
result := dataini+dias_uteis+((dias_uteis-1+dw) div 5)*2;
end;
//
// Retorna uma data acresçida de mais um certo número de dias
// uteis descontando os fins de semana
//
var dw:integer;
begin
dw := DayOfWeek(dataini)-1;
result := dataini+dias_uteis+((dias_uteis-1+dw) div 5)*2;
end;
Marcadores:
Como acrescentar dias uteis a uma data
Como converte hora (formato hh:mm) para minutos
Function HoraToMin(Hora: String): Integer;
begin
Result := (StrToInt(Copy(Hora,1,2))*60) + StrToInt(Copy(Hora,4,2));
end;
begin
Result := (StrToInt(Copy(Hora,1,2))*60) + StrToInt(Copy(Hora,4,2));
end;
Marcadores:
Como converte hora (formato hh:mm) para minutos
Como saber se a impressora está ativa
//Na sua unit, faça a chamada abaixo:
While not PrinterOnline() do
begin
MsgBox('Verifique a Impressora!','ATENÇÃO');
end;
Function PrinterOnLine : Boolean;
Const
PrnStInt : Byte = $17;
StRq : Byte = $02;
PrnNum : Word = 0; { 0 para LPT1, 1 para LPT2, etc. }
Var
nResult : byte;
Begin (* PrinterOnLine*)
Asm
mov ah,StRq;
mov dx,PrnNum;
Int $17;
mov nResult,ah;
end;
PrinterOnLine := (nResult and $80) = $80;
End;
While not PrinterOnline() do
begin
MsgBox('Verifique a Impressora!','ATENÇÃO');
end;
Function PrinterOnLine : Boolean;
Const
PrnStInt : Byte = $17;
StRq : Byte = $02;
PrnNum : Word = 0; { 0 para LPT1, 1 para LPT2, etc. }
Var
nResult : byte;
Begin (* PrinterOnLine*)
Asm
mov ah,StRq;
mov dx,PrnNum;
Int $17;
mov nResult,ah;
end;
PrinterOnLine := (nResult and $80) = $80;
End;
Marcadores:
Como saber se a impressora está ativa
Imprimir relatórios em html
//Em vez de Quickreport1.Print, faca:
QuickRep1.ExportToFilter(TQRHtmlExportFilter.Create('teste.html'));
QuickRep1.ExportToFilter(TQRHtmlExportFilter.Create('teste.html'));
Imprimir no delphi como no dos
//No evento de onbeforeprint, faça
QuickReport1.font.name:='Draft 10Cpi';
QuickReport1.font.name:='Draft 10Cpi';
Imprimir direto para impressora
Procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
i : integer;
begin
AssignFile(F,'LPT1');
Rewrite(F);
i := 0;
Writeln(F,'Teste de impressao - Linha 0');
Writeln(F,'Teste de impressao - Linha 1');
Writeln(F,#27#15+'Teste de Impressão - Linha 2');
Writeln(F,'Teste de impressao - Linha 3');
Writeln(F,#27#18+'Teste de Impressão - Linha 4');
Writeln(F,'Teste de impressao - Linha 5');
Writeln(F,#12); // Ejeta a página
CloseFile(F);
end;
var
F : TextFile;
i : integer;
begin
AssignFile(F,'LPT1');
Rewrite(F);
i := 0;
Writeln(F,'Teste de impressao - Linha 0');
Writeln(F,'Teste de impressao - Linha 1');
Writeln(F,#27#15+'Teste de Impressão - Linha 2');
Writeln(F,'Teste de impressao - Linha 3');
Writeln(F,#27#18+'Teste de Impressão - Linha 4');
Writeln(F,'Teste de impressao - Linha 5');
Writeln(F,#12); // Ejeta a página
CloseFile(F);
end;
Como saber quantas paginas vão ser impressas com quickrep
{Essa é uma dica muito útil!
Antes do .PREVIEW ou .PRINT do relatório, colocar a seguinte rotina:}
QuickReport.Prepare;
QuickReport.QRLabel.Caption := IntToStr(QuickReport.QRPrinter.PageCount);
d//epois é só enviar um
QuickReport.Print;
//ou
QuickReport.Preview;
Antes do .PREVIEW ou .PRINT do relatório, colocar a seguinte rotina:}
QuickReport.Prepare;
QuickReport.QRLabel.Caption := IntToStr(QuickReport.QRPrinter.PageCount);
d//epois é só enviar um
QuickReport.Print;
//ou
QuickReport.Preview;
Retorna o nome da impressora padrão do windows
Function GetDefaultPrinterName : string;
begin
if(Printer.PrinterIndex >= 0)then
begin
Result := Printer.Printers[Printer.PrinterIndex];
end
else
begin
Result := 'Nenhuma impressora Padrão foi detectada';
end;
end;
begin
if(Printer.PrinterIndex >= 0)then
begin
Result := Printer.Printers[Printer.PrinterIndex];
end
else
begin
Result := 'Nenhuma impressora Padrão foi detectada';
end;
end;
Marcadores:
Retorna o nome da impressora padrão do windows
Código usados pelas impressoras hp
{Veja abaixo alguns códigos usados pelas impressoras HP:
RESET = 027/069
BOLD1 = 027/040/115/051/066
BOLD0 = 027/040/115/048/066
ITALIC1 = 027/040/115/049/083
ITALIC0 = 027/040/115/048/083
UNDERLINE1 = 027/038/100/049/068
UNDERLINE0 = 027/038/100/064
LPI6 = 027/038/108/054/068
LPI8 = 027/038/108/056/068
CPI5 = 027/040/115/053/072
CPI6 = 027/040/115/054/072
CPI8 = 027/040/115/056/072
CPI10 = 027/040/115/049/048/072
CPI12 = 027/040/115/049/050/072
CPI17 = 027/040/115/049/054/046/054/055/072
CPI20 = 027/040/115/050/048/072
}
RESET = 027/069
BOLD1 = 027/040/115/051/066
BOLD0 = 027/040/115/048/066
ITALIC1 = 027/040/115/049/083
ITALIC0 = 027/040/115/048/083
UNDERLINE1 = 027/038/100/049/068
UNDERLINE0 = 027/038/100/064
LPI6 = 027/038/108/054/068
LPI8 = 027/038/108/056/068
CPI5 = 027/040/115/053/072
CPI6 = 027/040/115/054/072
CPI8 = 027/040/115/056/072
CPI10 = 027/040/115/049/048/072
CPI12 = 027/040/115/049/050/072
CPI17 = 027/040/115/049/054/046/054/055/072
CPI20 = 027/040/115/050/048/072
}
Como retorna a porcentagem de um valor
Function calcprcento(valor:real;porcent:Real):real;
begin
percent := porcent / 100;
try
valor := valor * Percent;
finally
result := valor;
end;
end;
begin
percent := porcent / 100;
try
valor := valor * Percent;
finally
result := valor;
end;
end;
Marcadores:
Como retorna a porcentagem de um valor
Colocar zeros a esquerda de um valor edit
Procedure TForm1.Edit1Exit(Sender: TObject);
begin
Edit1.Text := FormatFloat('000000',StrToFloat(Edit1.Text));
end;
begin
Edit1.Text := FormatFloat('000000',StrToFloat(Edit1.Text));
end;
Marcadores:
Colocar zeros a esquerda de um valor edit
Como desabilitar a tela de abertura do delphi
No Windows, a partir do atalho para o programa, entre em Propriedades e inclua -ns ao final da linha de comando.
Marcadores:
Como desabilitar a tela de abertura do delphi
Como deixar tudo maiusculo
{FormKeyPress:=True}
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
Key := AnsiUpperCase(Key)[Length(Key)];
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
Key := AnsiUpperCase(Key)[Length(Key)];
end;
Usando o esc para sair
{TForm1.FormKeyDown}
case key of
vk_Escape: entrada.close;
end;
begin
case key of
vk_Escape: Table1.cancel;
end;
end;
case key of
vk_Escape: entrada.close;
end;
begin
case key of
vk_Escape: Table1.cancel;
end;
end;
Como trocar enter por tab
{TForm1.FormKeyPress}
if key= #13 then
begin
Perform (CM_DialogKey, VK_TAB, 0);
key:=#0;
end;
if key= #13 then
begin
Perform (CM_DialogKey, VK_TAB, 0);
key:=#0;
end;
Como deletar registro
{Button.click}
if MessageDlg('Deseja Excluir Este Registro?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
Table1.Delete;
end;
if MessageDlg('Deseja Excluir Este Registro?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
Table1.Delete;
end;
Tdbgrid com linhas coloridas
V{amos incrementar o TDBGrid de uma Table usando algumas linhas colo-
ridas para evidenciar algumas características de um ou outro registro,
uma idéia simples seria destacar os clientes especiais...
Abaixo esta um procedimento para ser ligado no OnDrawDataCell ...}
procedure TMDIChild.DBGrid1DrawDataCell(Sender: TObject;
const Rect: TRect;
Field: TField;
State: TGridDrawState);
begin
if Table1.FieldByName('SPECIAL').asBoolean then
begin
DBGrid1.Canvas.Brush.Color := clAqua;
DBGrid1.Canvas.Font.Color := clBtnText;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,
Rect.Top+2,
Field.Text);
end;
end;
Na linha :
if Table1.FieldByName('SPECIAL').asBoolean then begin
//vc pode colocar qualquer verificação para identificar um
//determinado registro. Nas linhas seguintes ...
DBGrid1.Canvas.Brush.Color := clAqua;
DBGrid1.Canvas.Font.Color := clBtnText;
{vc determina as características que quer alterar para destacar essa linha, note que vc pode trocar outras características e não somente o que
estou mostrando nesse exemplo, que é apenas "básico" :)...
Em Delphi 2 ou 3 ... ainda não vi no 4 você deve usar o evento:}
OnDrawColumnCell
{O evento OnDrawDataCell tornou-se obsoleto e foi mantido apenas paramanter a compatibilidade com versões anteriores do Delphi.}
ridas para evidenciar algumas características de um ou outro registro,
uma idéia simples seria destacar os clientes especiais...
Abaixo esta um procedimento para ser ligado no OnDrawDataCell ...}
procedure TMDIChild.DBGrid1DrawDataCell(Sender: TObject;
const Rect: TRect;
Field: TField;
State: TGridDrawState);
begin
if Table1.FieldByName('SPECIAL').asBoolean then
begin
DBGrid1.Canvas.Brush.Color := clAqua;
DBGrid1.Canvas.Font.Color := clBtnText;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,
Rect.Top+2,
Field.Text);
end;
end;
Na linha :
if Table1.FieldByName('SPECIAL').asBoolean then begin
//vc pode colocar qualquer verificação para identificar um
//determinado registro. Nas linhas seguintes ...
DBGrid1.Canvas.Brush.Color := clAqua;
DBGrid1.Canvas.Font.Color := clBtnText;
{vc determina as características que quer alterar para destacar essa linha, note que vc pode trocar outras características e não somente o que
estou mostrando nesse exemplo, que é apenas "básico" :)...
Em Delphi 2 ou 3 ... ainda não vi no 4 você deve usar o evento:}
OnDrawColumnCell
{O evento OnDrawDataCell tornou-se obsoleto e foi mantido apenas paramanter a compatibilidade com versões anteriores do Delphi.}
Criar arquivo em tempo de execução
{Criar um arquivo em tempo de execução é relativamente simples, vc tem que criar uma instancia do objeto TTable, esse objeto (de uma lida no Help TTable e suas propriedades e métodos) tem um método de criação e um de Criar tabela.
Depois disso é só definir as propriedades da nova tabela ...}
DatabaseName := 'c:lista';
TableName := 'Produtos.dbf';
TableType := ttDbase;
os campos da tabela ...
Add('codigo', ftString,7, false);
Add('Nome', ftString, 45, false);
e os indices ...
Add('prod1', 'codigo', []);
Add('prod2', 'Fornecedor', []);
com todos os dados devidamente setados ...
CreateTable;
Procedure TMainForm.Inicializa;
var
Table1 : TTable;
begin
{ Criar componente TTable }
Table1 := TTable.create(Application);
{ Definições de Campos e criação do arquivo }
with Table1 do
begin
DatabaseName := 'c:lista';
TableName := 'Produtos.dbf';
TableType := ttDbase;
with FieldDefs do
begin
Clear;
Add('codigo', ftString,7, false);
Add('Nome', ftString, 45, false);
Add('Fornecedor', ftString, 5,false );
Add('Custo', ftCurrency, 0, false );
Add('Venda', ftCurrency, 0, false );
end;
with IndexDefs do
begin
Clear;
Add('prod1', 'codigo', []);
Add('prod2', 'Fornecedor', []);
end;
CreateTable;
end;
end;
{Utilizando o tipo ftCurrency, formato de valores do sistema financeiro o Delphi cria um campo Dbase com N,20,4}
Depois disso é só definir as propriedades da nova tabela ...}
DatabaseName := 'c:lista';
TableName := 'Produtos.dbf';
TableType := ttDbase;
os campos da tabela ...
Add('codigo', ftString,7, false);
Add('Nome', ftString, 45, false);
e os indices ...
Add('prod1', 'codigo', []);
Add('prod2', 'Fornecedor', []);
com todos os dados devidamente setados ...
CreateTable;
Procedure TMainForm.Inicializa;
var
Table1 : TTable;
begin
{ Criar componente TTable }
Table1 := TTable.create(Application);
{ Definições de Campos e criação do arquivo }
with Table1 do
begin
DatabaseName := 'c:lista';
TableName := 'Produtos.dbf';
TableType := ttDbase;
with FieldDefs do
begin
Clear;
Add('codigo', ftString,7, false);
Add('Nome', ftString, 45, false);
Add('Fornecedor', ftString, 5,false );
Add('Custo', ftCurrency, 0, false );
Add('Venda', ftCurrency, 0, false );
end;
with IndexDefs do
begin
Clear;
Add('prod1', 'codigo', []);
Add('prod2', 'Fornecedor', []);
end;
CreateTable;
end;
end;
{Utilizando o tipo ftCurrency, formato de valores do sistema financeiro o Delphi cria um campo Dbase com N,20,4}
Procedimentos com parâmetros opcionais:
{Quando você declara o procedimento:
procedure Esperar(Segundos: Byte);
você está determinando que todas as vezes que o procedimento Esperar for chamado, deverá ser passado um valor do tipo Byte. No entanto, esse tipo de declaração exige que em todas as chamadas ao procedimento Esperar seja especificado um parâmetro. Se você fizer uma chamada do tipo:}
procedure TForm1.Button1Click(Sender: TObject);
begin
Esperar()
end;
{será gerado um erro do tipo: Not enough actual parameters. Mas você pode declarar e implementar o procedimento da seguinte forma:}
procedure Esperar(Segundos: Byte = 1);
begin
Sleep(Segundos * 1000);
end;
{A declaração acima faz com que o procedimento Esperar assuma o valor 1 caso nenhum parâmetro seja passado. Assim você poderá fazer uma chamada ao procedimento em qualquer das situações abaixo:}
procedure TForm1.Button1Click(Sender: TObject);
begin
Esperar(); // nenhum parâmetro, será assumido o valor 1
Esperar(1);
Esperar // nenhum parâmetro, será assumido o valor 1
end;
{Como usar a cláusula UNION em um Query:
O uso do componente TQuery gera muitas vantagens e economiza muitas linhas de programação. Mas muitas vezes nos deparamos com situações que parecem não ser resolvidas com sentenças SQL. Vejamos um exemplo:
Você possui 2 tabelas (VendasExternas e VendasInternas) e deseja fazer um resumo de todas as vendas de um vendedor chamado Marcos. Se você usar a sentença}
SELECT Nome, Valor FROM VendasExternas, VendasInternas
WHERE Nome = 'Marcos'
{você vai obter como resultado uma query com 4 campos (Nome, Valor, Nome_1 e Valor_1) e um resultado bem confuso para ser manipulado.
Para resolver o problema, você poderá usar a sentença}
SELECT Nome, Valor FROM VendasExternas
WHERE Nome = 'Marcos'
UNION ALL
SELECT Nome, Valor FROM VendasInternas
WHERE Nome = 'Marcos'
{A sentença acima pede para que sejam identificados as vendas de Marcos na tabela VendasExternas, as vendas de Marcos na tabela VendasInternas e que o resultado da primeira seja unido com o resultado da segunda produzindo uma query com apenas 2 colunas.}
procedure Esperar(Segundos: Byte);
você está determinando que todas as vezes que o procedimento Esperar for chamado, deverá ser passado um valor do tipo Byte. No entanto, esse tipo de declaração exige que em todas as chamadas ao procedimento Esperar seja especificado um parâmetro. Se você fizer uma chamada do tipo:}
procedure TForm1.Button1Click(Sender: TObject);
begin
Esperar()
end;
{será gerado um erro do tipo: Not enough actual parameters. Mas você pode declarar e implementar o procedimento da seguinte forma:}
procedure Esperar(Segundos: Byte = 1);
begin
Sleep(Segundos * 1000);
end;
{A declaração acima faz com que o procedimento Esperar assuma o valor 1 caso nenhum parâmetro seja passado. Assim você poderá fazer uma chamada ao procedimento em qualquer das situações abaixo:}
procedure TForm1.Button1Click(Sender: TObject);
begin
Esperar(); // nenhum parâmetro, será assumido o valor 1
Esperar(1);
Esperar // nenhum parâmetro, será assumido o valor 1
end;
{Como usar a cláusula UNION em um Query:
O uso do componente TQuery gera muitas vantagens e economiza muitas linhas de programação. Mas muitas vezes nos deparamos com situações que parecem não ser resolvidas com sentenças SQL. Vejamos um exemplo:
Você possui 2 tabelas (VendasExternas e VendasInternas) e deseja fazer um resumo de todas as vendas de um vendedor chamado Marcos. Se você usar a sentença}
SELECT Nome, Valor FROM VendasExternas, VendasInternas
WHERE Nome = 'Marcos'
{você vai obter como resultado uma query com 4 campos (Nome, Valor, Nome_1 e Valor_1) e um resultado bem confuso para ser manipulado.
Para resolver o problema, você poderá usar a sentença}
SELECT Nome, Valor FROM VendasExternas
WHERE Nome = 'Marcos'
UNION ALL
SELECT Nome, Valor FROM VendasInternas
WHERE Nome = 'Marcos'
{A sentença acima pede para que sejam identificados as vendas de Marcos na tabela VendasExternas, as vendas de Marcos na tabela VendasInternas e que o resultado da primeira seja unido com o resultado da segunda produzindo uma query com apenas 2 colunas.}
Marcadores:
Procedimentos com parâmetros opcionais:
Zerar campo autoincremento:
{Quanto trabalhamos com tabelas Paradox e apagamos o seus registros, o contador do campo AutoIncremento não é zerado, criando muitas vezes um grande inconveniente. Para resolver esse problema, use a seguinte função:}
function ResetAutoInc(FileName: TFileName; Base: Longint): Boolean;
begin
with TFileStream.Create(FileName, fmOpenReadWrite) do
Result := (Seek($49, soFromBeginning) = $49) and (Write(Base, 4) = 4);
end;
{O parâmetro FileName é o nome da tabela, incluindo o caminho. E o parâmetro Base é o valor inicial para o contador do AutoIncremento.}
function ResetAutoInc(FileName: TFileName; Base: Longint): Boolean;
begin
with TFileStream.Create(FileName, fmOpenReadWrite) do
Result := (Seek($49, soFromBeginning) = $49) and (Write(Base, 4) = 4);
end;
{O parâmetro FileName é o nome da tabela, incluindo o caminho. E o parâmetro Base é o valor inicial para o contador do AutoIncremento.}
Como justificar 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;
{$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;
Como pegar a data de um arquivo
Unit SysUtils
var
DataArq: TDateFile;
begin
DataArq:= FileDateToDateTime(FileAge('NomeDoArquivo'));
end;
var
DataArq: TDateFile;
begin
DataArq:= FileDateToDateTime(FileAge('NomeDoArquivo'));
end;
Resolução de vídeo:
{Quando criamos formulários, ãs vezes é útil escrever um código para que a tela etodos os seus objetos sejam mostrados no mesmo tamanho, não importando qual a resolução da tela. Aqui esta um código que mostra como isso é feito: }
Implementation
const
ScreenWidth: LongInt = 800; {I designed my form in 800x600 mode.}
ScreenHeight: LongInt = 600;
{$R *.DFM}
procedure TForm1.FormCreate (Sender: Tobject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height) DIV ScreenHeight;
width := longint(width) * longint(screen.width) DIV ScreenWidth;
scaleyBy(screen.width, ScreenWidth);
end;
end;
{Agora, você vai querer checar, se o tamanho dos fontes(de letra) estão OK. Antes de trocar p tamanho do fonte, você precisará ter certeza de que o objeto realmente tem a propriedade fonte pela checagem da RTTI. Isso pode ser feito assim:}
USES tyinfo; {Add this to your USES statement.}
var
i:integer;
begin
for i := componentCount - 1 downto 0 do
with components[i] do
begin
if GetPropInfo(ClassInfo, ´font´) <> nil then
font.size := (NewFormWidth DIV OldFormWidth) * font.size;
end;
end;
{Esta é a maneira longa de fazer a mesma coisa}
var
i:integer;
p:PPropInfo;
begin
for i := componentCount - 1 downto 0 do
with components [i] do
begin
p := GetPropInfo (ClassInfo, ´font´);
if assigned (p) then
font.size := (NewFormWidth DIV OldFormWidth) * font.size;
end;
end;
{Atenção: Nem todos os objetos tem a propriedade FONT. Isso deve ser o suficiente para você começar.}
Implementation
const
ScreenWidth: LongInt = 800; {I designed my form in 800x600 mode.}
ScreenHeight: LongInt = 600;
{$R *.DFM}
procedure TForm1.FormCreate (Sender: Tobject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height) DIV ScreenHeight;
width := longint(width) * longint(screen.width) DIV ScreenWidth;
scaleyBy(screen.width, ScreenWidth);
end;
end;
{Agora, você vai querer checar, se o tamanho dos fontes(de letra) estão OK. Antes de trocar p tamanho do fonte, você precisará ter certeza de que o objeto realmente tem a propriedade fonte pela checagem da RTTI. Isso pode ser feito assim:}
USES tyinfo; {Add this to your USES statement.}
var
i:integer;
begin
for i := componentCount - 1 downto 0 do
with components[i] do
begin
if GetPropInfo(ClassInfo, ´font´) <> nil then
font.size := (NewFormWidth DIV OldFormWidth) * font.size;
end;
end;
{Esta é a maneira longa de fazer a mesma coisa}
var
i:integer;
p:PPropInfo;
begin
for i := componentCount - 1 downto 0 do
with components [i] do
begin
p := GetPropInfo (ClassInfo, ´font´);
if assigned (p) then
font.size := (NewFormWidth DIV OldFormWidth) * font.size;
end;
end;
{Atenção: Nem todos os objetos tem a propriedade FONT. Isso deve ser o suficiente para você começar.}
Assinar:
Postagens (Atom)