quarta-feira, 19 de janeiro de 2011

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.

terça-feira, 18 de janeiro de 2011

Como executar um avi no form

Crie dois formulários e adicione o componente TmediaPlayer no seu form, depois coloque um botão e adicione o código abaixo no evento onclick do mesmo.

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
with MediaPlayer1 do
begin
   // coloque o path de um avi
   FileName := ' C:\Arquivos de programas\Borland\Delphi6\Demos\CoolStuf\speedis.avi';
   Open;
   Display := Form2;
   Form2.Show;
   Play;
end;
end;

Número de cores aceitas pelo monitor

O código abaixo apresenta a implementação de uma função que retorna o número de cores suportadas pelo monitor.

Esta função baseia-se na utilização de uma API do Windows, chamada GETDC.:

Function QtdeCores : integer;var h : HDC;
begin
Result := 0; try h := GetDC( 0 );
Result :=1 shl ( GetDeviceCaps( h, PLANES ) * GetDeviceCaps( h, BITSPIXEL ));
finally
ReleaseDC( 0, h );
end;
end;

Para executar esta função coloque um objeto edit e um objeto button, no evento onclick do botão insira o seguinte código:

edit1.text:= inttostr(Qtdecores);

Ao clicar no botão o objeto edit recebe a quantidade de cores que o monitor está suportando.

Como mudar a resolução do vídeo via programação

1º Coloque um listbox no form

Modifique o OnCreate do form assim:
 
procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
  DevMode : TDevMode;
begin
  i := 0;
  while EnumDisplaySettings(nil,i,Devmode) do begin
  with Devmode do
  ListBox1.Items.Add(Format('%dx%d %d Colors',
  [dmPelsWidth,dmPelsHeight, 1 shl dmBitsperPel]));
  Inc(i);
  end;
end;
- Coloque um botão no form
- Altere o evento OnClick do botão conforme abaixo:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  DevMode : TDevMode;
begin
  EnumDisplaySettings(nil,Listbox1.ItemIndex,Devmode);
  ChangeDisplaySettings(DevMode,0);
end;

segunda-feira, 17 de janeiro de 2011

Bloquear Mouse e Teclado

Para testar essa dica coloque um Timer sete o interval para 5000 e um Botão e coloque o código abaixo!
O código travará o mouse e teclado por 5 segundos!

