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.

Curso de Delphi: 7.Consultas SQL