Boletim Pascal #45
Os exemplos do código fonte desta edição estão disponíveis para download.
![]() |
![]() |
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.ceberus.com/lmd/products/index.php3#P4 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. ________________________________________________________________________ Como você classificaria o boletim? Classifique o boletim no ranking Delphi Top 200! http://top200.jazarsoft.com/delphi/rank.php3?id=latium ________________________________________________________________________ 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://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium ________________________________________________________________________ 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 D'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-7 and 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://groups.yahoo.com/group/components/ Assinatura: http://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://groups.yahoo.com/group/software-developers/ Assinatura: http://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/icarus.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/topsite.asp?r=latium 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.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/delphi/links/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 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. ________________________________________________________________________ |
Os exemplos do código fonte desta edição estão disponíveis para download.
![]() |
Erros? Omissões? Comentários? Por favor contate-nos!






