domingo, 10 de junho de 2012

Colocar os bitmaps na dll

Por vezes, quando iniciamos um projecto, temos uma preocupação: fazer uma aplicação pequena. Bem, a solução pode passar por colocar todos os bitmaps que vamos utilizar numa dll. Então vamos lá começar:

Deve usar o Image Editor, criar uma nova Resource File (.res), neste ficheiro vamos colocar os bitmaps e icons (ambos funcionam da mesma forma) que queremos na nossa aplicação, clique com a tecla direita do rato na nova resource file e crie um novo bitmap, depois desenhe ou cole do clipboard um bitmap, finalmente guarde o ficheiro com o nome images.res. Depois disto estar feito vá ao IDE do Delphi e no File menu clique New... e escolha DLL depois cole o código abaixo, não se esqueça de adicionar uma unit vazia ao projecto. Guarde o projecta da dll no mesmo directório do ficheiro image.res, finalmente faça o build da dll (não se esqueça, que não se pode correr (executar) uma dll!)

Código da Dll:

library ImageRes; {nome da dll}
uses DummyUnit; {DummyUnit é uma unit vazia, que é necessária}
{$R images.res} {nome da resource file, que deve estar no mesmo caminho da dll}
begin
end.
Código da DummyUnit:

unit DummyUnit;
interface
implementation
end.

Usar os bitmaps que estão na dll:
Estão aqui alguns exemplos como extrair os bitmaps da dll:

procedure TForm1.SpeedButton1Click(Sender:TObject);
var
      MyHandle :THandle; 
      Bmp : TBitmap; 
begin
      MyHandle := LoadLibrary('ImageRes.DLL'); {nome da dll construida acima} 
      Bmp := TBitmap.Create; 
      Bmp.Handle := LoadBitmap(MyHandle, 'BITMAP1'); {Bitmap1 é o nome do bitmap criado no ficheiro image.res} 
      SpeedButton1.Glyph.Handle := LoadBitmap(MyHandle,'BITMAP1'); {Carrega o Bitmap1 para o glyph do SpeedButton1} 
      Canvas.Draw(0,0,Bmp); {Desenha o bitmap no canvas da form} 
       Image1.picture.bitmap:=Bmp; {Carrega o bitmap para o componente Timage} 
       Bmp.Free; 
end;

quinta-feira, 24 de maio de 2012

Drag and Drop com ListView


Primeiro inclua em seu formulário dois TListView e preencha a propriedades DragMode com o valor dmAutomatic nos dois. Para facilitar nossas vidas, vamos criar um método genérico para realizar o drag and drop, com o seguinte código
procedure realizarDragAndDrop(Sender: TObject; Source: TObject);
var
itemAdicionado : TListItem;
Item : string;
itAdd : TListItem;
begin
if Source <> Sender then
begin
with (Source as TListview) do
begin
Item := Items[ItemIndex].Caption;
Items.Delete(ItemIndex);
itAdd := items[ItemIndex];
end;
itemAdicionado := (Sender as TListView).Items.AddItem(itAdd, 1);
itemAdicionado.Caption := item;
end;
end;

Agora, vamos partir do ponto que nossos listView só aceitam drag and drop de componentes listView, para isso, no evento onDragOver de cada listView vamos colocar o seguinte código

Accept := (Source is TListView);

Para finalizar, vamos fazer a chamada do método que realiza o drag and drop efetivamente. No evento onDragDrop de cada listView, basta fazer a chamada do nosso método realizarDragAndDrop da seguinte maneira

realizarDragAndDrop(Sender, Source);

Vale ressaltar que os parâmetros Sender e Source são parâmetros de entrada do evento onDragDrop de um listView que definem a origem e o destino do item que está sendo manipulado com o drag and drop.

Técnicas para Agilizar o Desenvolvimento


Nesse mini-artigo vou descrever algumas técnicas que considero importantes, no dia-a-dia para agilizar o nosso trabalho como desenvolvedores de software.
Utilizar atalhos: nada mais rápido e eficiente do que aproveitar dos recursos que o Delphi nos oferece para agilizar e facilitar nossa vida, um dos que utilizo com frequência: Detalhe importante, estou trabalhando com o Delphi XE. Galera do Delphi 7... vamos lá, vamos migrar para o XE2 nada melhor e mais produtivo!
> Ctrl + Shift + S = salvar, nunca é demais
> Ctrl + Shift + D = refactory para adicionar um field a classe
> Ctrl + Shift + V = declarar variáveis locais
> Ctrl + Alt + P = adicionar componentes
> Alt + F11 = use unit
> Ctrl + Shift + F11 = abrir o project options
> Ctrl + Shift + J = sync edit, poder editar vários objetos, propriedades etc ao mesmo tempo.

