Boletim Pascal #45 - 09 DE MAIO DE 2003 (Original: 11-MAR-2003)
Índice
1. Algumas Palavras dos Editores
2. Gerenciador Avançado de Exceções
Como implementar uma classe de depuração que exibe nome da unidade,
nome da função e número da linha de uma exceção.
3. Interceptando Mensagens do Windows em Componentes Não-Visuais
Como um componente não-janelado pode receber mensagens do windows
4. Associe seu Programa com Extensões de Arquivo
Como criar associações de arquivo para seu executável
5. Assembler Inline em Delphi (VII) - Aritmética Inteira de 128 bits (1)
6. Fóruns / Listas
7. Delphi na Rede
- Sites em português
- Componentes, Bibliotecas e Utilidades
. Shareware/Comercial
. Freeware
· Atualizações do Delphi
- Artigos, Dicas e Truques
· Kylix, CLX e Linux
- Tutoriais
- Outros Links
- Notícias
________________________________________________________________________
1. Algumas Palavras dos Editores
Editorial da Versão em Português
--------------------------------
Eis que, enfim, estamos em dia com as traduções do Boletim Pascal!!!
Gostaria de agradecer a minha dedicada equipe de tradutores- sem
eles, não teríamos realizado tanto em tão pouco tempo. A qualidade e
velocidade das traduções têm superado as mais otimistas e entusiasmadas
expectativas. Estejam certos de que estou feliz em tê-los como
colaboradores do nosso Boletim.
Aproveito agora para convidar nossos membros a submeterem artigos para
publicação no Boletim Pascal. Submetendo seus artigos, você podem ganhar
prêmios, além do reconhecimento por parte da comunidade Delphi de língua
portuguesa, inglesa e espanhola (juntos, são hoje aproximadamente 8200
assinantes). Todo número do Boletim apresenta, no editorial da versão em
inglês, lista prêmios que serão concedidos na edição seguinte. Enviando
seus artigos, vocês concorrem a esses mesmos prêmios, juntamente com os
demais autores que enviam seus artigos para as versões em inglês e
espanhol.
Ou seja, vocês enviam seus artigos, eu e os editores avaliamos se o
artigo é adequado para publicação. Sendo aprovado, além de publicarmos
seu artigo na edição em português do Boletim Pascal, ainda traduzimos e
publicamos nas edições em inglês e espanhol.
E então, o que você está esperando para enviar seu artigo, hein?
Agora chega de conversa. Divirtam-se com nosso boletim!
Demian Lessa
demian@knowhow-online.com.br
Editor da versão em português
__________________
Editorial da Versão em Inglês
-----------------------------
Gostaria de agradecer a Olivier Rogier, Peter Johnson e Igor Siticov
por contribuírem com artigos para essa edição e fico feliz em premiar
os dois primeiros:
* Olivier Rogier (Gerenciador Avançado de Exceções)
· SDL Component Suite 7.0 - por Software Development Lohninger ($99)
O SDL Component Suite oferece uma ampla variedade de copmponentes
para aplicações científicas e de engenharia (matemática, estatística,
química, gráficos, visualização de dados, transformações de Fourier,
plotagem em 3D, mapas geográficos, ajuste de curvas, etc). Disponível
para Delphi 3-7 e BCB 4-6. http://www.lohninger.com/sdlindex.html
* Peter Johnson (Interceptando Mensagens do Windows em Componentes
Não-Visuais)
· LMD DesignPack - por LMD Innovative - Shareware (EUR 59)
Cinco componentes para acrescentar funcionalidade de edição em
suas aplicações (um clone do Object Inspector clone, um designer
de formulários e controles baseados em diagramas), com código
fonte completo e vários projetos de exemplo demonstrando algumas
das funcionalidades avançadas- um designer de relatórios está
de fato incluído! http://www.lmdinnovative.com/products/vcl/lmddesignpack/
Para o próximo número, teremos os seguintes prêmios para dois de nossos
colaboradores:
* llPDFLib v1.1 - por llionsoft, Shareware ($70, $280 com fontes)
llPDFLib é uma biblioteca Object Pascal para a criação de documentos
PDF. Não utiliza DLLs ou software externo de terceiros para gerar os
PDFs. A biblioteca consiste de um componente TPDFDocument com métodos
e propriedades análogos ao TPrinter do Delphi, mas orientados à
geração do arquivo PDF. http://www.llion.net/
Se você usa o Delphi 6 ou 7, não se esqueça de verificar as atualizações
do Delphi na seção Delphi na Rede. A propósito, a Borland está
realizando o Delphi Developer Survey 2003 e o BDN Survey 2003. Você
encontrará os links no título Outros Links na seção Delphi na Rede.
Espero que goste desse número.
Cordialmente,
Ernesto De Spirito
pascal-newsletter-owner@yahoogroups.com
__________________
Colaboraram nesse número: Dave Murray
________________________________________________________________________
Greatis Runtime Fusion includes Form Designer Pro ($ 49.95) and Object
Inspector Pro ($ 49.95), two flagship Delphi-related products of Greatis
Software, and costs $89.90 - Save $10 and get additional demos. Let the
user design forms at runtime. >>>>>>> http://www.greatis.com/runtime.htm
________________________________________________________________________
2. Gerenciador Avançado de Exceções
Como implementar uma classe de depuração que exibe nome da unidade,
nome da função e número da linha de uma exceção.
Por Olivier Rogier <software @ urimont.com>
Software Engineering - Ingénierie Logicielle
http://www.urimont.com
Tradução: Demian Lessa
Leia o arquivo file_id.diz na pasta XAM do arquivo zip anexado para
instruções de como instalar o eXpress Application Manager (XAM) para
Delphi 5-7.
O requisito é a geração do arquivo de mapa detalhado (map file) nas
opções de projeto, na guial Linker.
DEBUG_MODE é uma contante lógica que indica se o objeto de depuração
está ativo por padrão na inicialização. Pode ser modificada pelos
parâmetros de linha de comando /debug e /nodebug.
TObjectInfos é utilizado para recuperar informações das instâncias como
nome, parente(s) e dono(s). TMapFile é usado para recuperar informações
de exceção: nomes de unidade e procedimento além do número da linha.
IDebug é uma interface implementada por TDebug. A função GetDebug
retorna um ponteiro IDebug que faz referência a uma instância de TDebug
criada na seção de initialization e destruída na seção finalization da
unidade. O usuário não pode destrui essa instância tampouco criar novas
instâncias.
O usuário pode definir callbacks para os eventos Before e After da
exceção, além do estado de ativação. ShowException é utilizado pelo
manipulador interno de exceção e pode também ser utilizado pelo usuário.
Um formulário de exceção e/ou um log de exceções podem ser
implementados.
________________________________________________________________________
Qual foi a última vez que você votou para o Boletim Pascal? Suporte essa
iniciativa votando para o Boletim Pascal no The Programming Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
3. Interceptando Mensagens do Windows em Componentes Não-Visuais
Como um componente não-janelado pode receber mensagens do windows
Por Peter Johnson, Copyright (c) 2003
<delphidabbler @ contactbox.co.uk> - http://www.delphidabbler.com
Tradução: Cristiano de Favari
Algumas vezes, precisamos que um componente não-janelado (isto é,
que não é derivado de TWinControl) receba mensagens Windows, mas
componentes não-janelados não possuem handles de janela (window
handles). Por exemplo, vamos supor que estamos desenvolvendo um
componente não-visual que registra nossa aplicação como um
visualizador de clipboard de modo que a aplicação possa responder
a alterações no clipboard (veja como fazer aplicações desse tipo
em http://www.delphi3000.com/articles/article_575.asp). Para pegar
a informações de mudança no clipboard, nosso componente precisa
receber mensagens do Windows.
A função AllocateHWnd da biblioteca do Delphi é usada para criar
uma janela escondida enquanto DeallocateHWnd libera essa janela
quando não precisarmos mais dela.
A janela escondida precisa de uma window procedure (procedimento de
janela para manipulação das mensagens recebidas por essa janela).
Podemos usar um método de nossa classe de componente para fornecer
uma window procedure. AllocateHWnd recebe como parâmetro uma referência
a esse método e cuida de registrar esse método como uma window
procedure. No método, manipulamos as mensagens de interesse e
desprezamos as demais repassando-as para DefWindowProc da API do
Windows.
O código a seguir dá o esqueleto de como usar AllocateHWnd. Primeiro,
a declaração da seção interface da classe:
type
// Nossa classe deriva de TComponent (ou outra classe ancestral)
TMyClass = class(TComponent)
private
FHWnd: HWND;
// Campo para armazenar o handle de janela
...
protected
procedure WndMethod(var Msg: TMessage); virtual;
// Uma window proc- chamada pelo Windows para manipular mensagens
...
public
constructor Create(AOwner: TComponent); override;
// Aqui criamos o manipulador de janela
destructor Destroy; override;
// Aqui liberamos o manipulador da janela
...
end;
E aqui os detalhes da implementação:
TMyClass.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
...
// Cria a janela
FHWnd := AllocateHWnd(WndMethod);
...
end;
TMyClass.Destroy;
begin
...
// Destrói a janela
DeallocateHWnd(FHWnd);
...
inherited Destroy;
end;
TMyClass.WndMethod(var Msg : TMessage);
var
Handled: Boolean;
begin
// Presuma que manipulamos a mensagem
Handled := True;
case Msg.Msg of
WM_SOMETHING: DoSomething;
// Código para manipular uma mensagem
WM_SOMETHINGELSE: DoSomethingElse;
// Código para manipular outra mensagem
...
else
// Não manipulamos a mensagem
Handled := False;
end;
if Handled then
// Manipulamos a mensagem- registre isso no Result da mensagem
Msg.Result := 0
else
// Não manipulamos a mensagem-
// passe para DefWindowProc e registre isso em Result
Msg.Result := DefWindowProc(FHWnd, Msg.Msg,
Msg.WParam, Msg.LParam);
end;
É claro, poderíamos usar a API do Windows para criar uma janela do jeito
mais difícil e fornecer uma window procedure. Mas é mais complicado usar
um método (ao invés de uma procedure) como uma window procedure fazendo
desse jeito. As características mais interessantes sobre AllocateHWnd
são:
(a) ele cria uma janela escondida
(b) Permite que usemos um método ao invés de uma simples procedure
como window procedure- e um método é mais útil pois tem acesso
aos dados privados da classe.
Um exemplo do componente visualizador de clipboard (cbview) foi incluído
no código anexo.
__________________
Peter Johnson vive em West Wales (UK) e é programador Delphi por hobby.
Ele mantém o website DelphiDabbler (http://www.delphidabbler.com/) onde
são publicados seus artigos, aplicações e componentes freeware para
Delphi.
________________________________________________________________________
Qual foi a última vez que você votou para o Boletim Pascal? Suporte essa
iniciativa votando para o Boletim Pascal no The Programming Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
4. Associe seu Programa com Extensões de Arquivo
Como criar associações de arquivo para seu executável
Por Igor Siticov
SiComponents: http://www.sicomponents.com
Tradução: Demian Lessa
Como posso associar uma extensão de arquivo com meu aplicativo?
Para criar associações de arquivo você deve fazer algumas alterações no
registro e informar o Windows Explorer dessas mudanças.
Para abrir seu programa como o padrão para todos os tipos de arquivo
não registrados, basta associá-lo ao arquivo do tipo "*".
A unidade a seguir inclui uma função para a criação de uma associação de
arquivo. Veja os comentários no código para maiores detalhes.
unit utils;
interface
uses Registry, ShlObj, SysUtils, Windows;
procedure RegisterFileType(cMyExt, cMyFileType, cMyDescription,
ExeName: string; IcoIndex: integer; DoUpdate: boolean = false);
implementation
procedure RegisterFileType(cMyExt, cMyFileType, cMyDescription,
ExeName: string; IcoIndex: integer; DoUpdate: boolean = false);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CLASSES_ROOT;
// 1) Atribui a extensão ao tipo de arquivo, criando
// a extensão se ela já não existir
// Abre ou cria a chave HKCR\<cMyExt>
Reg.OpenKey(cMyExt, True);
// HKCR\.<cMyExt>\(Default)="<cMyFileType>"
Reg.WriteString('', cMyFileType);
Reg.CloseKey;
// 2) Atribui a descrição do tipo de arquivo, criando
// o tipo de arquivo se ele já não existir
// Abre ou cria a chave HKCR\<cMyFileType>
Reg.OpenKey(cMyFileType, True);
// HKCR\<cMyFileType>\(Default)="<cMyDescription>"
Reg.WriteString('', cMyDescription);
Reg.CloseKey; // Now write the default icon for my file type
// 3) Atribui o índice do ícone ao tipo de arquivo,
// criando a chave correspondente se ela já não existir
// Abre ou cria a chave HKCR\<cMyFileType>\DefaultIcon
Reg.OpenKey(cMyFileType + '\DefaultIcon', True);
// HKCR\<cMyFileType>\DefaultIcon\
// (Default)="<cExeName>,<IcoIndex>"
Reg.WriteString('', ExeName + ',' + IntToStr(IcoIndex));
Reg.CloseKey;
// 4) Escreve o comando para a ação Abrir (Open) no Windows
// Explorer, criando a ação se ela já não existir
// Abre ou cria a chave HKCR\<cMyFileType>\Shell\Open
Reg.OpenKey(cMyFileType + '\Shell\Open', True);
// HKCR\<cMyFileType>\Shell\Open\(Default)="&Open"
Reg.WriteString('', '&Open');
Reg.CloseKey;
// 5) Define a aplicação que será usada para executar a ação,
// criando a chava correspondente se ela já não existir
// Abre ou cria a chave HKCR\<cMyFileType>\Shell\Open\Command
Reg.OpenKey(cMyFileType + '\Shell\Open\Command', True);
// HKCR\<cMyFileType>\Shell\Open\Command\
// (Default)=""<cExeName>" "%1""
// Sua aplicação deve analisar os parâmetros de linha de comando
// para saber qual o arquivo passado
Reg.WriteString('', '"' + ExeName + '" "%1"');
Reg.CloseKey;
// Finalmente, se você quiser que o Windows Explorer
// reconheça o tipo de arquivo imediatamente, basta
// chamar a API SHChangeNotify.
if DoUpdate then
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
finally
Reg.Free;
end;
end;
end.
__________________
Igor Siticov é o autor da TsiLang Components Suite (conjunto completo de
componentes profissionais para construção elegante, útil e amigável de
aplicações multilíngua em dois minutos) e Resource Builder (editor
visual completo de scripts RC que pode ser um excelente substituto para
o Image Editor e o Resource WorkShop da Borland para a criação e edição
de arquivos de recursos), por SiComponents: www.sicomponents.com
________________________________________________________________________
5. Assembler Inline em Delphi (VII) - Aritmética Inteira de 128 bits (1)
Por Ernesto De Spirito
Tradução: Adilson Vahldick
Introdução
==========
Com 32 bits podemos representar 2^32 números diferentes, isto é,
4294967296 (~4 bilhões) números diferentes, tais como inteiros com sinal
de -2147483648 até +2147483647 ou inteiros sem sinal de 0 até 4294967295
(Longint e Longword respectivamente).
Isso é suficiente para muitas finalidades como, por exemplo, guardar a
posição de um byte em um arquivo de 4GB. Mas às vezes precisamos
representar inteiros maiores e então podemos usar TLargeInteger
(Windows.pas) e Int64 (a partir do Delphi 4) para representar inteiros
de 64-bits (2^64 valores diferentes): 18446744073709551616 (~18
sestilhões) de valores, de -9223372036854775808 até +9223372036854775807
(~9 sestilhões, 17-18 dígitos).
Essa quantidade de dígitos é muito mais do que eu preciso e não consigo
imaginar qualquer uso prático para mais do que isso- a não ser Bill
Gates que conta seu dinheiro em sestilhões! ;) Mas de tempos em tempos
eu vejo alguém no fórum perguntar por mais dígitos que o Int64
oferece...
De qualquer maneira, se válido ou completamente inútil numa proposta
prática, veremos a implementação de várias procedures e functions
desenvolvidas para trabalhar com inteiros de 128-bits, que nos
servirão para mostrar exemplos de instruções básicas de assembler.
Este "inteiros longos", "inteiros grandes" ou "inteiros enormes"
podem manter 2^128 diferentes valores (38-39 dígitos).
Representação dos inteiros de 128-bits
======================================
Eu chamo o novo tipo Hugeint mas, por exemplo, Bigint (big integer) ou
Int128 podem ser nomes igualmente bons. Largeint pode ser confundido com
o tipo da unit Windows.pas que refere-se ao inteiro de 64-bits.
Quando precisamos representar o novo tipo, também existem várias formas
de fazê-lo. Eu optei pela representação mais simples- um array de 4
inteiros de 32 bits:
type
Hugeint: packed array [0..3] of longword;
Também decidi pelo formato little-endian já que é o padrão na
arquitetura Intel e isto significa que o primeiro elemento do array
(endereço mais baixo) guardará os 32 bits de ordem mais baixa (menos
significativos) e o último elemento do array (endereço mais alto)
guardará os 32 bits de mais alta ordem (mais significativos).
Abaixo é a forma que os números 5 e 5000000000 ($12A05F200) serão
representados:
+---- 32 bits de baixa ordem
|
v
+-------------+-------------+-------------+-------------+
| $00000005 | $00000000 | $00000000 | $00000000 | = 5
+-------------+-------------+-------------+-------------+
0 1 2 3
+-------------+-------------+-------------+-------------+
| $2A05F200 | $00000001 | $00000000 | $00000000 | = 5000000000
+-------------+-------------+-------------+-------------+ $12A05F200
^
|
32 bits de alta ordem ----+
Os próprios inteiros são armazenados no formato little-endian (primeiro
o byte de mais baixa ordem). Se você verificar a representação em bytes
de um número na memória, ela se pareceria com isso (valores em bytes
representados na notação hexadecimal):
$00000005
+-------------+-------------+-------------+-------------+
| 05 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | = 5
+-------------+-------------+-------------+-------------+
0 1 2 3
+-------------+-------------+-------------+-------------+
| 00 F2 05 2A | 01 00 00 00 | 00 00 00 00 | 00 00 00 00 | = 5000000000
+-------------+-------------+-------------+-------------+ $12A05F200
$2A05F200 $00000001
Entretanto, para quase todas as operações, podemos abstrair a ordem do
byte e considerar que os inteiros de 32-bits são unidades atômicas,
desde que a ordem do byte seja mantida transparentemente.
Algumas instruções úteis
========================
Antes de começarmos, vejamos algumas instruções úteis que usaremos neste
artigo (principalmente na continuação desta parte); antes, porém, é
preciso enfatizar que a proposta deste artigo não é ensiná-lo assembler.
Tudo que eu posso fazer neste espaço limitado é simplesmente mostrar
exemplos de algumas instruções. Como material de referência, recomendo
estes links:
* Intel 80386 Reference Programmer's Manual
Um versão HTML deste manual da Intel. O pseudocódigo ajuda a entender
as instruções e seus efeitos sobre os flags. Excelente.
http://people.freebsd.org/~jhb/386htm/toc.htm
Existem alguns links quebrados, mas as páginas estão lá. Tente
encontrá-los no diretório: http://people.freebsd.org/~jhb/386htm/
* iAPx86 - Norton Guide
Não é tão didático quanto o documento acima, mas contém todas as
instruções do 8086 do Pentium e Pentium Pro, com informações de
tamanho e tempo não inclusas no link acima.
http://www.clipx.net/ng/iapx86/index.php
* The IA-32 Intel Architecture Software Developer's Manual, Volume 2:
Instruction Set Reference
Manual em PDF descrevendo as instruções dos processadores IA-32
(Pentium, Pentium Pro, Pentium II, Pentium III, Pentium 4 e Xeon).
Inclui pseudocódigo que explica as instruções e como elas afetam os
flags dos registradores.
http://www.intel.com/design/pentium4/manuals/245471.htm
* Otimização
- How to optimize for the Pentium family of microprocessors
Excelente guia de otimização escrito por Agner Fog
http://fatphil.org/x86/pentopt/index.html
- Optimizations for Intel's 32-Bit Processors
Outro excelente guia de otimização.
http://x86.ddj.com/ftp/manuals/686/optimgd.pdf
OK, agora vamos ver as instruções.
Referência:
Z/ZF: Flag Zero
S/SF: Flag de Sinal
C/CF: Flag de Transporte (Carry)
P/PF: Flag de Paridade
A/AF: Flag Auxiliar
s: bit de sinal (bit de ordem mais alta)
o: bit ímpar (bit de ordem mais baixa)
x: valor do bit
0: o valor 0
1: o valor 1
r: bit invertido em relação ao valor anterior
u: bit não alterado desde o valor anterior
XX: valor desconhecido
Nos exemplos presumimos que o valor de AL antes de cada operação é
sxxxxxxo (bit de sinal, 6 bits desconhecidos e bit ímpar).
Aqui temos algumas instruções para começar:
SHL al,1 AL := xxxxxxo0 CF := s Deslocamento à esquerda
SAL al,1 AL := xxxxxxo0 CF := s Mesmo que SHL
SHR al,1 AL := 0sxxxxxx CF := o Deslocamento à direita
SAR al,1 AL := ssxxxxxx CF := o Deslocamento aritmético à
direita
SAR al,7 AL := ssssssss CF := x Reprodução do bit de sinal
ROL al,1 AL := xxxxxxos CF := s Rotação à esquerda
ROR al,1 AL := osxxxxxx CF := o Rotação à direita
RCL al,1 AL := xxxxxxoC CF := s Rotação completa com transporte
à esquerda
RCR al,1 AL := Csxxxxxx CF := o Rotação completa com transporte
à direita
AND al,al AL := uuuuuuuu CF := 0 Define flags (veja abaixo)
AND al,-1 AL := uuuuuuuu CF := 0 -1 = $FF = 1111111
Define flags (veja abaixo)
AND al,$01 AL := 0000000u CF := 0 $01 = 00000001
AND al,$80 AL := u0000000 CF := 0 $80 = 10000000
AND al,$5A AL := 0u0uu0u0 CF := 0 $5A = 01011010
AND al,0 AL := 00000000 CF := 0 XOR AL,AL ou MOV AL,0 são
melhores
TEST AL,XX AL := uuuuuuuu
TEST é como AND mas o resultado não é armazenado no
destino. O resultado é usado para definir as flags (veja
abaixo)
TEST AL,-1 É melhor que AND AL,-1 e OR AL,AL porque não escreve em
AL, o que permite certas otimizações em alguns casos.
OR al,al AL := uuuuuuuu CF := 0 Define as flags (veja abaixo)
OR al,$01 AL := uuuuuuu1 CF := 0 $01 = 00000001
OR al,$80 AL := 1uuuuuuu CF := 0 $80 = 10000000
OR al,$5A AL := u1u11u1u CF := 0 $5A = 01011010
OR al,-1 AL := 11111111 CF := 0 Mesmo que MOV AL,1
XOR al,al AL := 0 CF := 0 Utilize MOV AL,0 para preservar
as flags
XOR al,$5A AL := ururruru CF := 0 $5A = 01011010
XOR al,-1 AL := rrrrrrrr CF := 0 Mesmo que NOT AL
Exceto pelas instruções de rotação (ROL, RCL, ROR e RCR), todas acima
definem SF, ZF e PF baseados no resultado das operações:
SF = valor do bit de mais alta ordem do resultado
ZF = 1 ("definido") se o resultado for zero, 0 ("limpo") nos demais
casos
PF = 1 ("definido") se o o byte de mais baixa ordem do resultado
contém um número par de bits 1, senão 0 ("limpo")
Veja mais algumas instruções:
STC CF := 1 Define o flag de Transporte
CLC CF := 0 Limpa o flag de Transporte
CMC CF := r Complementa o flag de Transporte
LAHF AH := SZxAxPxC
SAHF Presumindo que AH é SZxAxPxC:
ZF := S; ZF := Z; AF := A; PF := P; CF := C
SETc AL AL := CF Define se carry
SETs AL AL := SF Define se sign
SETz AL AL := ZF Define se zero
SETe AL AL := ZF Define se equal (sinônimo de SETZ)
SETp AL AL := PF Define se paridade
SETpe AL AL := PF Define se a paridade é par
(sinônimo de SETP)
SETo AL AL := OF Define se overflow
SETnc AL AL := NOT CF Define se não carry
SETns AL AL := NOT SF Define se não sign
SETnz AL AL := NOT ZF Define se não zero
SETne AL AL := NOT ZF Define se não equal (sinônimo de SETNZ)
SETnp AL AL := NOT PF Define se não paridade
SETpo AL AL := NOT PF Define se a paridade é ímpar
(sinônimo de SETNP)
SETno AL AL := NOT OF Define se não overflow
SETa (ou SETNbe), SETae (ou SETnb), SETb (ou SETnae), SETbe (SETna),
SETg (ou SETNle), SETge (ou SETnl), SETl (ou SETnge) e SETle (SETng)
definem o byte de destino para 1 ou 0 dependendo da condição
específica ser satisfeita ou não.
ADD AL,XX AL := AL+XX CF := 1 se a operação gera transporte;
0 outros casos
SUB AL,XX AL := AL-XX CF := 1 se a operação precisa de um
empréstimo; 0 outros casos
SUB AL,0 AL := uuuuuuuu Define os flags baseados no AL
SUB AL,AL AL := 0 Mesmo que XOR AL,AL ou MOV AL,0
CMP AL,XX CMP é como SUB mas o resultado não é armazenado no
destino. A operação simplesmente define os flags.
ADC AL,XX AL := AL+XX+C CF := 1 se a operação gera um transporte;
0 outros casos
SBB AL,XX AL := AL-C-XX CF := 1 se a operação necessitade um
empréstimo; 0 outros casos
NEG AL AL := -AL CF := 1 se previamente AL <> 0
NOT AL; INC AL é o mesmo
NOT AL AL := rrrrrrrr CF := u Mesmo que XOR AL,-1
Funções de Conversão
====================
Estas funções nos ajudarão a entender a representação dos inteiros
128-bits.
Longword para Hugeint
---------------------
Vamos começar convertendo de Longword para HugeInt. Os 32 bits de mais
baixa ordem do resultado serão os 32 bits do parâmetro e os 96 bits de
mais alta ordem serão zerados.
function UToHugeint(const x: Longword): Hugeint; overload;
// Result := Hugeint(x);
// Parâmetros: EAX = x; EDX = @Result;
asm
xor ecx, ecx // ECX := 0;
mov [edx+_0_], eax // Result[0] := x;
mov [edx+_1_], ecx // Result[1] := 0;
mov [edx+_2_], ecx // Result[2] := 0;
mov [edx+_3_], ecx // Result[3] := 0;
end;
Comentários:
* "_0_", "_1_", "_2_", e "_3_"? O que são?
São constantes que representam os deslocamentos dos quatro elementos
do vetor, permitindo-nos escrever um código mais limpo.
const
_0_ = 0;
_1_ = 4;
_2_ = 8;
_3_ = 12;
Longint para Hugeint
--------------------
Os 32 bits inferiores do resultado serão os 32 bits do parâmetro. Se o
número for positivo ou zero, então os 96 bits superiores serão 0, senão
os 96 bits superiores serão 1.
Isso nos força a fazer uma comparação ou teste do sinal e então executar
um jump condicional baseado no resultado:
function ToHugeint(const x: Longint): Hugeint; overload;
// Result := Hugeint(x);
// Parâmetros: EAX = x; EDX = @Result;
asm
or eax, eax // EAX := EAX or EAX; // EAX não é alterado
// Efeito colateral:
// SF (Flag de Sinal) := EAX < 0;
mov ecx, 0 // ECX := 0;
jns @@not_negative // if not SF then goto @@not_negative;
dec ecx // ECX := ECX - 1; // 0 - 1 = -1 = $FFFFFFFF
@@not_negative:
mov [edx+_0_], eax // Result[0] := x;
mov [edx+_1_], ecx // Result[1] := ECX; // 0 or $FFFFFFFF
mov [edx+_2_], ecx // Result[2] := ECX; // 0 or $FFFFFFFF
mov [edx+_3_], ecx // Result[3] := ECX; // 0 or $FFFFFFFF
end;
Comentários:
* Observe o uso do "MOV ECX, 0" no lugar de "XOR ECX, ECX" para evitar
alterar o estado do Flag de Sinal (SF) definido na instrução anterior
(OR) e então usado no jump condicional que aparece na instrução
seguinte (JNS). É claro que era desnecessário trocar a ordem das
operações para isto.
* Em vez de:
or eax, eax
jns @@not_negative
os pares de instruções abaixo realizariam o mesmo:
* and eax, eax // EAX mantém o valor, mas SF recebe o sinal
jns @@not_negative // se SF = 0 então goto @@not_negative
* test eax, $80000000 // somente zero se o bit de sinal (bit 31) é 0
jz @@not_negative // se ZF então goto @@not_negative
* test eax, $87654321 // qualquer valor com o bit 31 definido
jns @@not_negative // se SF = 0 então goto @@not_negative
* cmp eax, 0 // compara eax com 0
jge @@not_negative // se maior ou igual então goto @@not_negative
* Observe o uso de "DEC ECX" para alterar o valor de ECX de $00000000
para $FFFFFFFF (decrementando o valor do registro). "NOT ECX" faz a
mesma coisa invertendo os bits, na mesma velocidade, e com o mesmo
número de bytes para codificar a instrução, mas não é uma instrução
par como o DEC. Por esta razão NOT é normalmente evitado e substituido
por:
- Se você sabe de antemão que o valor é zero, utilize DEC Dest
- Se você sabe de antemão que o valor é 1, use INC Dest
- Se você não conhece o valor, use XOR Dest, -1
* Também preste atenção na ordem das instruções para jamais utilizar um
registro que foi definido por um instrução imediatamente anterior.
Essa é uma das condições para que ocorra o pareamento. Você encontrará
mais informações sobre instruções de pareamento nos documentos sobre
otimização recomendados anteriormente.
Podemos simplificar a função obrigando a instrução CDQ que estende o
sinal de EAX para EDX. Veja o funcionamento (simplificado) de CDQ:
if EAX >= 0 then
EDX := $0
else
EDX := $FFFFFFFF;
Aqui é uma pequena e simples implementação usando CDQ:
function ToHugeint(const x: Longint): Hugeint; overload;
// Result := Hugeint(x);
// Parâmetros: EAX = x; EDX = @Result;
asm
mov ecx, edx // ECX := @Result;
cdq // EDX := IIF(x>=0, 0, $FFFFFFFF);
mov [ecx+_0_], eax // Result[0] := x;
mov [ecx+_1_], edx // Result[1] := EDX; // 0 or $FFFFFFFF
mov [ecx+_2_], edx // Result[2] := EDX; // 0 or $FFFFFFFF
mov [ecx+_3_], edx // Result[3] := EDX; // 0 or $FFFFFFFF
end;
CDQ é usualmente substituído usando MOV e SAR, que oferecem a vantagem
de que a origem não precisa ser EAX e o destino não precisa ser EDX (mas
são instruções pareadas). Vejamos um exemplo:
function ToHugeint(const x: Longint): Hugeint; overload;
// Result := Hugeint(x);
// Parâmetros: EAX = x; EDX = @Result;
asm
mov ecx, eax // ECX := x;
sar ecx, 31 // ECX := IIF(x>=0, 0, $FFFFFFFF);
mov [edx+_0_], eax // Result[0] := x;
mov [edx+_1_], ecx // Result[1] := EDX; // 0 or $FFFFFFFF
mov [edx+_2_], ecx // Result[2] := EDX; // 0 or $FFFFFFFF
mov [edx+_3_], ecx // Result[3] := EDX; // 0 or $FFFFFFFF
end;
Hugeint para Longint
--------------------
Um Hugeint pode ser convertido para Longint simplesmente pegando os
32 bits de mais baixa ordem. Os 96 bits altos do Hugeint podem ser todos
definidos para 0 ou 1 igualando o bit de sinal para que o resultado (bit
31) do Hugeint esteja dentro dos limites do Longint, mas a função não
checa isto e executa a conversão cegamente (da mesma forma que um
Longint é convertido para um Shortint, por exemplo).
function ToLongint(const x: Hugeint): Longint; overload;
// Result := Longint(x);
// Nenhuma exceção é gerada se o valor não estiver dentro dos limites
// (os 96 bits de mais alta ordem são descartados).
// Parâmetros: EAX = @x;
asm
mov eax, [eax+_0_] // Result := x[0];
end;
Int64 para Hugeint
------------------
Parâmetros Int64 são passados para a pilha; assim, funções com
parâmetros Int64 automaticamente criam um quadro de pilha (stack frame).
Os 64 bits mais baixos do resultado serão os 64 bits do parâmetro
enquanto os 64 bits mais altos serão obtidos a partir do bit de sinal
do inteiro (32 bits) de mais alta ordem do Int64.
{$IFDEF DELPHI4}
function ToHugeint(const x: Int64): Hugeint; overload;
// Result := Hugeint(x);
// Parâmetros: x na pilha; EAX = @Result;
asm
mov edx, dword[x+_0_] // EDX := x[0];
mov ecx, dword[x+_1_] // ECX := x[1];
mov [eax+_0_], edx // Result[0] := x[0];
mov [eax+_1_], ecx // Result[1] := x[1];
sar ecx, 31 // ECX := IIF(x[1]>=0, 0, $FFFFFFFF);
mov [eax+_2_], ecx // Result[2] := ECX; // 0 or $FFFFFFFF
mov [eax+_3_], ecx // Result[3] := ECX; // 0 or $FFFFFFFF
end;
{$ENDIF}
Valores Int64 são armazenados no formato little-endian; assim, o
inteiro inferior é o primeiro, com um deslocamento 0 do endereço base
da variável e o inteiro superior é o segundo, com um deslocamento 4 do
endereço base da variável. Nesse caso, o endereço base da variável é
EBP+8 (veja o primeiro capítulo desta série de artigos) e, assim, o
primeiro elemento está em EBP+8 (EBP+8+0) e o segundo elemento está em
EBP+12 (EBP+8+4). Eu poderia usar EBP+8 e EBP+12 para endereçar estes
elementos mas "x+_0_" e "x+_1_" referem-se aos endereços de forma mais
transparente. O especificador de tamanho (DWORD) é já que o assembler
recebe "x+_0_" e "x+_1_" como ponteiros para dados de 64 bits ("x" é
considerado um ponteiro de dados de 64-bits) e não permite mover o
valor referenciado para um registrador de 32-bits.
Hugeint para Int64
------------------
Um Hugeint pode ser convertido para um Int64 simplesmente pegando os 64
bits inferiores. Os 64 bits superiores do HugeInt podem ser definidos
como 0 ou 1 para igualar o bit de sinal para que o resultado (bit 32)
do valor Hugeint fique dentro dos limites de um Int64, mas a função não
checa isto e executa a conversão cegamente:
{$IFDEF DELPHI4}
function ToInt64(const x: Hugeint): Int64; overload;
// Result := Int64(x)
// Nenhuma exceção é gerada se o valor não estiver dentro dos limites
// (os 64 bits de mais alta ordem são descartados).
// Parâmetros: EAX = @x;
asm
mov edx, [eax+_1_] // EDX := x[1];
mov eax, [eax+_0_] // EAX := x[0];
// Result = EDX:EAX = x[1]:x[0]
end;
{$ENDIF}
Commentários:
* Int64 retorna valores colocados em EDX (32 bits de alta ordem) e
EAX (32 bits de baixa ordem).
Por enquanto é isso. Nas próximas edições veremos funções que executam
funções lógicas e matemáticas com inteiros gigantes.
________________________________________________________________________
JfControls Library. Multi-language. Multi-appearance. Skins. Privileges.
More than 40 integrated and customizable components. Impressive GUI.
Centralized resources administration. Multiple programming problems
solved. For Delphi 3-2006 & C++ Builder 3-6. http://www.jfactivesoft.com
________________________________________________________________________
6. Fóruns / Listas
Para juntar-se a qualquer um de nossos fóruns de discussão, a melhor
forma é assinar através da web, já que dessa forma você poderá acessar
todas as funcionalidades disponíveis no site (como alterar suas opções
de assinatura, visualizar mensagens passadas, baixar arquivos, etc.).
Um ID Yahoo! é necessário para isso e você pode adquirir o seu de forma
gratuita registrando-se como um usuário Yahoo! Mas se você não deseja
registrar-se ou se não tem acesso completo à Internet, você pode fazer
sua assinatura por e-mail (basta ter acesso a uma conta de e-mail).
* Delphi: Participe da lista de discussão do Grupo Delphi-BR e faça
parte da mais profissional lista Delphi do Brasil. Essa lista tem como
objetivo a troca de informações entre os diversos programadores Delphi
em lingua portuguesa. Aqui você encontrará grandes programadores
brasileiros dando suas contribuições para a comunidade e mantendo uma
via de comunicação entre todos os programadores Delphi brasileiros.
http://br.groups.yahoo.com/group/delphi-br/
Assinatura:
http://br.groups.yahoo.com/group/delphi-br/join
delphi-br-subscribe@yahoogrupos.com.br
* Kylix (inglês): Programação Kylix.
http://groups.yahoo.com/group/KylixGroup/
Assinatura:
http://groups.yahoo.com/group/KylixGroup/join
KylixGroup-subscribe@yahoogroups.com
* Componentes (inglês): Esse é um fórum para pesquisa/recomendação de
componentes de software (componetes VCL e CLX, objetos ActiveX, DLLs,
SOs, etc.), assim como utilitários, tutoriais, informações, etc.
http://tech.groups.yahoo.com/group/components/
Assinatura:
http://tech.groups.yahoo.com/group/components/join
components-subscribe@yahoogroups.com
* Desenvolvedores de Software (inglês): Esse é um fórum para discussões
sobre o desenvolvimento de software e para a troca de experiências de
trabalho em ambientes profissionais e comerciais. Esse não é um fórum
sobre programação; os assuntos abordados são mais gerais e
independentes de linguagem de programação.
http://tech.groups.yahoo.com/group/software-developers/
Assinatura:
http://tech.groups.yahoo.com/group/software-developers/join
software-developers-subscribe@yahoogroups.com
________________________________________________________________________
Delphi BUGS?
Chatch & Log every BUG showing Unit, Class, Method, Line #.
http://www.eurekalog.com/bannerclick.php?id=15
________________________________________________________________________
7. Delphi na Rede
Por Dave Murray <irongut @ vodafone.net>
Sites em português
==================
* Comunidade Delphi de Rio Preto
Portal com componentes, novidades, artigos, links e mais.
http://www.delphirp.com.br/
* Planet Delphi
Site brasileiro especializado em componentes para Delphi. Download
grátis.
http://www.fprass.hpg.ig.com.br/
* Delphi Company
Site do Fernando Gonçalves dedicado ao mundo Delphi
http://www.delphicompany.hpg.ig.com.br/
* IntereSite
Tudo sobre Delphi
http://www.ulbrajp.com.br/~tecnobyte/
* Advanced Developers
Delphi, productos, novidades, consultoria...
http://www.adev.com.br
* Fórum Delphi-BR
http://br.groups.yahoo.com/group/delphi-br/
* Fórum Delphi !!
http://www.qualyinf.com.br/forum/delphi/delphi.html
Componentes, Bibliotecas e Utilitários
======================================
Shareware/Comercial
-------------------
* EurekaLog v4.0.4 - by Fabio Dell'Aria (Std $29, Pro $49, Ent $99)
EurekaLog gives your application (GUI, Console, Web, etc.) the ability
to catch every exception, generate a detailed log (with unit, class,
method and line #) and send it via email. Fully integrated into the
IDE, you only need a single rebuild to add EurekaLog to your apps.
Does not decrease performance and increases compiled file size by just
0.5% - 4%. Compatible with Delphi 3 - 7 and all Windows platforms.
http://www.eurekalog.com/bannerclick.php?id=15
Freeware
--------
* eXpress Application Manager (XAM) for Delphi (with source code).
Don't loose more time with error messages like "Access violation",
"Division by zero" or "List index out of bounds"! Find quickly the
line of code concerned with the advanced exception manager XAM for
Delphi 5, 6 and 7. The XAM Debugger will help you to improve your
test phase or your users bug reporting.
http://www.urimont.com/index.php?page=delphi&subpage=delphi_xam
* InterBase Performance Monitor 1.1 Released
InterBase Performance Monitor provides a user-friendly interface for
InterBase 7's performance monitoring and administration features. You
can easily watch and control who is using resources on your server.
http://community.borland.com/article/0,1410,29632,00.html
* Audio Components Suite v2.0 - Andrei Borovsky (source) (DELPHI/KYLIX)
Components designed to perform different sound-processing tasks. ACS
can play sound via the sound card, acquire audio data from different
sources such as soundcard, audio CD and so on. Can also read and store
audio data in several file formats (including Ogg Vorbis).
http://www.mtu-net.ru/aborovsky/
* IdCGIRunner v3.1 - by Serhiy Perevoznyk (with source)
Execute CGI scripts using Indy TidHTTPServer.
http://users.chello.be/ws36637/
* IdISAPIRunner v3.1 - by Serhiy Perevoznyk (with source)
Execute ISAPI modules using Indy TidHTTPServer.
http://users.chello.be/ws36637/
* Icarus - Uses List Analyzer for Delphi v1.4.1 - by Peganza
Helps Delphi and Borland Pascal developers remove unnecessary units in
uses lists. Can also tell which units can be moved from the interface
to the implementation uses list.
http://www.torry.net/tools/developers/other/ICARUS3FULL.ZIP
* BDEChecker v1.0 - by Nick Moon
Performs a number of tests on your machine to check various settings
that are known/believed to cause problems with Paradox data tables.
http://www.nixsoft.co.uk/bdechecker.html
* LinLocalize v1.0 - by Jens Kuhner (with source) (KYLIX)
Free translation-tool for multilingual Kylix applications. It extracts
the Kylix-resources (resource strings and forms) of elf-files and
writes the translated resources back.
http://linlocalize.sourceforge.net/
* TurboPower Visual PlanIt v1.03 - by TurboPower (with source)
A set of synchronized, data-aware components for adding time, task and
contact management capabilities to applications written in Delphi and
C++Builder. Get that Outlook look & feel without the hassle.
https://sourceforge.net/projects/tpvplanit/
* TurboPower Abbrevia v3.04 - by TurboPower (with source) (DELPHI/KYLIX)
A compression toolkit for Delphi, C++Builder and Kylix. It supports
PKZIP 4, Microsoft CAB, TAR and gzip formats and the creation of self-
extracting archives. It includes visual components that simplify the
manipulation of ZIP files.
https://sourceforge.net/projects/tpabbrevia/
Atualizações do Delphi
----------------------
* Update: Bold for Delphi Architect
Registered users of purchased versions of Delphi 7 Architect can
download Bold for Delphi Architect R4.0-D7.
http://community.borland.com/article/0,1410,29798,00.html
* Update: IntraWeb and Rave for Delphi 7
Delphi 7 updates for AtoZed IntraWeb and Nevrona Rave Reports are now
available to download for registered users of purchased versions of
Delphi 7 Pro, Enterprise, and Architect.
http://community.borland.com/article/0,1410,29792,00.html
* Update: Delphi 6 Runtime Library Update 2
An update for Delphi 6 is now available to download for registered
users of purchased versions of Delphi 6.
http://community.borland.com/article/0,1410,29791,00.html
* Borland Product Companion CDs are online
Companion CD submissions are now available for download for:
C++Builder 6 Companion CD; Delphi 7 Companion CD, disk 1; Delphi 7
Companion CD, disk 2; InterBase 7 Companion CD; JBuilder 8 Companion
CD; Kylix 3 Companion CD.
http://community.borland.com/article/0,1410,29797,00.html
Artigos, Dicas e Truques
========================
* Multi-threaded programming contest winners - by John Kaster
Winners have been selected for the multi-threaded programming contest.
http://community.borland.com/article/0,1410,29786,00.html
* Building a stand-alone Web service with Indy in Delphi 7: Part I
- by Serge Dosyukov and Mike Pham
Shows how to build a stand-alone Web service using Indy and Delphi 7.
http://community.borland.com/article/0,1410,29484,00.html
* Building a stand-alone Web service with Indy in Delphi 7: Part II
- by Serge Dosyukov and Mike Pham
Part 2 demonstrates one technique for creating a single web service
that contains more than one TSoapDataModule instance.
http://community.borland.com/article/0,1410,29542,00.html
* Known Causes of Corruption in InterBase Databases - by Craig Stuntz
InterBase is, in general, a very stable database server and corruption
is rare. When corruption does occur, then, it is important to
determine the cause of the corruption. This article describes
circumstances that can cause corruption.
http://community.borland.com/article/0,1410,29515,00.html
* Monitoring System Shell Changes - by Zarko Gajic
Wanna get notified when a file gets created, renamed or deleted on the
system? Need to know the exact folder and file name? Let's start
monitoring system shell changes!
http://delphi.about.com/library/weekly/aa030403a.htm
* "Essential .NET" is not for the faint-of-heart - by Barb Seewer
http://builder.com.com/article.jhtml?id=u00220030220swr01.htm
* Tips for documenting an XML DTD - by William T. Kelly
http://builder.com.com/article.jhtml?id=u00420030219WTK01.htm
* An Overview of the new XPointer Specification - by Edmond Woychowsky
What are the details about the XPointer XML proposal, and how does it
compare to XPath? Learn more about this new standard and check out
some examples on how to put it to use.
http://builder.com.com/article.jhtml?id=u00320030220woy01.htm
* How to get the Selected Objects in a TWebbrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1190
* How to Get Rid Of the Annoying SQL Wait Cursor?
http://www.swissdelphicenter.ch/en/showcode.php?id=1305
* How to Explode a String?
http://www.swissdelphicenter.ch/en/showcode.php?id=1326
* How to flash the modal window title when user clicks the parent form?
http://www.swissdelphicenter.ch/en/showcode.php?id=1393
* How to search a TreeView Item through its Text property?
http://www.swissdelphicenter.ch/en/showcode.php?id=1414
* How to hook a function (in your own application)?
http://www.swissdelphicenter.ch/en/showcode.php?id=1422
* How to make deleting items in a TListView faster?
http://www.swissdelphicenter.ch/en/showcode.php?id=1479
* How to implement flickerless animation of a sprite moving across a
background image?
http://www.swissdelphicenter.ch/en/showcode.php?id=1491
* How to jump to a certain key in Regedit?
http://www.swissdelphicenter.ch/en/showcode.php?id=1542
* How to Draw a line without using the LineTo function?
http://www.swissdelphicenter.ch/en/showcode.php?id=1569
* How to show balloon tooltips in my Delphi program?
http://www.swissdelphicenter.ch/en/showcode.php?id=1587
* How to popup the system menu at a specified position?
http://www.swissdelphicenter.ch/en/showcode.php?id=1594
* How to get paths of the folders in 'My Computer'?
http://www.swissdelphicenter.ch/en/showcode.php?id=1598
* Get CPU Speed - by Amir Mosavian
http://www.delphi3000.com/articles/article_3552.asp
* FEEDBACK: D6+ADO+MS.SS => D6+ADO+Oracle - by Hans Pieters
The results of a migration D6+ADO+MS.SS => D6+ADO+Oracle.
http://www.delphi3000.com/articles/article_3553.asp
* Auto LiveUpdate - by Xiao Smile
Auto LiveUpdate your program from an FTP server.
http://www.delphi3000.com/articles/article_3556.asp
* OnOffBtn - by Pete Coe
How to make a custom On/Off button with default Glyphs.
http://www.delphi3000.com/articles/article_3557.asp
* Event Chain Mechanism II - by Alex Wijoyo
Attach and detach many event handlers to an event at runtime.
http://www.delphi3000.com/articles/article_3560.asp
* Extracting complete list of URL's from the web server - by Sergey S
This article describes how to extract a list of all web resources
(URL's) from a web server like http://www.borland.com using the Clever
Internet Suite components. It can be implemented with any other
internet library.
http://www.delphi3000.com/articles/article_3561.asp
* Using the Google web APIs with Delphi - by Herbert Poltnik
http://www.delphi3000.com/articles/article_3563.asp
* Writing MS SQL Server Extended Stored Procedures with Delphi
- by Berend de Boer
http://www.delphi3000.com/articles/article_3564.asp
* Using the Affinity Mask in multi-CPU environments - by Kim Sandell
When writing applications that are designated to run in multi-CPU
environments, it is very useful to be able to control which CPU's the
application executes on. By optimizing the CPU usage one can
dramatically increase the performance of the application.
http://www.delphi3000.com/articles/article_3565.asp
* Quick Sort - by Sébastien Charest
How to quick sort an array?
http://www.delphi3000.com/articles/article_3566.asp
* Convert numbers to words - by Abdulaziz Jasser
http://www.delphi3000.com/articles/article_3567.asp
* Using XML in Delphi applications: Part II - by Sergey Kucherov
Implementing XML Parser using Microsoft SAX interface.
http://www.delphi3000.com/articles/article_3571.asp
* OpenGL I: Hello World - by Eber Irigoyen
Base code for your OpenGL Delphi applications.
http://www.delphi3000.com/articles/article_3572.asp
* mIRC DLL basics - by Gareth Ablett
Basic design use and layout of a Delphi DLL for mIRC.
http://www.delphi3000.com/articles/article_3573.asp
* Sort Order of Internet Explorer Favorites - by Daaron Dwyer
You can easily get the list of favorites from the directory, but how
can you emulate the same sort order showing in Internet Explorer?
http://www.delphi3000.com/articles/article_3574.asp
* Shell Programming with Delphi - by Marcel van Brakel
Some tricks for using Delphi for shell programming on Windows.
http://www.delphi-jedi.org/Jedi%3AVOY_SHELLPROG%3A372530
* ColorMask Lab Report
The purpose of this project is to display only the selected bits of
a 24-bit color image. Any or all of the 24-bits of each pixel can be
masked for display.
http://www.efg2.com/Lab/Graphics/Colors/ColorMask/index.htm
* Active Directory programming - by Marcel van Brakel
Active Directory programming isn't as hard as you thought, this
article steps through what you need to do.
http://www.delphi-jedi.org/Jedi%3AVOY_ACTIVEDIR%3A372530
* .Net Architecture - by Jon Shemitz
Overview of the .Net architecture, presented at BorCon London, 2002.
midnightbeach.com/jon/pubs/2002/BorCon.London/dotNetArchitecture.html
* PNG Graphics with Delphi and Kylix - by Chris Rorden
http://www.psychology.nottingham.ac.uk/staff/cr1/png.html
* 3D Controls - by Chris Rorden
This article is about controls that you can provide to allow a user to
select a viewpoint for a 3D image. It includes source code that
demonstrates the Euler Angles, Vector and Roll and ArcBall controls.
http://www.psychology.nottingham.ac.uk/staff/cr1/3d.html
* Scientific Mathematics - by Chris Rorden
Explains the use and benefits of 'Single Instruction, Multiple Data'
(SIMD) commands, ie. SSE, SSE2 and 3DNow!. Includes a Delphi app that
measures the time to complete a large number of maths operations using
either standard or SIMD commands.
http://www.psychology.nottingham.ac.uk/staff/cr1/simd.html
Kylix, CLX e Linux
------------------
* Kylix Deployment Notes for "Hello World" - by efg
Just how hard can it be to deploy a simple CLX application in Linux?
http://www.efg2.com/Lab/Library/Kylix/deployment.htm
* PNG Graphics with Delphi and Kylix - by Chris Rorden
http://www.psychology.nottingham.ac.uk/staff/cr1/png.html
* Graphics with Kylix - by Chris Rorden
http://www.psychology.nottingham.ac.uk/staff/cr1/kylix.html
* CLX and Cursors - by Matthias Thoma
CLX supports Bitmaps and Icons, as files and as resources, but misses
support for cursors. This article will fill that gap and show how to
create QCursors and how to load and use windows cursor resources.
http://www.efg2.com/Lab/Library/Kylix/MatthiasThoma/wincur.html
* KDE System Tray Applets - by Matthias Thoma
An easy way to add common TForms to KDEs system tray area.
http://www.efg2.com/Lab/Library/Kylix/MatthiasThoma/KDESystemTray.html
* Kylix for Delphi programmers - by Jon Shemitz
Presented at BorCon London, October 2002.
http://www.midnightbeach.com/jon/pubs/2002/BorCon.London/
KylixForDelphiProgrammers.html
Tutoriais
=========
* Speech Synthesis & Speech Recognition: Overview - by Brian Long
Overview of adding speech synthesis and speech recognition
capabilities into Delphi applications using the Microsoft Speech API.
http://community.borland.com/article/0,1410,29580,00.html
* Using SAPI 4 High Level Interfaces - by Brian Long
Details of adding speech synthesis and speech recognition capabilities
into Delphi applications using the high-level programming interfaces
in Microsoft Speech API v4.0 (SAPI 4).
http://community.borland.com/article/0,1410,29581,00.html
* Using SAPI 4 Low Level Interfaces - by Brian Long
Details of adding speech synthesis and speech recognition capabilities
into Delphi applications using the low-level programming interfaces
in Microsoft Speech API v4.0 (SAPI 4).
http://community.borland.com/article/0,1410,29582,00.html
* Speech Synthesis & Speech Recognition: Using SAPI 5.1
Details of adding speech synthesis and speech recognition capabilities
into Delphi apps using the Microsoft Speech API v5.1 (SAPI 5.1).
http://community.borland.com/article/0,1410,29583,00.html
* Windows NT Privileges - by Marcel van Brakel
This article describes how to discover and set Windows NT privileges
from your applications, so you can make better use Windows built-in
security capabilities.
http://www.thedelphimagazine.com/Samples/1577/1577.htm
* Creating an Internet Explorer-style User Interface Part 2
In the February 2003 issue of Hardcore Delphi, Fabio Lucarelli began
demonstrating how to build and maintain a user interface that mimics
the one in Internet Explorer and Outlook. In this article he continues
that task by introducing toolbar customization and chevrons, by using
two common controls: the toolbar and the Coolbar control.
pinnaclepublishing.com/dd/DDMag.nsf/0/BFBE071686BC1F6A85256CD9007AD663
* NTFS Disk Quotas - by Marcel van Brakel
Describes how to set and manage NTFS disk quotas programmatically.
http://www.thedelphimagazine.com/samples/1488/1488.htm
* File Sharing On Linux - by Primoz Gabrijelcic
Explores file locking support on Linux and presents a cross-platform
scheme for using the file system for interprocess synchronisation.
http://www.thedelphimagazine.com/samples/1481/1481.htm
* Interfaces: Off The Beaten Track - by Malcolm Groves
Shows how to use interfaces to automatically destroy objects, restore
objects to previous states, cut away swathes of try..finally blocks,
and deal with memory leaks.
http://www.thedelphimagazine.com/samples/1415/1415.htm
* Introduction to Design Patterns - by Ader Gonzalez
Introduces the concept of Design Patterns through the eyes of a Delphi
programmer.
http://www.delphi-jedi.org/Jedi%3AVOYPATTERNS
* Delphi: Type Safe Programming - by Richard A. Morris
A Run-Time Type Information tutorial from the 10th Borland Developer's
Conference. Includes a component called the RTTI Explorer which allows
us to delve into the innards of Delphi classes.
http://www8.pair.com/rmorris/rtti.htm
* Upcoming Borland WebEx events - by Anders Ohlsson
Feeling lazy today? Want to sit down in your pajamas and learn about
the technical details of software development utilizing some of the
finest technologies available today? Register for these seminars and
participate from the comfort of your own home to learn about: Delphi
for .NET, IntraWeb in Delphi, WebServices in Delphi and more.
Presented by Alain "Lino" Tadros.
http://community.borland.com/article/0,1410,29784,00.html
Outros Links
============
* Borland Delphi Developer Survey 2003 - by John Kaster
Let Borland know what you would like to see in future Delphi releases
by taking this survey. Five winners will receive a free Borland RAD
Enterprise/Architect software product of their choice.
http://community.borland.com/article/0,1410,29822,00.html
* 2003 Borland Developer Network (BDN) Survey - by David I
Help make sure that Borland continues to provide products, services
and support that you count on. Complete this comprehensive survey to
help Borland better understand your priorities and better serve your
needs going forward. As a small "thank you" for participation, you'll
be entered in a drawing for copies of Borland products - each valued
at up to $4000.
http://whatever.borland.com/bdnsurvey.html
* Public beta: Quality Central browser client
The public beta of the browser interface to QualityCentral (QC) is now
live. This beta of the web client (WC) is focused on functionality,
browser compatibility, and ease of use.
http://community.borland.com/article/0,1410,29803,00.html
* The FirebirdSQL Foundation
We are very pleased to announce the formation of "The FirebirdSQL
Foundation", a non-profit association with the objectives of
supporting and advancing the development of the open source
FirebirdSQL relational database engine.
http://www.swissdelphicenter.ch/en/shownews.php?id=349
Notícias
========
* Blog with Delphi and Borland news
http://svd.blogspot.com/
* Delphi / InterBase WebLog - by Craig Stuntz
News of interest to Delphi and InterBase developers.
http://delphi.weblogs.com/
* 28-FEB-2003: Update: Bold for Delphi Architect - by John Kaster
An update to Bold for Delphi 7 Architect is now available.
http://bdn.borland.com/article/0,1410,29798,00.html
* 01-MAR-2003: Borland Fires "Sidewinder" at VS.NET - by Alan Zeichick
Forthcoming C# IDE for Windows to support models, non-Microsoft
databases. Bringing together its compiler and IDE expertise, newly
acquired modeling software from TogetherSoft, and the .NET Framework
SDK licensed from Microsoft Corp., Borland Software Corp. is preparing
to release its own C# IDE for .NET.
http://www.sdtimes.com/news/073/story4.htm
* 01-MAR-2003: Borland Pulls Together
Talk about hitting the ground running. Borland Software Corp. has
already revamped its developer tools to incorporate key technologies
from its TogetherSoft acquisition–and the deal closed only one month
ago.
http://www.sdtimes.com/opinions/opinion_073.htm
* Borland Delphi .NET - Scheduled for April 2003
Borland's .NET tools lag behind Microsoft's, but the prospect of
cross-platform integration and strong modelling features should
ensure a significant share of the .NET market.
http://www.pcpro.co.uk/?reviews/reviews_story.php?id=38828
________________________________________________________________________
Vote o Boletim Pascal (Pascal Newsletter) em The Programming Pages!
http://www.programmingpages.com/?r=latiumsoftwarecomenpascal
Encontre o Pascal Newsletter na seção de Delphi e siga a link "Vote".
________________________________________________________________________
VOCÊ PODE NOS AJUDAR
Nós precisamos de sua ajuda para manter esse boletim ativo e cada vez
maior. Você pode ajudar indicando o boletim a seus amigos e colegas:
http://www.latiumsoftware.com/br/pascal/index.php
Você também pode votar para nós em um ou todos esses rankings para dar
maior visibilidade a nosso site e assim aumentar o número de assinantes
do boletim:
http://www.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
São alguns segundos para você que REALMENTE significam muito para nós.
Não esqueça que também precisamos de artigos para os boletins e que
existe um prêmio para um dos autores em cada número (em inglês).
Todos os artigos serão considerados mas nós estamos particularmente
interessados em artigos sobre Kylix já que existe pouco material
disponível online.
* Envie seu artigo em inglês para
pascal-newsletter-owner@yahoogroups.com
* Envie seu artigo em português para
boletim-pascal-owner@yahoogrupos.com.br
________________________________________________________________________
Se você não recebeu o código fonte completo dos exemplos neste número,
você pode obtê-los em http://www.latiumsoftware.com/br/pascal/p0045.zip
________________________________________________________________________
Esse boletim é fornecido "COMO ESTÁ" sem garantias de qualquer tipo. Seu
uso implica na aceitação dos termos de licença e isenção de garantia que
podem ser lidos em http://www.latiumsoftware.com/br/pascal/index.php
Os artigos são propriedade e copyright de seus respectivos autores e
foram reproduzidos aqui com sua permissão. Você pode redistribuir esse
boletim desde que na sua íntegra (incluindo notas de propriedade e
copyright), sem alterações e de forma gratuita.
________________________________________________________________________
Página do grupo:.....: http://br.groups.yahoo.com/group/boletim-pascal/
Assinar..............: boletim-pascal-subscribe@yahoogrupos.com.br
Cancelar assinatura..: boletim-pascal-unsubscribe@yahoogrupos.com.br
Assinar/cancelar.....: http://groups.yahoo.com/group/boletim-pascal/join
Problemas com sua assinatura? boletim-pascal-owner@yahoogrupos.com.br
________________________________________________________________________
Boletim Pascal http://www.latiumsoftware.com/br/pascal/index.php
Copyright (c) 2003 por Ernesto De Spirito. Todos os direitos reservados.
________________________________________________________________________
|