Use com cuidado e responsabilidade... Não me venha travar o mouse sem programar uma ação para destravá-lo!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
  Button1: TButton;
  Timer1: TTimer;
  procedure Button1Click(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;
procedure BlockInput(ABlockInput : boolean); stdcall; external 'USER32.DLL';
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
BlockInput(True);
Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
BlockInput(false);
Timer1.Enabled:=false;
end;

end.

Sugestão para tratamento de erros no Delphi / Cliente-Servidor

Todas as vezes que são abertas as tabelas é colocado o comando StartTransaction antes da abertura das mesmas.
Quando acontece algum erro na abertura das tabelas, o Delphi dispara uma mensagem de erro. Este erro pode ter sido provocado por diversos motivos mas é certo que o erro foi de alteração de uma ou mais tabelas no Banco de Dados. é aconselhável que se coloque uma rotina de tratamento de erro listada abaixo: 
- Onde estão as tabelas, coloque as suas tabelas que serão abertas; 
- Onde será mostrada a mensagem coloque uma mensagem qualquer avisando sobre o erro 
try
   if F_Menu.DBSistema.IsSQLBased then 
      F_Menu.DBSistema.StartTransaction;
   Tabela1.Open;
   Tabela2.Open;
   Tabela3.Open;
   Tabela4.Open;
except
   on EDatabaseError do
     if MessageDlg(, mtError, [mbOK], 0) <> mrOK Then
       raise;
     end;
ShowModal;  
Sugestão  Delphi / Oracle  
      Criar uma função que irá verificar qual o código de erro enviado pela exceção e então emitir uma mensagem em português. Abaixo está uma idéia desta rotina que será inserida no formulário principal da sua aplicação.  
procedure TF_Menu.ErrorMsg(Sender : TObject; E: exception);
begin
if e is EDBengineError then
      TrataErro(E as edbEngineError)
else
    application.showException(E);
end;  
procedure TF_Menu.TrataErro(E: eDBEngineError);
var
nSQLError   : integer;
cSQLMessage : string;
cTable      : string;
x           : integer;
begin
    nSQLError := 0;
    cSQLMessage := '';
    for x:=0 to e.ErrorCount -1 do
       if e.errors[x].NativeError <> 0 then
       begin
          nSQLError   := e.errors[x].NativeError;
          cSQLMessage := e.errors[x].message;
       end;
       if nSQLError <> 0 then
       begin
          cTable := '';
          x      := pos('table"',cSQLMessage);
          if x > 0 then
          begin
             cTable := copy(cSQLMessage,x+7,20);
             x      := pos('"',cTable);
             if x > 0 then cTable := copy(cTable,1,x-1);
          end;
       case nSQLError of
               1  : showmessage('Este registro já está cadastrado.');
          2292 : showmessage('Este resgistro não pode ser excluído porque'+#10+
                     'existem outros que dependem dele e que não foram excluídos');
        12203 : showmessage('Base de Dados está fora do ar. Favor entrar'+#10+
                     'em contato com o responsável pela rede na '+#10+
                     'localidade selecionada ou tente mais tarde.');
       else
          showmessage(IntToStr(nSQLError)+' '+cSQLMessage);
       end;
    end
else
    showmessage('Algo errado aconteceu!');
end;
 
procedure TF_Menu.FormCreate(Sender: TObject);
begin
  Application.OnException := ErrorMsg;
end;

Tradução de Mensagens Delphi

Depois de algum tempo pesquisando uma forma de fazer aparecer as mensagens em português, consegui uma solução muito fácil de implementar no ambiente de programação do Delphi 3.
 
CHEGA DE YES/NO !!!
 
messagedlg('Confirma ? mtConfirmation, [mbYes, mbNo], 0);
 
Aí vai:
 
1 - No diretório DELPHI3\LIB, copie o arquivo consts.dcu para consts.old;
2 - Inicie o Delphi e crie um nova Unit;
3 - Insira nesta, o arquivo consts.int do diretório DELPHI3\DOC E faça as devidas alterações nas mensagens que desejares alterar e nas partes duplicadas da Unit como "implement" e etc, também deixe o
cabeçalho como Unit Consts.
4 - Salve esta nova Unit no diretório DELPHI\LIB e pronto todas as mensagens alteradas por você estarão aplicadas nos seus próximos programas sem uma linha de programa e da forma que você quiser.

Linkar um OBJ ao executável

Primeiro você deve "linkar" o OBJ ao seu executável.  No Delphi , isto é feito com a diretriz de compilação $L.  Fica, na sua unit principal, assim:

{$L MyOBject.OBJ}  

Incluindo as chaves.

Logo depois, você deve declarar a função contida em MyObject.OBJ da forma usual.  Você precisara conhecer os parâmetros 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).

Traduzir captions e botões da MESSAGEDLG

Para traduzir algumas as mensagens do Delphi que aparecem nos botões e nas caixas de avisos da função MessageDlg, você necessita dos arquivos de recursos do Delphi (*.RC).
Possuo o Delphi 2 - Developers, que vem acompanhado de alguns destes arquivos de recursos.  No meu caso, eles estão gravados em C:\DELPHI2\SOURCE\VCL.
Os arquivos *.RC são arquivos "só texto", e contêm diversas mensagens utilizadas nos programas compilados no Delphi.  O exemplo que se segue realiza alterações nos arquivos CONSTS.RC e DBCONSTS.RC.  A alteração de outros arquivos "RC" pode ser feita de modo similar.   Para maiores detalhes, envie-me um e-mail (paulosd@dglnet.com.br), ou, melhor ainda, consulte o livro "Dominando o Delphi" (edição para o Delphi 1), de Marcos Cantù, ed. Makron Books.   O assunto "Usando recursos de tabelas de strings" está no capítulo 21, página 876.  Não sei se a edição para o Delphi 2 cobre este assunto.

a) Faça uma cópia dos arquivos CONSTS.RC e DBCONSTS.RC em um diretório seguro, para o caso de algo sair errado.

b) Pelo mesmo motivo, faça uma cópia dos arquivos CONSTS.RES e DBCONSTS.RES, que estão no diretório LIB do Delphi.   No meu caso, o diretório destes arquivos é C:\DELPHI2\LIB.

c) Use o Bloco de Notas para abrir e alterar os arquivos CONSTS.RC e DBCONSTS.RC. (O Edit também serviria;  entretanto, para acentuação correta no Windows, o Bloco de Notas é melhor).

Você só deve alterar as strings que estão entre aspas. Não altere o nome das constantes, que estão no início de cada linha.
Por exemplo, localize o seguinte bloco, em CONSTS.RC:

SCancelButton, "Cancel"
SYesButton, "&Yes"
SNoButton, "&No"

Altere para:

SCancelButton, "Cancelar"
SYesButton, "&Sim"
SNoButton, "&Não"

Não é necessário alterar todas as mensagens.  Se desejar, altere apenas aquelas que você utiliza em seus sistemas.  Lembre-se de salvar as alterações efetuadas.

d) Acione o prompt do DOS, e execute do seguinte modo o compilador de recursos do Delphi 2 (BRC32.EXE), que está no diretório BIN do Delphi (no meu caso, C:\DELPHI2\BIN):

C:\DELPHI2\BIN\BRC32 -R CONSTS.RC
C:\DELPHI2\BIN\BRC32 -R DBCONSTS.RC

(No Delphi 1, o compilador tem o seguinte nome:   BRC.EXE).

e) Os dois comandos anteriores irão gerar os arquivos CONSTS.RES e DBCONSTS.RES.  Copie os dois "*.RES" para o diretório LIB do DELPHI (no meu caso C:\DELPHI2\LIB)

f) Crie uma aplicação no Delphi que utilize a função MessageDlg, e botões "BitBtn".  Ao rodar o seu programa, as mensagens já devem aparecer traduzidas.