Utilizarmos as macros: tenho certeza que pouco utilizam, mas caso seja necessário remover parte de um código em várias linhas, no caso em que o Ctrl + Shift + J não pode nos ajudar, tentem usar as macros, com certeza é muito produtivo.

Utilizar o Together, ou Model View: nada melhor que visualizarmos a hierarquia de nossas classes com ele. Ao visualizarmos apenas o código fonte fica complicado de identificar quem herda de quem e qual a relação entre as classes. Confesso que essa foi a ultima barreira que venci, pois não era acostumado a essa ferramenta, mas depois que passei a usar vejo que é muito útil.

Formatar Edit Estilo Moeda

Tenho observado que vários colegas tem problemas na formatação de campos no estilo moeda. Esta rotina mostra como o campo Edit funciona como nos caixas eletrônicos, ou seja, a digitação vem da direita para a esquerda.
Para isso, insira no seu form um edit e no evento OnKeyPress inclua o seguinte código:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
     if NOT (Key in ['0'..'9', #8, #9]) then
     key := #0;
     //Função para posicionar o cursor sempre na direita
     Edit1.selstart := Length(Edit1.text);
end;

No evento onChange insira o seguinte código

procedure TForm1.Edit1Change(Sender: TObject);
var
   s : string;
   v : double;
   I : integer;
begin
   //1º Passo : se o edit estiver vazio, nada pode ser feito.
   If (edit1.Text = emptystr) then
      Edit1.Text := '0,00';

   //2º Passo : obter o texto do edit, SEM a virgula e SEM o ponto decimal:
   s := '';
   for I := 1 to length(edit1.Text) do
   if (edit1.text[I] in ['0'..'9']) then
      s := s + edit1.text[I];

   //3º Passo : fazer com que o conteúdo do edit apresente 2 casas decimais:
   v := strtofloat(s);
   v := (v /100); // para criar 2 casa decimais

   //4º Passo : Formata o valor de (V) para aceitar valores do tipo 0,10.
   edit1.text := FormatFloat('###,##0.00',v); 
   edit1.SelStart := 0;
end;

sábado, 19 de maio de 2012

Criando diretório

Para criar um diretório você precisa usar a função ForceDirectories, o exemplo a baixo testa se não existe um diretório e cria o diretório apartir de uma variável string testando se o diretório já existe

Unit

FileCtrl

procedure TForm1.Button1Click(Sender: TObject);
var
     Dir: string;
begin
     Dir := 'C:\APPS\SALES\LOCAL';

     if not DirectoryExists(Dir) then
     ForceDirectories(Dir);
     Label1.Caption := Dir + ' foi criado';
end;

sexta-feira, 11 de maio de 2012

Como passar parâmetros entre 2 forms

Suponha que você esteja no Form1 e precise chamar o Form2 passando dois parametros ("Aden" e "Rodrigues").
1. Crie as variáveis de instancia do Form2 que receberão os dois parâmetros.
2. Reescreva o Construtor desse form, de forma receber os parametros e atribui-los às suas variáveis de instância:
type
TForm2 = class(TForm)
private
Parametro1 : String;
Parametro2 : String;
public
constructor Create(AOwner : TComponent; pParm1, pParm2 : String);
end;

var
Form2: TForm2;

implementation

Constructor TForm2.Create(AOwner : TComponent; pParm1, pParm2 : String);
begin
inherited Create(AOwner);
Parametro1 := pParm1;
Parametro2 := pParm2;
end;

Agora no seu form1, abra o form2 com a seguinte sintaxe:

With TForm2.Create(self, 'Aden', 'Rodrigues') do
Begin
ShowModal;
Free;
End;

Obs: Não deixe o delphi criar automaticamente o formulário. Crie-o (e destrua-o) manualmente.

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;

Curso de Delphi: 7.Consultas SQL