Boletim Pascal #37
Os exemplos do código fonte desta edição estão disponíveis para download.
![]() |
![]() |
Boletim Pascal #37 - JULHO-15-2002 ÍNDICE 1. ALGUMAS PALAVRAS DOS EDITORES 2. O FUTURO DO BDE 3. NÃO DOCUMENTADO: DETECTAR SE UMA APLICAÇÃO ENCERROU 4. ASSEMBLER NATIVO EM DELPHI (II) - STRINGS ANSI 5. DIÁLOGO LOCALIZAR BANCO DE DADOS 6. FÓRUMS 7. DELPHI NA REDE - Sites em português - Componentes, Bibliotecas e Utilidades . Shareware/Comercial . Freeware - Artigos, Dicas e Truques . Kylix - Tutoriais - Outros Links ________________________________________________________________________ 1. ALGUMAS PALAVRAS DOS EDITORES Editorial da Versão em Português ================================ Nossa, pessoal, peço mil desculpas pela demora na tradução desse número. Às vezes acabamos por superestimar nossa capacidade em lidar com várias coisas ao mesmo tempo. Foi o que fiz. Mas espero poder recuperar parte do prestígio perdido com o que venho preparando para os próximos números. Por enquanto é meio que surpresa, mas no próximo número espero poder adiantar algo para vocês. 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 ============================= Primeiramente, gostaríamos de agradecer a Thomas Stutz por contribuir com um artigo muito interessante e estamos igualmente orgulhosos em presenteá-lo com uma licença do SMImport, um suite de componentes de conversão de dados de vários dos formatos populares, oferecido por Scalabium: http://www.scalabium.com/smi/index.htm Nós teremos dois prêmios para o próximo número: * AnyShape Transpack v2.0 - por MindBlast Software (DELPHI + KYLIX) Tired of boring, rectangular windows? Welcome to the exciting world of transparent, weirdly shaped windows! An instant facelift for your GUI. What took hours before can now be done in seconds without writing a single line of code. Features: WYSIWYG editing, design-time preview, automatic dragging, REAL stay-on-top forms, combine regions and load/save regions from file. Cross-platform. Shareware, $30.00. http://www.mindblastsoftware.com/?page=transpack&ref=PascalNL * Developer Information Library (DIL) CD - por UK Borland User Group Over 17,000 Tips, Tricks, FAQs and Technical Articles · Patches and Updates for Borland Tools · Over 4000 Components & Tools · Over 4000 Bitmaps ready to use with another 20000 zipped · Over 350 ready to use JavaScripts · Complete Set of Linux How-tos · and much much more... http://www.richplum.co.uk/html/dil.asp Nós gostaríamos de lembrar a nossos assinantes de língua portuguesa e russa que nós já temos uma versão de nosso boletim na sua língua mãe: * Boletim Pascal - Português http://br.groups.yahoo.com/group/boletim-pascal/ Assinatura: http://groups.yahoo.com/group/boletim-pascal/join boletim-pascal-subscribe@yahoogrupos.com.br * Pascal Newsletter - Edição Russa http://groups.yahoo.com/group/pascal-newsletter-ru/ Assinatura: http://groups.yahoo.com/group/pascal-newsletter-ru/join pascal-newsletter-ru-subscribe@yahoogroups.com Tudo bem, agora vamos para o boletim. Saudações, Charl Linssen e Ernesto De Spirito pascal-newsletter-owner@yahoogroups.com __________________ Colaboraram na edição desse número: Dave Murray. ________________________________________________________________________ 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-6 and C++ Builder 3-5. http://www.jfactivesoft.com/ ________________________________________________________________________ 2. O FUTURO DO BDE Por Ernesto De Spirito <eds2004 @ latiumsoftware.com> Após o anúncio oficial da Borland a respeito do futuro do BDE, eu entrei em contato (e fui contactado por) vários desenvolvedores Delphi que usam atualmente o BDE, para saber de seus planos futuros a respeito do acesso a dados. Para bases de dados locais, o BDE continuará sendo usado, apesar de uma minoria discreta ainda considerar mudar para uma alternativa a curto ou curtíssimo prazo (na maioria, componentes de acesso a dados de terceiros, assim como Interbase acessado por IBX ou dbExpress). Para servidores de bancos de dados, o cenário muda radialmente. Entre aqueles que ainda utilizam versões antigas do Delphi, muitos não têm intenção de atualizar e, por isso, continuarão a utilizar o Delphi com links SQL e BDE; a maioria restante está considerando o uso do dbExpress, ADO e ADO.NET, apesar de muitos demonstrarem suas preocupações sobre essas alternativas: - dbExpress não é tão "universal" como os links SQL, o que significa que vários drivers estão faltando para alguns dos bancos de dados mais importantes, como o Microsoft SQL Server. Sobre o dbExpress ser mais rápido que o BDE, isso não é verdade para consultas menores pois o dbExpress não possui mecanismos de cache como o BDE, e assim sendo, os metadados são trafegados a cada consulta. Eu gostaria de creditar Vasilis Devletoglou por compartilhar suas descobertas a respeito do funcionamento interno do dbExpress conosco. Finalmente, quando alguém utiliza uma tecnologia por muitos anos, é difícil, por vezes, não ser um tanto conservador e considerar novas tecnologias como se fossem "beta". Nós todos sabemos que o dbExpress chegou para ficar mas que muitos desenvolvedores ainda o percebem como verde e em grande necessidade de mais desenvolvimento. - ADO e ADO.Net não estão em conformidade com as expectativas dos programadores Delphi em termos de performance e/ou funcionalidades; também não podemos ignorar o fato de que a maioria dos programadores irá preferir utilizar uma solução da Borland. Em conclusão, os únicos felizes aqui parecem ser aqueles que já haviam saído do BDE e mudado para uma alternativa há algum tempo... :-) Eu adoraria ouvir o retorno de vocês a respeito desse artigo pois quanto mais opiniões eu recebo, tanto melhor. ________________________________________________________________________ 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 ________________________________________________________________________ 3. NÃO DOCUMENTADO: DETECTAR SE UMA APLICAÇÃO ENCERROU Copyright (c) 2002 por Thomas Stutz Email: tom@swissdelphicenter.ch URL: http://www.swissdelphicenter.com/en/showcode.php?id=910 Em muitas situações, você pode querer detectar se uma aplicação foi bloqueada. Por exemplo, ao automatizar o Word, você pode querer saber se o Word parou de responder. Esse artigo descreve como detectar se um aplicativo parou de responder utilizando algumas funções não documentadas. { // Traduzido de C para Delphi por Thomas Stutz // Publicado originalmente em www.SwissDelphiCenter.com // Código Original: // (c)1999 Ashot Oganesyan K, SmartLine, Inc // mailto:ashot@aha.ru, http://www.protect-me.com, // http://www.codepile.com O código não utiliza a função SendMessageTimout da API Win32 para determinar se a aplicação está respondendo, mas chama funções não documentadas de User32.dll. --> Para Windows 95/98/ME chamamos a API IsHungThread() A função IsHungThread recupera o estado (rodando ou sem resposta) de uma thread especificada IsHungThread(DWORD dwThreadId): // O identificador da thread da BOOL; // janela principal da aplicação --> Para NT/2000/XP a API IsHungAppWindow(): A função IsHungThread recupera o estado (rodando ou sem resposta) de uma aplicação especificada IsHungAppWindow(Wnd: HWND): // handle da janela principal da aplicação BOOL; Infelizmente, a Microsoft não oferece os símbolos de exportação dessas funções em User32.lib; por isso, temos que aprender quais são de forma dinâmica, utilizando GetModuleHandle e GetProcAddress: } // Para Win9x/ME function IsAppResponding9x(dwThreadId: DWORD): Boolean; type TIsHungThread = function(dwThreadId: DWORD): BOOL; stdcall; var hUser32: THandle; IsHungThread: TIsHungThread; begin Result := True; hUser32 := GetModuleHandle('user32.dll'); if (hUser32 > 0) then begin @IsHungThread := GetProcAddress(hUser32, 'IsHungThread'); if Assigned(IsHungThread) then begin Result := not IsHungThread(dwThreadId); end; end; end; // Para Win NT/2000/XP function IsAppRespondingNT(wnd: HWND): Boolean; type TIsHungAppWindow = function(wnd:hWnd): BOOL; stdcall; var hUser32: THandle; IsHungAppWindow: TIsHungAppWindow; begin Result := True; hUser32 := GetModuleHandle('user32.dll'); if (hUser32 > 0) then begin @IsHungAppWindow := GetProcAddress(hUser32, 'IsHungAppWindow'); if Assigned(IsHungAppWindow) then begin Result := not IsHungAppWindow(wnd); end; end; end; function IsAppResponding(Wnd: HWND): Boolean; begin if not IsWindow(Wnd) then begin ShowMessage('Handle de janela incorreto'); Exit; end; if Win32Platform = VER PLATFORM WIN32 NT then Result := IsAppRespondingNT(wnd) else Result := IsAppResponding9X(GetWindowThreadProcessId(wnd,nil)); end; // Examplo: Verificar se o Word está bloqueado/respondendo procedure TForm1.Button3Click(Sender: TObject); var Res: DWORD; h: HWND; begin // Find Word by classname h := FindWindow(PChar('OpusApp'), nil); if h <> 0 then begin if IsAppResponding(h) then ShowMessage('O Word está respondendo') else ShowMessage('O Word não está respondendo'); end else ShowMessage('O Word não está aberto'); end; ________________________________________________________________________ Software Developers Forum. A place to discuss about software development and to share experience in the work, professional or commercial environments. http://groups.yahoo.com/group/software-developers/ Subscription: software-developers-subscribe@yahoogroups.com ________________________________________________________________________ 4. ASSEMBLER NATIVO EM DELPHI (II) - STRINGS ANSI Por Ernesto De Spirito Nesse capítulo iremos aprender algumas novas instruções assembler e o básico da manipulação de strings ANSI, também chamadas de strings longas. Novos opcodes ============= Abaixo os opcodes introduzidos neste atrigo: * JL (Jump if Lower, desvie se menor): A descrição mais adequada levaria muito tempo para ser explicada, então vamos dizer que JL salta (desvia) para o label especificado desde que na operação CMP (ou SUB) anterior o primeiro operando seja menor que o segundo numa comparação com sinal: // if signed(op1) < signed(op2) then goto @@label; cmp op1, op2 jl @@label JG (Jump if Greater, desvie se maior), JLE (Jump if Lower or Equal, desvie se menor ou igual) e JGE (Jump if Greater or Equal, desvie se maior ou igual) completa a família de desvios condicionais para comparações com sinal. * JA (Jump if Above, desvie se maior): salta (desvia) para o label especificado desde que na operação CMP (ou SUB) anterior o primeiro operando seja maior que o segundo numa comparação sem sinal: // if unsigned(op1) > unsigned(op2) then goto @@label; cmp op1, op2 ja @@label JB (Jump if Below, desvie se menor), JBE (Jump if Below or Equal, desvie se menor ou igual) e JAE (Jump if Above or Equal, desvie se maior ou igual) completam a família de desvios condicionais para comparações sem sinais. * LOOP: Decrementa ECX e, se não for zero, desvia para o label indicado. LOOP @@label é o equivalente mais curto e rápido de: dec ecx // ECX := ECX - 1; jnz @@label // if ECX <> 0 then goto @@label Examplo: xor eax, eax // EAX := EAX xor EAX; // EAX := 0; mov ecx, 5 // ECX := 5; @@label: add eax, ecx // EAX := EAX + ECX; // Executado 5 vezes loop @@label // Dec(ECX); if ECX <> 0 then goto @@label; // EAX seria 15 (5+4+3+2+1) Trabalhando com strings ANSI ============================ Uma variável string é representada por um ponteiro de 32 bits. Se a string é vazia (''), então o ponteiro é nil (zero), caso contrário, esse ponteiro aponta para o primeiro caractere dessa string. O tamanho da string e a contagem de referência são dois inteiros em deslocamentos negativos a partir do primeiro byte da string: +-----------+ | s: string |-------------------+ +-----------+ | V --+-----------+-----------+-----------+---+---+---+---+---+---+---+-- | allocSiz | refCnt | length | H | e | l | l | o | ! | #0| --+-----------+-----------+-----------+---+---+---+---+---+---+---+-- (longint) (longint) (longint) \-----------------v-----------------/ StrRec record const skew = sizeof(StrRec); // 12 Quando passamos uma string como um parâmetro para uma função, o que de fato é passado é o ponteiro de 32 bits. Os valores string são um pouco mais complicados de explicar. A rotina que chamou a rotina que retorna a string deve passar- como último e invisível parâmetro da chamada, um tipo PString-o endereço de uma variável string que receberá o resultado da função. d := Uppercase(s); // Internamente convertido para: Uppercase(s, @d); Se o resultado da função é usado em uma expressão ao invés de ser atribuído diretamente à variável, a rotina que chama deve utilizar uma variável temporária incializada com nil (string vazia). O compilador faz tudo isso automaticamente no nosso código Object Pascal mas, se temos que fazer isso por conta própria se optarmos por escrever código assembler que chame rotinas que retornam strings. Para algumas tarefas, não podemos chamar as clássicas funções de string diretamente. Por exemplo, a função Length não é o nome de uma função de verdade,. É uma construção interna do próprio compilador e o compilador gera o código para a função apropriada, dependendo do parâmetro ser uma string ou um array dinâmico. Em assembler, ao invés de Lenght, teríamos que usar a função LStrLen (declarada na unidade System) para obter o tamanho da string. Existem mais coisas que deveríamos saber a respeito das strings mas o que temos já é suficiente para um primeiro exemplo. Versão Assembler de Uppercase ============================= Eis a declaração da função: function AsmUpperCase(const s: string): string; O parâmetro "s" será passado em EAX e o endereço de "Result" será passado como o segundo parâmetro, ou seja, em EDX. Basicamente a função deve fazer: 1) Obter o comprimento da string a converter 2) Alocar memória para a string convertida 3) Copiar os caracteres um a um, convertidos para maiúsculas 1) Obter o comprimento da string a converter -------------------------------------------- Faremos isso através de uma chamada a System.@LStrLen. A função espera a string em EAX (ela já está lá) e o resultado será colocado em EAX; então, temos que salvar o valor de EAX (o parâmetro "s") em algum lugar antes de chamar a função de modo que "s" não seja perdido. Podemos salvar numa variável local "src". Já que funções são livres para utilizar os registradores EAX, ECX e EDX, presumimos que o valor em EDX ("@Result") poderia também ser destruído após uma chamada a System.@LStrLen, de modo que é útil salvar esse valor numa variável local, por exemplo, "psrc". O resultado da chamada a System.@LStrLen, deixado em EAX, servirá como parâmetro da chamada a System.@LStrSetLength (para alocar memória para o conteúdo da string de resultado), como contador dos bytes a copiar, de modo que esse valor também deve ser salvo, por exemplo, na variável "n": var pdst: Pointer; // Endereço da string resultado src: PChar; // String de origem n: Integer; // Comprimento da string de origem asm // O endereço da string de resultado é passado em EDX. // Salvamos esse valor na variável pdst: mov pdst, edx // pdst := EDX; // Salvamos EAX (s) na variável local (src) mov src, eax // src := EAX; // n := Length(s); call System.@LStrLen // EAX := LStrLen(EAX); mov n, eax // n := EAX; 2) Alocar memória para a string convertida ------------------------------------------ A alocação é realizada através de uma chamada a System.@LStrSetLength. O procedimento espera dois parâmetros: o endereço da string (que salvamos em "pdst") e o comprimento da string (que está em EAX). // SetLength(pdst^, n); // Alocar a string de resultado mov edx, eax // EDX := n; // Segundo parâmetro p/LStrSetLength mov eax, pdst // EAX := pdst; // Primeiro parâmetro p/LStrSetLength call System.@LStrSetLength // LStrSetLength(EAX, EDX); 3) Copiar os caracteres um a um, convertidos para maiúsculas ------------------------------------------------------------ Se o comprimento da string era zero, já terminamos: // if n = 0 then exit; mov ecx, n // ECX := n; test ecx, ecx // Fazer and de ECX com ECX para definir flags // (ECX inalterado) jz @@end // Ir para @@end se o flag zero está marcado (ECX=0) Não sendo esse o caso, devemos copiar os caracteres de uma string para a outra, convertendo-os para maiúsculas conforme necessário. Nós vamos utilizar ESI e EDX para apontar para os caracteres da string de origem e destino respectivamente, AL para carregar os caracteres da string de origem e realizar a mudança antes de armazená-los na string de destino e ECX para controlar a instrução de LOOP que contará os caracteres. Já que ESI é um registro que tem que ser preservado, devemos salvar seu valor para restaurá-lo mais tarde. Decidi salvar ESI colocando-o na pilha. push esi // Salve ESI na pilha // Inicializar ESI e EDX mov eax, pdst // EAX := pdst; // Endereço da string de resultado mov esi, src // ESI := src; // String de origem mov edx, [eax] // EDX := pdst^; // String de resultado @@cycle: mov al, [esi] // AL := ESI^; // if Shortint(AL) < Shortint(Ord('a')) then goto @@nochange cmp al, 'a' jl @@nochange // AL in ['a'..#127] // if Byte(AL) > Byte(Ord('a')) then goto @@nochange cmp al, 'z' ja @@nochange // AL in ['a'..'z'] sub al, 'a'-'A' // Dec(AL, Ord('a')-Ord('A')); @@nochange: mov [edx], al // EDX^ := AL; inc esi // Inc(ESI); inc edx // Inc(EDX); loop @@cycle // Dec(ECX); if ECX <> 0 then goto cycle pop esi // Restaurar ESI da pilha @@end: end; ________________________________________________________________________ 5. DIÁLOGO LOCALIZAR BANCO DE DADOS Por Ernesto De Spirito Recentemente, fui solicitado a acrescentar um diálogo de localização a todos os formulários de acesso a dados de um projeto. Assim, desenvolvi uma unidade simples para Delphi 5 que exibe um diálogo não modal, exibido sempre à frente, que permite os usuários especificarem um texto de busca e se o texto deve ser localizado no início, no meio ou no fim do campo, ou se a busca é para ser feita pelo texto exato. O diálogo tem botões para localizar o primeiro, próximo, anterior e último resultados. Para usar o diálogo, simplesmente acrescente um botão ao seu formulário, inclua a unidade DbFindDlg na cláusula uses e escreva um código como o código abaixo no evento OnClick do botão: procedure TMain.btnSearchClick(Sender: TObject); begin ShowFindDialog(Self, Table1); // Qualquer descendente de TDataset end; Se você tem um DBGrid, você pode utilizar a versão sobrecarregada que no combobox de campos exibe apenas os campos exibidos no grid: procedure TMain.btnSearchClick(Sender: TObject); begin ShowFindDialog(Self, DbGrid1); // Qualquer descendente de TDbGrid end; O diálogo destrói a si próprio quando fechado ou quando o dono passado (como primeiro parâmetro) é destruído. O projeto não está completo e ainda precisa de melhorias (por exemplo, no caso da versão com o grid, é presumido que todas as colunas do banco de dados estão ligadas a campos) mas já pode ser utilizado em diversas circunstâncias na forma atual, e por isso decidi compartilhá-lo. Todo o código fonte está disponível, assim como um exemplo bem simples. ________________________________________________________________________ 6. FÓRUMS 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 (em Português) ===================== 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 Delphi (Inglês) =============== Se você sabe bastante Delphi mas está longe de ser um guru, esse fórum é para você. Esse é o único fórum para programadores Delphi em nível intermediário na Web (hackers Delphi também são bem-vindos :-)). O fórum conta atualmente com mais de 700 membros e, em abril último, teve um tráfego de pouco mais de 450 mensagens: http://groups.yahoo.com/group/delphi-en Se você quer juntar-se ao grupo, a melhor forma é assinar a partir da web, uma vez que pode acessar as funcionalidades especiais disponíveis no site web (um ID Yahoo! é necessário; você pode obter um gratuitamente registrando-se como um usuário Yahoo!) mas, se você não quer registrar-se ou se não possui acesso Internet completo, você também pode assinar por email: http://groups.yahoo.com/group/delphi-en/join delphi-en-subscribe@yahoogroups.com Componentes (em 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. O fórum é novo e tem cerca de 160 membros e tráfego muito baixo: http://groups.yahoo.com/group/components Conto com sua participação no fórum para nos ajudar a crescer. Você pode assinar pela web ou, mais facilmente, por e-mail: http://groups.yahoo.com/group/components/join components-subscribe@yahoogroups.com Desenvolvedores de Software (em 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. O fórum é novo e tem cerca de 160 membros e tráfego muito baixo: http://groups.yahoo.com/group/software-developers Conto com sua participação no fórum para nos ajudar a crescer. Você pode assinar pela web ou, mais facilmente, por e-mail: http://groups.yahoo.com/group/software-developers/join software-developers-subscribe@yahoogroups.com ________________________________________________________________________ 7. DELPHI NA REDE Por Dave Murray <irongut @ vodafone.net> A referência do número passado ao DARTH C-to-Pascal header converter do Projeto JEDI não tinha URL- isso foi corrigido abaixo. Desculpas! - DM 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 ------------------- * TSDBGridFooter v2.0 by Jovan Sedlan, Shareware ($74.50) This component is a powerful tool that provides automatic calculations for your DBGrid and displays that information in a customizable footer under the grid. It is designed to work with TSDBGrid (also included) although you can use it with any TCustomDBGrid descendant. http://www.sedlan.com/dbgrid footer.php * The Logo Creator v2.5 - By Laughingbird Software Do-it-yourself logo creation software. The Logo Creator is a fun and easy to use software program made up of logo templates that you can modify and customize. For Macintosh and Windows. http://www.thelogocreator.com/ Freeware -------- * DARTH: C-to-Pascal header converter - by JEDI, FREEWARE with source Source compiles into a tool that parses C headers and generates Delphi source for Windows API calls. http://www.delphi-jedi.org/Jedi:TEAM DARTH HOME:40040 * TColorButton v1.0 - by 940801, FREEWARE with source This button drops down a colour select window, can be like Word 2000. http://940801.cndev.net/ * TGHIPEdit - by gh boy, FREEWARE with source An IP Address Editor Component. http://www.delphipages.com/uploads/Edits Combos/IPEdit.zip * THTMLLiteCLX - By Dave Baldwin, FREEWARE (DELPHI/KYLIX) An HTML viewer component designed for hobbyists, students, or casual users. Does not support Frames or the printing HTML documents. Image capabilities include GIF, animated GIF, JPEG and bitmap. http://www.pbear.com * CPU package - release 2 revision 22 - By Thomas Schatzl It is a small x86 CPU detection library. It should compile on Delphi 2-6 (tested 5 / 6 Personal) Win32 target, Freepascal 0.99.15+ (tested 1.0.6 / 1.1 Win32) for Win32 / OS/2 / GO32V2 / Linux targets (possibly others) and VP 2.1b (Win32 target, possibly DOS/Linux). Possibly will work with Kylix. http://members.yline.com/~tom at work/index.html Artigos, Dicas e Truques ======================== * Optimize DBImage fields and free disk space - by Zeriouh Abdelhafid How to reduce the size of and optimize dbimage or graphic fields. http://www.delphi3000.com/articles/article_3312.asp * BorCon 2002 Nugget: Jake's Tuesday report - by John Jacobson As posted on delphi.non-technical. http://community.borland.com/article/0,1410,28837,00.html * BorCon 2002 Nugget: Jake's Wednesday report - by John Jacobson As posted on delphi.non-technical. http://community.borland.com/article/0,1410,28839,00.html * How to use TWebBrowser printing functions - by Merlin http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index &myfaq=yes&id cat=12&categories=Internet/LAN * How to get a list of network drives - by Merlin http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index &myfaq=yes&id cat=12&categories=Internet/LAN * How to duplicate a TTable? - by Merlin http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index &myfaq=yes&id cat=13&categories=Databases * How to convert TDateTime to a UNIX timestamp and vice versa - Merlin http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index &myfaq=yes&id cat=13&categories=Databases * How to access password protected Paradox databases without a password http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index &myfaq=yes&id cat=13&categories=Databases * How to get the empty memory? - by sümer cip http://www.delphi3000.com/articles/article_3298.asp * TCollection Performance Issues and Solutions - by Clever Components http://www.delphi3000.com/articles/article_3301.asp * Make TextOut with 3d-Effect or hollow Text - by Holger Voigt http://www.delphi3000.com/articles/article_3303.asp * How to save file in BLOB and read from BLOB - by Mike Shkolnik http://www.delphi3000.com/articles/article_3304.asp * Loading an exe in a memo field - by Teun Spaans http://www.delphi3000.com/articles/article_3305.asp * Simple 3D Labels (Lowered and Raised) - by Abdulaziz Jasser http://www.delphi3000.com/articles/article_3307.asp * Custom Exception Dialogs + writing to the NT Event Log - D Wischnewski Knowing what goes wrong; when, where and why?. http://www.delphi3000.com/articles/article_3308.asp * SOAP raises the bar for CORBA The dawn of the Web Services era promises to link disparate businesses in a manner and on a scale reminiscent of Internet linked machines. http://community.borland.com/article/0,1410,28737,00.html * How to view a TDataSet in MS Excel? http://www.swissdelphicenter.ch/en/showcode.php?id=998 * How to change the default project directory in Delphi? http://www.swissdelphicenter.ch/en/showcode.php?id=1130 * How to use the AdjustTokenPrivileges function to enable a privilege? http://www.swissdelphicenter.ch/en/showcode.php?id=1177 * How to insert a Smiley image into a TRxRichEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1147 * How to to fade in/out a TImage? http://www.swissdelphicenter.ch/en/showcode.php?id=1165 * How to format a MessageDlg? http://www.swissdelphicenter.ch/en/showcode.php?id=1168 * How to create a registry entry in the autorun key? http://www.swissdelphicenter.ch/en/showcode.php?id=1157 * How to start a program and wait for its termination? http://www.swissdelphicenter.ch/en/showcode.php?id=93 * How to print a page in a TWebbrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=478 * How to create a GUID at runtime? http://www.swissdelphicenter.ch/en/showcode.php?id=1172 * How to Copy, Delete, Cut in the TWebbrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1174 * How to Show the Properties Dialog in the TWebbrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1175 * How to Show Balloon Tips for the Tray Icon? http://www.swissdelphicenter.ch/en/showcode.php?id=1164 * How to change the Borderstyle/ BorderColor of a TWebbrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1171 * How to extract a frame from a AVI file? http://www.swissdelphicenter.ch/en/showcode.php?id=1180 * How to show the 'run' Dialog? http://www.swissdelphicenter.ch/en/showcode.php?id=1181 * How to show shaded hints (XP)? http://www.swissdelphicenter.ch/en/showcode.php?id=1182 * How to check, if a file is on a local drive? http://www.swissdelphicenter.ch/en/showcode.php?id=1183 * How to regenerate all out-of-date indexes on a given table? http://www.swissdelphicenter.ch/en/showcode.php?id=1184 * How to hide the scrollbars of TWebBrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1185 * How to scroll TWebBrowser with own buttons? http://www.swissdelphicenter.ch/en/showcode.php?id=1186 * How to check if the copy command is active in a TWebBrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1187 * How to Replace images in a TWebBrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1188 * How to find and highlight text in TWebBrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1189 * How to get the lighter or darker color of a TColor variable? http://www.swissdelphicenter.ch/en/showcode.php?id=1194 * How to automatically dial/hangup the default Internet connection? http://www.swissdelphicenter.ch/en/showcode.php?id=1198 * How to rotate a DIB image? http://www.swissdelphicenter.ch/en/showcode.php?id=1199 * How to show the 'Choose Domain' dialog? http://www.swissdelphicenter.ch/en/showcode.php?id=1200 * How to list the user privileges (NT)? http://www.swissdelphicenter.ch/en/showcode.php?id=1201 * How to remove a Dll from memory? http://www.swissdelphicenter.ch/en/showcode.php?id=1202 * How to detect whether the CPU supports MMX? http://www.swissdelphicenter.ch/en/showcode.php?id=1203 * How to set the volume for the microphone/ mute it? http://www.swissdelphicenter.ch/en/showcode.php?id=1204 * How to switch a console application to full screen? http://www.swissdelphicenter.ch/en/showcode.php?id=1205 * How to hide the Minimize/Maximize buttons of a form? http://www.swissdelphicenter.ch/en/showcode.php?id=1207 * How to show password characters in a InputBox? http://www.swissdelphicenter.ch/en/showcode.php?id=1208 * How to save a Excel file as Text file? http://www.swissdelphicenter.ch/en/showcode.php?id=1209 * How to determine if a number is prime, quickly (2)? http://www.swissdelphicenter.ch/en/showcode.php?id=1210 * How to deactivate the (Windows) keys with a systemwide Hook? http://www.swissdelphicenter.ch/en/showcode.php?id=1212 * How to get the first/last visible line of a TRichEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1213 * How to return information about the current system? http://www.swissdelphicenter.ch/en/showcode.php?id=1215 * How to determine if the window is a Unicode window? http://www.swissdelphicenter.ch/en/showcode.php?id=1216 * Rotate an ellipse - by Holger Voigt Ellipse with Beziercurves. http://www.delphi3000.com/articles/article_3257.asp * Auto Hide for Form - by Zswang Wangjihu http://www.delphi3000.com/articles/article_3258.asp * Retrieving folder size - by Christian Cristofori This function tells you how many bytes a folder, with all subfolders and files occupies on a HD, CD, floppy or whatever. http://www.delphi3000.com/articles/article_3259.asp * Use own buttons to scroll TWebBrowser - by Smokey Mc. Pot http://www.delphi3000.com/articles/article_3262.asp * Change the looks of a MessageDlg... - by Smokey Mc. Pot http://www.delphi3000.com/articles/article_3263.asp * WebBrowser load from stream - by Zswang Wangjihu function ShowHtml(mWebBrowser:TWebBrowser;mStrings:TStrings):Boolean; http://www.delphi3000.com/articles/article_3267.asp * DataSet -> Strings -> DataSet - by Zswang Wangjihu Functions: TexttToDataSet, DataSetToText. http://www.delphi3000.com/articles/article_3269.asp * Creating Matlab files - by Flurin Honegger A library unit with basic building procedures. http://www.delphi3000.com/articles/article_3271.asp * An Iterative ASCII-Export - by Max Kleiner Exports records to a delimited file. http://www.delphi3000.com/articles/article_3272.asp * The Fast and Best way to get a local IP Address - by Gerson Tomas http://www.delphi3000.com/articles/article_3273.asp * Print data from table in QReport - by Alper Sirvan http://www.delphi3000.com/articles/article_3275.asp * Design-Time Component About Box Dialog (Delpih 6) - by Mike Heydon http://www.delphi3000.com/articles/article_3277.asp * Pump data from any dB into Interbase/Firebird - by Clever Components How to pump data from any ADO/BDE/ODBC and native Interbase/Firebird databases into Interbase/Firebird databases. http://www.delphi3000.com/articles/article_3278.asp * When do we use Application (Owner), Self or NIL? - by Max Kleiner Passing the right Owner to a component-constructor. http://www.delphi3000.com/articles/article_3281.asp * Make Application.ExeName work in DLLs - by Christian Cristofori http://www.delphi3000.com/articles/article_3283.asp * Create a DBExpress-Connection at Runtime - by Max Kleiner http://www.delphi3000.com/articles/article_3286.asp * High speed parser - by Yuriy Pisarev This component is intended for mathematics and logical calculations. http://www.delphi3000.com/articles/article_3287.asp * How to find the senders email address (MS Outlook) - by Marc Georges http://www.delphi3000.com/articles/article_3288.asp * Determine the date of Easter for a given year - by Oliver Moenche http://www.delphi3000.com/articles/article_3289.asp * Using AdjustTokenPrivileges to enable a privilege (NT) - Thomas Stutz http://www.delphi3000.com/articles/article_3291.asp * Getting the associated Icon of any file - by Daniel Wischnewski This article shows you how to extract the associated icon of any file. Including files that use shell icon handlers such as Corel Draw files. http://www.delphi3000.com/articles/article_3293.asp * Child windows of a window (forms within a form) - by Tommy Andersen http://www.delphi3000.com/articles/article_3294.asp * First/Last changed File in Folder - by Holger Voigt http://www.delphi3000.com/articles/article_3296.asp Tutoriais ========= * A Beginner's Guide to Delphi Programming - by Zarko Gajic FREE online Delphi programing course for beginners, now up to Part 5: Understanding the Delphi unit source. http://delphi.about.com/library/weekly/aa061802a.htm * Demystifying the syntax of regular expressions - by Shelley Doll Regular expressions are often wrongly perceived as mystical unknowns that only a true guru can understand. They're ugly to look at and if you don't know the syntax they can seem like cryptic strings of garbage you might get from a core dump. This article will help by walking you though the most commonly used regular expressions. http://builder.com.com/article.jhtml?id=u00220020603dol01.htm * SQL Basics I: Data Queries - by Shelley Doll Need a quick overview of SQL? This article will get you started from creating basic manipulation queries to altering the database to more advanced query concepts. http://builder.com.com/article.jhtml?id=u00320020531dol01.htm * SQL Basics II: SELECT statement options - by Shelley Doll Need a quick overview of SQL? This article picks up where the previous one left off with some additional functions and clauses for use with the basic SELECT data query. http://builder.com.com/article.jhtml?id=u00320020628dol01.htm Outros Links ============ * C++Builder Developer Survey 2002 - by C++Builder Product Team Survey to get feedback on current and desired features for future releases of C++ products from Borland. Your answers will have a direct impact on future product releases. Five prize winners will receive a free Borland Professional software product of their choice. http://infopoll.net/Live/surveys/s17964.htm * Builder 7 Personal Download Now Available - by Tim Del Chiaro Now you can download a free copy of new JBuilder 7 Personal including a free development license for non-commercial use. JBuilder 7 Personal is currently available in English for the Windows, Linux, Solaris and Mac OSX platforms. Other language editions are coming soon. http://community.borland.com/article/0,1410,28844,00.html * Delphi 6 Updates for the RTL and Informix 9.2.1 - by John Kaster Registered users can download two new updates for Delphi 6. Included in the RTL pack is a SysUtils update that remedies a deadlock issue that could appear when many Web modules were being used under heavy load causing the Web application to stop responding. http://community.borland.com/article/0,1410,28783,00.html * Borland demonstrates .NET technology - by Anders Ohlsson DevRel shows Delphi for .NET preview at VS Live in New York. http://community.borland.com/article/0,1410,28788,00.html * Merlin's Delphi Forge Delphi news, faq, tips, downloads, classifieds and more. http://www.delphifaq.net/ * Builder.com Readers' Choice Awards The time has come! Make your voice heard, and vote for your favorite development tool in the 2002 Builder.com Readers' Choice Awards. You can vote for Borland in these categories: Best Java IDE, Best Java Application Server, Best Windows Development Tool and Best Linux IDE. http://clickthru.online.com/Click?q=06-fP6uI482uKMaF6Gma-TvR7xyY8ZR ________________________________________________________________________ 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/p0037.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) 2002 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!






