Super Dicas Delphi parte I
Para fazer protetor de tela com o Delphi
A) No .Dpr ponha {$D SCRNSAVE } depois do uses
B) No Form principal nao ponha borda ou icone. No metodo Activate ponha left
e top como 0 e o Windowstate como wsMaximize.
C) no form.Create ponha application.OnMessage para um metodo que controle a
desativacao do screen saver. Ponha tb o application.OnIdle para "rodar" o
dito cujo...
D) Tb no Form.Create teste a linha de comando para /c ou /s. Estes
parametros dizem o que e' para fazer (/c configura)
E) Compile e renomeie o .exe p/ .scr, move para o diretorio do windows e...
Linkar um OBJ ao executável
Primeiro voce deve "linkar" o OBJ ao seu executavel. No Delphi , isto eh
feito com a diretriz de compilacao $L. Fica, na sua unit principal, assim:
{$L MyOBject.OBJ}
Incluindo as chaves.
Logo depois, voce deve declarar a funcao contida em MyObject.OBJ da forma
usual. Voce precisara conhecer os parametros usados pela mesma, bem como o
tipo e a ordem em que sao passados. Voce deve incluir tambem a diretriz
PASCAL ou CDECL. Sugiro tentar primeiro com PASCAL. Ficaria assim (na
secao implementation:
function (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2):
TipoDoRetorno; pascal;
se nao der certo, tente:
function (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2):
TipoDoRetorno; cdecl;
caso nao seja uma funcao e sim uma procedure, tente
procedure (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2);
pascal;
ou
procedure (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2);
cdecl;
Se voce nao sabe quais os parametros usados pela funcao/procedure, uma
solucao seria linkar o seu OBJ num programa qualquer e disassembla-lo. Ai
pelo menos voce sabera a quantidade e o tipo de cada parametro. De qualquer
forma, para saber para que serve cada um, tera que ser na tentativa e
erro...a nao ser que voce tambem tenha paciencia para analisar o codigo
disassemblado.
OBS: Se o seu OBJ nao estiver num formato reconhecivel pelo LINK do Delphi
(um formato similar ao COFF), voce pode tentar outros Linkers, e criar uma
dll. Existem varios linkers gratuitos, que reconhecem varios formatos
(exemplos, sao lcclnk, djlnk, walk2lnk e o proprio linker da
microsoft...tambem gratuito).
Alterar LOCAL SHARE via programação
Olha Junior no WIN 95 você pode alterar diretamente a chave do registro
que seta esta opção. Fica em HKEY_LOCAL_MACHINE > Software > ... LOCAL SHARE "TRUE"
(Pesquise com o regedit). Já no WIN 3.xxx eu também gostaria de saber. Não encontrei
referências de como fazer esta aleração utilizando a API do BDE.
Verificando se o Delphi está aberto
Proteja aquele aplicativo ou objeto que vc desenvolveu com esta rotina que
identifica se o usuário está com o Delphi aberto (disponibiliza) ou fechado
(trava a execucao).
Bom proveito !
Function TForm1.JanelaExiste(Classe,Janela:String) :Boolean;
var
PClasse,PJanela : array[0..79] of char;
begin
if Classe = '' then
PClasse[0] := #0
else
StrPCopy(PClasse,Classe);
if Janela = '' then
PJanela[0] := #0
else
StrPCopy(PJanela,Janela);
if FindWindow(PClasse,PJAnela) <> 0 then
result := true
else
Result := false;
end;
Function TForm1.DelphiCarregado : Boolean;
begin
Result := False;
if JanelaExiste('TPropertyInspector','Object Inspector') then
result := True
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if DelphiCarregado then
showmessage('Delphi está ativo, bom menino!')
else
begin
Showmessage('Vc não poderá utilizar esta aplicação! Mau garoto!');
application.terminate;
end;
end;
Criando formulários
Qual a melhor maneira de criar forms em tempo de execucao:
a) Application.CreateForm(TfmClientes, fmClientes);
Cria o Form; o proprietário é a aplicação.
b) fmClientes := TForm.Create(self);
Cria o Form; o proprietário é ele mesmo.
c) fmClientes := TForm.Create(Application);
Cria o Form; o proprietário é a aplicação.
d) fmClientes := TForm.Create(nil);
Cria o Form; teoricamente sem proprietário; na prática é a aplicação.
e) fmClientes := TfmClientes.Create(self);
Cria o Form; o proprietário é ele mesmo.
f) fmClientes := TfmClientes.Create(Application);
Cria o Form; o proprietário é a aplicação.
g) fmClientes := TfmClientes.Create(nil);
Cria o Form; teoricamente sem proprietário; na prática é a aplicação.
Poderiam me informar a diferenca entre elas?
Quando você cria um Form dinamicamente:
1. se criar através de CreateForm, que é um método de TApplication, você passa como parâmetro a instância da classe e o nome do seu objeto (TfmClientes, fmClientes);
2. se criar através de Create - método de TForm, entre outros - você passa como parâmetro o proprietário do componente criado (no caso o Form).
2.1 se o proprietário for a aplicação, o Form só será destruído quando você finalizar o aplicativo
ou se você declarar Free ou Destroy no seu programa; (casos a, c, d, f, g);
2.2 se o proprietário for ele mesmo (self), o form terá que ser destruído por você;
2.3 se você criar, por exemplo, Form2 e passar como proprietário Form1; no momento em que
Form1 for destruído, Form2 também o será.
Quanto à melhor maneira, depende de como você quer controlar a aplicação, mas leve em conta que enquanto um objeto não é destruído, ele está na memória.
Criando alias via programação
Se for para Paradox ...
Session.AddStandardAlias('SeuAlias', edtPath.text, 'Paradox');
Session.SaveConfigFile;
Desabilitar acesso a windows
Ai vai um codigo que peguei no site da Borland que trava as teclas
(Ctrl+Alt+Del),(Alt+Tab), (Ctrl+Esc)
var
OldValue : LongBool;
begin
{liga a trava}
SystemParametersInfo(97, Word(True), @OldValue, 0);
{desliga a trava}
SystemParametersInfo(97, Word(False), @OldValue, 0);
end;
Splash Screen
form2:=tform2.create(application);
form2.show;
form2.update;
.
.
.
form2.hide;
form2.free;
Application.Run;
Obs: apagar a primeira linha, 'Application.Initialize'.
Para saber somente o path da aplicação
ExtractFilePath( Application.ExeName )
Como saber se o aplicativo já foi aberto
Insira o código abaixo dentro do arquivo .DPR de sua aplicação
{$R *.RES}
begin
Application.Title := '';
Application.HelpFile := '';
if HPrevInst = 0 then
begin
F_Splash := TF_Splash.create(Application);
F_Splash.Show;
Application.CreateForm(TF_Menu, F_Menu);
Application.CreateForm(TF_Error, F_Error);
Application.CreateForm(TF_Form1, F_From1);
Application.CreateForm(TF_Form2, F_Form2j);
Application.Run;
end
else
messagedlg('O sistema já foi inicializado!',mtinformation,[mbok],0);
end.
Impressão com o TPrinter ( Via gerenciador de impressão)
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Linha:integer;
Tamanho:integer;
Coluna:integer;
begin
Printer.Orientation := poLandscape;
Printer.BeginDoc;
Printer.Canvas.Pen.Width := 5;
Printer.Canvas.Font.Name := 'Times New Roman';
Printer.Canvas.Font.Size := 10;
Linha := 20;
Coluna:= 20;
Tamanho := Printer.Canvas.TextWidth('a');
Table1.First;
while not Table1.Eof do
begin
if Linha = 20 then
begin
Coluna := 20;
Printer.Canvas.TextOut(0,Linha,'Relação de Clientes');
Linha := Linha - Printer.Canvas.Font.Height + 5 ;
Printer.Canvas.TextOut(Coluna,Linha,'Cod');
Coluna:= Coluna + (Tamanho * 5 );
Printer.Canvas.TextOut(Coluna,Linha,'Nome');
Coluna:= Coluna + (Tamanho * 30);
Printer.Canvas.TextOut(Coluna,Linha,'Endereço');
Coluna:= Coluna + (Tamanho * 30);
Linha := Linha - Printer.Canvas.Font.Height + 5 ;
end;
Coluna := 20 ;
Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName('Codigo').AsString);
Coluna:= Coluna + (Tamanho * 5 );
Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName('Nome').AsString);
Coluna:= Coluna + (Tamanho * 30);
Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName('End').AsString);
Coluna:= Coluna + (Tamanho * 30);
Linha := Linha - Printer.Canvas.Font.Height + 5 ;
Table1.Next;
if Linha > Printer.PageHeight-20 then
Begin
Printer.NewPage;
Linha := 20;
end;
end;
Printer.EndDoc;
end;
Impressão 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;
Definir o tamanho do papel em TPrinter
Esta procedure configura o tamanho do papel em Run-Time para ser utilizado com o objeto TPrinter; Esta procedure deve ser chamada antes de aplicar o método Printer.BeginDoc.
procedure TForm1.SetPrinterPage(Width, Height : LongInt);
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
begin
Printer.GetPrinter(Device, Driver, Port, hDMode);
If hDMode <> 0 then
begin
pDMode := GlobalLock( hDMode );
If pDMode <> nil then
begin
pDMode^.dmPaperSize := DMPAPER_USER;
pDMode^.dmPaperWidth := Width;
pDMode^.dmPaperLength := Height;
pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE;
GlobalUnlock( hDMode );
end;
end;
end;
Como criar Forms em tempo de execução
Para você economizar memória, pode-se criar os forms de sua aplicação somente no momento da execução. Na criação do Form
você define se ele é MODAL ou NÃO MODAL. Para Isso observe os seguintes códigos:
MODAL - Mostra form em modo exclusivo
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);{Carrega form na memória}
Form2.ShowModal;{Mostra form em modo exclusivo}
Form2.Free; {Libera Memória}
end;
NÃO MODAL - Mostra form em modo não exclusivo
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);{Carrega form na memória}
Form2.ShowModal;{Mostra form em modo exclusivo}
end;
No evento OnClose do Form2 coloque o seguinte código.
procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction);
begin
Action:= caFree;
end;
Aliado a este código, deve deve alterar no delphi, no menu Options, opção Project. Mudando os forms a serem criados
dinamicamente da coluna Auto-Create Forms para Avaliable Forms.
Adaptando para resoluções de video diferentes?
Sempre que procurei algo sobre esse tema, ia para no Tip da Borland #2861, que é a mesma informação do arquivo de help da
Loyd's. Esse texto tambem aparece nos bancos de dados da Q&A. Eu suponho que essa seja a informação definitiva. Encontrei
uma informação que não foi mencionada aqui. Pela lista de correiros do Delphi-Talk havia mensagens de Brien King e Michael
Novak que discutiam esse assunto.
***
LOYD´S TIPS:
Resolução de Vídeo:
Quando criamos formulários, ãs vezes é útil escrever um código para que a tela e todos 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.
Atenção: A seguir, algumas dicas para ter em mente quando representar aplicações Delphi (formulários) em diferentes resoluções
de Tela:
* Decida antecipadamente, na etapa de criação do formulário, se ele será escalável ou não. A vantagem de um não escalável é
que nada muda em tempo de execução. A desvantagem é equivalente (seu formulário pode ser muito pequeno ou grande para
alguns sistemas se nào for usada escala).
* Se você não for usar formulário escalável, configure o set scaled to False.
* Ou então, configure a propriedade scaled do formulário para True.
* Configure a propriedade AutoScroll para False. AutoScroll = True quer dizer "não mexa no tamanho do frame do formulário em
tempo de execução", o que não parece bom quando o conteúdo do formulário muda de tamanho.
* Configure a fonte do formulário para uma True Type escalável, como a Arial MS. San Serif é uma boa alternativa, mas lembre que
ainda é uma fonte bitmapped. Só a Arial dará uma fonte dentro de um pixel da altura desejada.ATENÇÃO: Se a fonte usada em
uma aplicação não estiver instalada no computador, o Windows selecionará uma fonte alternativa da mesma família para utilizar. O
tamanho dessa fonte pode não corresponder ao da fonte original, podendo causar problemas.
* Configure a propriedade position do formulário para uma opção diferente de poDesigned. poDesigneddeixa o formulário onde você
o deixou ( no design Time), o que sempre termina fora da margem, à esquerda da minha tela 1280 x 1024 - e completamente fora
da tela 640 x 480.
* Não amontoe controles no formulário - deixe pelo menos 4 pixels entre else, para que uma mudança de um pixel nas margens
(devido a apresentação em escala) não mostre controles sobrepostos.
* Para labels de uma linha alinhadas ã esquerda ou à direita, configure o AutoSize para True. Para outras formas de alinhamento
configure o AutoSize para False.
* Tenha certeza de que há espaço em branco suficiente num componente de labels para alterações no tamanho da fonte - um
espaço de 25% do comprimento da linha de caracteres mostrada é um pouco a mais do que se precisa, mas é mais seguro.
(Você vai precisar de um espaço equivalente a 30% de espansão para string labels se você pretende traduzir sua aplicação para
outra linguagem). Se o Autosize estiver em False, tenha certeza de que realmente configurou o tamanho do label corretamente.
Se o Autosize estiver em True, esteja certo de que há espaço suficiente para que o label se amplie.
* Em labels de múltiplas linhas ou de termos ocultos, deixe pelo menos uma linha em branco na base. Isso vai ser necessário
para incluir o que estiver sobrando quando o texto for oculto de maneira diferente, pela mudança do tamanho da fonte com a
escala. Não assuma isso porque está usando fontes grandes. Você não tem que deixar sobra de texto - as fontes (grandes) de
outros usuários podem ser maiores que as suas!
* Tenha cuidado quando abrir um projeto em IDEs com resoluções diferentes. Assim que o formulário for aberto, sua propriedade
Pixel per Inch será moditificada, e gravada para o DFM se você salvar o projeto. É melhor testar a aplicação rodando sozinho, e
editar o formulário em apenas uma resolução. Editar em várias resoluções e tamanhos de fonte provoca problemas de fluxo e
tamanho dos componentes.
*Falando em fluxo de componentes, não represente o formulário em escala muitas vezes, quando estiver sendo criado ou quando
tiver sendo executado. Cada escala introduz erros de roundoff que se acumulam muito rapidamente, uma vez que as coordenadas
são rigorosamente interias. Quando valores fracionários forem retirados das origens e tamanhos do controle com cada sucessiva
representação em escala, os conttroles parecerão deslizar para noroeste e ficar menores. Se você quer deixar seus usuários
representarem o formulários em escala quantas vezes quiserem, comece com um formulário recentemente criado para que erros
de escala não se acumulem.
* Definitivamente, não mexa na propriedade Pixel pre Inch do formulário.
* Em geral, não é necessário criar formulários em uma resolução específica, mas é essencial que você os revise em 640 x 480
com fontes pequenas e/ou grandes, e em alta resolução com fontes pequenas e/ou grandes antes de liberar suas aplicações. Isso
deverser parte de sua lista de conferência para testar a compatibilidade do sistema regularmente.
* Preste bastante atenção em todos os componentes que são basicamamente TMemo de uma linha - com oTDBLookupCombo. O
controle de edição (multi-linhas) do Windows sempre mostra apenas linhas inteiras de texto. Se o controle for muito curto para
sua fonte, um TMemo não mostrará coisa alguma, e um TEdit mostrará um pedaço do texto. É melhor fazer esses componentes
um pouco maiores do que deixá-los um pixel menores e não aparecer nada do texto.
* Tenha em mente que toda representação em escala é proporcional à diferença da altura da fonte entre o modo de execução e o
modo de desenho, NÃO à resolução ou ao tamanho do monitor. Lembre também que as origens dos seus controles serão
alteradas quando o formulário for representado em escala. Você não pode aumentar componentes muito bem sem também
movê-los um pouco, novamente.
Obtendo e modificando a posição do cursor em um TMemo
Modificando a posição:
ActiveControl:=Memo1;
MemoCursorTo(Memo1,2,3);
Obtendo a Posição:
GetMemoLineCol(Memo1,Linha,Coluna);
Executar um programa do DOS e fechá-lo em seguida
WinExec("command.com /c programa.exe",sw_ShowNormal);