Boletim Pascal #46
Os exemplos do código fonte desta edição estão disponíveis para download.
![]() |
![]() |
Boletim Pascal #46 - 9 DE JUNHO DE 2003 Índice 1. Algumas Palavras dos Editores 2. Guia de Performance Interbase (I) - Desenvolvimento de Bancos de Dados · Normalize seu Banco · Chaves Primárias · Chaves Estrangeiras · Utilize Índices em Colunas de Ligadas (por operações de Join) · SQL · Subconsultas Correlacionadas · Joins Externos · Procedimentos Armazenados (Stored Procedures) · Não Utilize Colunas Char e Varchar Longas · Colunas BLOB · Utilize o Modelo Cliente-Servidor · Plano de Consulta · RDB$DB_KEY - Guia para o Servidor · Utilize um Servidor Dedicado · Utilize Linux ou Unix como SO do Servidor · Se Tiver que Usar o Windows · Utilize Máquinas Mono-Processadas com InterBase · Utilize um Disco Rígido Dedicado · E/S de Disco Rápida · Utilize um IP Estático no Servidor · Utilize TCP/IP como Protocolo de Rede · Não Utilize Proteção de Tela · Logins de Console · Utilize a Mesma Versão do Servidor no Cliente · Vencendo Restrições de E/S de Disco · Proteção de Arquivos no Windows 3. Inclusão de Componentes na Barra de Status 4. Enumerando Conexões de Rede Detetando Conexões de Rede Ativas 5. Pesquisando Arquivos em Delphi 6. Assembler Inline em Delphi (VIII) -Aritmética Inteira de 128 bits (2) 7. Fóruns / Listas 8. Delphi na Rede - Sites em português - Componentes, Bibliotecas e Utilidades . Shareware/Comercial . Freeware · Atualizações do Delphi - Artigos, Dicas e Truques - Tutoriais - Outros Links - Notícias ________________________________________________________________________ 1. Algumas Palavras dos Editores Editorial da Versão em Português -------------------------------- Enfim, mais uma edição do Boletim Pascal está pronta! Além do atraso da versão em inglês, tivemos um atraso também na tradução desse número- nada de muito grave. Só gostaria de tomar um segundo do tempo de vocês para anunciar, com muito orgulho, diga-se de passagem, que o Boletim Pascal acaba de ultrapassar a incrível marca de 1000 associados- isso mesmo, 1000 associados! Devo dizer que estou particularmente orgulhoso dessa proeza, que se deu em pouco mais de uma ano de existência do boletim. Agradeço a todos os assinantes pelo continuado apoio e participação nessa empreitada. E espero que continuem conosco até que alcancemos as marcas de 2000, 3000, 4000, ... 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 ----------------------------- Desculpem-me pelo atraso na publicação desse número. Como de costume, gostaria de começar agradecendo aos autores que colaboraram com artigos para essa edição: Peter Mc Leod, Alex Schlecht, Igor Siticov e Charl Linssen e fico feliz em premiar os dois primeiros: * Peter Mc Leod (Guia de Performance Interbase) · 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/ * Alex Schlecht (Inclusão de Componentes na Barra de Status) · LMD StoragePack - por LMD Innovative - Shareware (EUR 59) Oito componentes para salvar/restaurar as configurações (em tempo de desenvolvimento, através de diálogo avançado de Seleção de Propriedades) a partir do Registro do Windows, arquivos INI, XML ou binários- também é fácil trocar os mecanismos de salvamento. Código fonte completo e projetos de exemplo incluídos. http://www.ceberus.com/lmd/products/index.php3#P9 Para o próximo número, teremos os seguintes prêmios para dois de nossos colaboradores (artigos em inglês): * SDL Component Suite 7.0 - por Software Development Lohninger ($99) O SDL Component Suite oferece uma ampla variedade de componentes 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 * NTTools 7 For Delphi - por i-tivity (US$39.95) Para de debater-se com a API de segurança do Windows NT! Tenha sua cópia do NTTools 7 para Delphi 4/5/6/7 agora e economize incontáveis horas com essa coleção de 40 componentes VCL escritos especificamente para lidar com as funções de segurança do Windows NT. Código fonte completo está incluído com o produto. http://www.i-tivity.biz/nttools.htm Nas notícias, a Borland está preparando a próxima versão do Delphi, codinome Octane, que deve entrar no mercado ainda no final deste ano. A nova versão continuará suportando a VCL e a CLX, permitindo a construção de aplicativos Windows de 32 bits tradicionais. O Delphi incluirár suporte completo a .NET e uma versão 100% .NET de um subconjunto da VCL estará disponível, permitindo a criação de aplicações para a plataforma .NET a partir do mesmo IDE, usando o conhecimento e a técnica adquiridos com as versões anteriores do Delphi. Para maiores informações sobre a próxima versão do Delphi: - Open Letter to the Delphi Community - por Simon Thornhill http://bdn.borland.com/article/0,1410,29951,00.html - Octane and Delphi Q&A - por Anders Ohlsso http://bdn.borland.com/article/0,1410,29952,00.html Se você usa o Delphi 6, não se esqueça de verificar as atualizações do Delphi na seção Delphi na Rede- há uma nova atualização para a biblioteca de tempo de execução- não esqueça de fazer o download! Espero que goste desse número. Cordialmente, Ernesto De Spirito boletim-pascal-owner@yahoogrupos.com.br __________________ Colaboraram neste número: Dave Murray ________________________________________________________________________ Junte-se ao maior e mais influente grupo de discussão Delphi em língua portuguesa. http://groups.yahoo.com/group/delphi-br ________________________________________________________________________ 2. Guia de Performance Inter base (I) Por Peter Mc Leod <PeterMcLeod@practical.com.au> Tradução: Cristiano de Favari Marcello Henrique da Costa Grec Este artigo tenta definir várias direções em como conseguir a melhor performance no Interbase. Antes de chegar aos aspectos que eu recomendaria no projeto de bancos de dados para atender às demandas de seus clientes, eu pediria que você lembrasse que geralmente os aspectos mais caros (na ordem) dos custos de um projeto são: 1. Desenvolvedores 2. Rede 3. Servidor Então, quando estiver priorizando seus recursos, mantenha os itens acima em mente. Também, um atalho tomado no começo (tal como não testar um banco de dados largamente povoado) sempre leva no mínimo três vezes mais tempo para reparar mais tarde, levando a custos no mínimo três vezes maiores. Desenvolvimento de Bancos de Dados ================================== Normalize seu Banco ------------------- Não interessa para qual banco de dados você esteja desenvolvendo, você tem que começar com um bom projeto. Assegure-se que você tenha seu banco de dados normalizado no mínimo na terceira forma normal. Assegure-se que suas chaves primárias são independentes de qualquer objeto de negócio que você esteja armazenando e, por razões de performance, use um Integer sempre que possível (Integers são 32 bits e ordenados mais rapidamente pela maioria dos algoritmos se comparado com campos Char e Varchar), a menos que você não possa fazer isto por uma razão específica (tal quando você precisa de um identificador único para replicação ou quando você está usando um banco de dados relacional para armazenar objetos). Chaves Primárias ---------------- Se você definir uma chave primária composta, mais que um índice é criado (um para cada coluna que compõe a chave). Como o otimizador de consultas usará os múltiplos índices para resolver a consulta, isto pode causar um gargalo para o otimizador, já que os múltiplos índices usados pelo otimizador são iguais aos campos da consulta. Chaves Estrangeiras ------------------- Chaves estrangeiras são essencialmente restrições de integridade referencial. O problema com chaves estrangeiras é que elas criarão um índice na respectiva tabela para facilitar a restrição. Normalmente isto não é um problema; contudo, se você tem uma restrição de chave estrangeira em colunas que tendem a não ter valores únicos, então você tem um índice bastante pobre. Se o otimizador de consultas utilizar um desses índices, isto causará um gargalo devido à pobreza dos índices. Nestes casos, remover os índices pode melhorar a performance das consultas em 100%. Então tenha cuidado quando você definir suas chaves estrangeiras. Utilize Índices em Colunas de Ligadas (por operações de Join) ------------------------------------------------------------- Um índice é uma estrutura de dados de árvore balanceada que fornece uma melhora na velocidade de ordenação para um banco de dados. Índices do Intebase são de direções exatas (ascendente ou descendente) então, se você realiza uma busca de trás para frente nos dados de uma tabela, você deve definir um índice descendente. Índices trabalham melhor com dados que apresentam alguma exclusividade sobre ele. O otimizador de consultas do Interbase usará índices para acelerar as consultas. Índices na verdade podem ser prejudiciais à performance se criados em colunas que têm poucos valores únicos. Índices deixam lentas as inserções de dados em uma tabela, já que eles precisam ser recalculados a cada inclusão. Se você for fazer um grande número de inserções em uma tabela você pode considerar a desativação temporária de índices para minimizar o impacto de performance (ALTER INDEX name INACTIVE) e sua posterior reativação após as inclusões (ALTER INDEX name ACTIVE). Para determinar a eficiência de um índice, rode a seguinte instrução SQL: Select RDB$INDEX_NAME, RDB$STATISTICS from RDB$INDICES O valor RDB$STATISTICS mostra a eficiência do índice. Quanto mais baixo o valor, melhor o índice, com o valor 1 indicando um índice muito pobre. Como regra geral, você deve definir apenas uns poucos índices por tabela (o otimizador de consultas usará múltiplos índices para referenciar os mesmos campos conforme exigido pela consulta, portanto muitos índices podem degradar a performance). SQL --- Certas instruções SQL são mais lentas que outras. Geralmente, evite o uso de funções como "CONTAINING", "LIKE", "<>", "COUNT" e "UPPER" pois elas não usarão índices durante sua operação, tornando-as mais lentas que outros comandos. O livro "SQL Performance Tuning" de Peter Gulutzan e Trudy Pelzer cobre em detalhes como melhorar a eficiência de suas instruções SQL sem particularizar aspectos proprietários. Eu recomendaria este livro a qualquer um que esteja envolvido com o desenvolvimento em banco dados. Subconsultas Correlacionadas ---------------------------- Uma subconsulta correlacionada é uma subconsulta onde as condições da subconsulta são diferentes para cada linha na consulta principal. Por isto, as subconsultas precisam ser executadas várias vezes (uma para cada linha da consulta pai). Em alguns casos, uma junção pode substituir uma subconsulta correlacionada e resultará em um tempo de execução total menor para a mesma consulta. Joins Externos -------------- Outer joins são a realidade da programação em banco de dados. Left outer join tem a tendência de ser mais lento e um índice será apenas utilizado para a resolução do primeiro outer join na consulta. Onde possível, reduza a necessidade de left outer joins. Isto pode ser feito: - Projetando suas tabelas de forma a não serem necessários - Usando subconsultas (isto pode ser mais rápido que a solução left outer joins) - Usando um procedimento armazenado com select para aumentar a velocidade. Procedimentos Armazenados (Stored Procedures) --------------------------------------------- Quando criar um procedimento armazenado que contém laços aninhados assegure-se que o laço mais externo retorna o menor número possível de registros. Se possível, estruture seu procedimento armazenado de forma que os laços mais internos sejam sempre os mais rápidos já que são esses blocos os mais repetidos ao longo do processamento da rotina. Não Utilize Colunas Char e Varchar Longas ----------------------------------------- Antes do Interbase 7.0, Varchar's and Char's eram preenchidos ao tamanho do campo quando retornado ao cliente. Se você apenas preencher parte de um varchar grande ou um campo char e então retornar os resultados ao cliente, uma grande quantidade de tráfego de rede é gerado, degradando a performance de sua aplicação e da rede. Se possível, não use campos Varchar ou Char longos e, se possível, use BLOBs. Um Blob também tem a vantagem de ser armazenado em sua própria página no banco de dados e assim reduz a chance de qualquer bloqueio. Alternativamente, faça o upgrade para a versão 7.0 do Interbase. Colunas BLOB ------------ Um BLOB (Binary Large OBject) é um tipo e dado que suporta grandes objetos. Um Blob é definido com um tamanho de segmento e, no Interbase, este default é 80 bytes. Se um campo Blob é definido com um tamanho de segmento igual ao tamanho da página do banco de dados, então consultas a campos Blob tornam-se extremamente rápidas, pois apenas uma página precisa ser resgatada para retornar os dados. Sob estas situações, o Interbase não é um gargalo para a transferência de dados. Outros sistemas, como sistema de hardware, rede, etc, normalmente deixam baixa a taxa de transferência de dados. Utilize o Modelo Cliente-Servidor --------------------------------- Interbase fornece várias características que permitem que os processamentos sejam realizados no servidor (que possui geralmente maior capacidade de processamento que uma máquina cliente e também permite a redução do tráfego na rede). Triggers (gatilhos), UDFs e procedimentos armazenados são adequadamente detalhados no "Guia do Programador" e no "Guia de definição de dados" sem serem detalhados aqui. Plano de Consulta ----------------- Interbase usa um otimizador baseado em custo para otimizar a execução de instruções SQL. Na maioria dos casos, o otimizador faz um trabalho muito bom. Sob certas circunstâncias, o otimizador não seleciona o melhor plano para performance. Esteja informado que se você especificar seu próprio plano de consulta, o otimizador não analisará seu plano para assegurar que ele está correto. Detalhes de quando e como ajustar um plano de consulta do Interbase podem ser encontrados nos seguintes sites: * Specifying Query Access Plans in the Interbase Optimizer on the documentation page http://www.ibphoenix.com * Managing your Interbase Server by Paul McGee http://www.mers.com RDB$DB_KEY ---------- A rdb$db_key é um identificador de registro de baixo nível, mais rápido que chaves primárias para resgatar registros. Rdb$db_key's são apenas válidos para a vida da transação corrente e não podem ser pensados como identificadores de registro imutáveis. É ainda possível utilizar rdb$db_keys para melhorar a performance de rotinas SQL em um banco de dados Interbase. A desvantagem é que este ganho de performance é específico do Interbase. Para mais detalhes em como utilizar rdb$db_key, por favor consulte os documentos localizados no seguinte website: http://www.cvalde.com/ibdocumentation Guia para o Servidor ==================== Utilize um Servidor Dedicado ---------------------------- Um servidor dedicado fornece a melhor performance para um banco de dados cliente-servidor. O custo de uma performance inadequada é muito maior que o custo da compra de um servidor dedicado. Performances baixas refletirão em você como desenvolvedor e normalmente resultarão em perda de tempo identificando e corrigindo problemas. Não leva muito tempo para você justificar os custos de um servidor dedicado. Utilize Linux ou Unix como SO do Servidor ----------------------------------------- Servidores Linux ou Unix têm melhor utilização de memória e de memória virtual, modelos de priorização de multi-processador mais eficientes e, frequentemente, requerem menos recursos de CPU e de memória que outros sistemas operacionais. Servidores Linux demonstram impressionantes tempos de atividade quando comparados a suas contrapartes Windows. Linux também não parece ser atormentado por processos misteriosos que degradam performance e que desaparecem logo que você loga no servidor para examinar o problema. Servidores Linux ou Unix podem ser integrados a redes Windows com SAMBA, fornecendo um ambiente homogêneo na perspectiva das estações cliente. Se Tiver que Usar o Windows --------------------------- Verifique a configuração do seu servidor Windows para ver se está configurado para fornecer os recursos máximos de compartilhamento ou para aplicações de segundo plano. Como estas opções estão localizadas em diferentes áreas em diferentes máquinas Windows, verifique sua documentação do Windows. Estes ajustes podem ter um grande impacto na performance do Interbase. Utilize Máquinas Mono-Processadas com InterBase ----------------------------------------------- Se você está usando uma versão do Interbase sob o Windows NT antes da versão 7.0, então não use um servidor com multi-processador na plataforma Windows. Se você fizer isto, o processo do servidor Interbase saltará de processador para processador causando degradação na performance do seu servidor. Se você quer usar Interbase (antes da versão 7.0) em um sistema com multi-processadores, então use uma ferramenta para amarrar o Intebase a um processador (há algumas delas disponíveis, inclusive uma da Microsoft). Contudo você deve ainda estar ciente que, como alguns dos sistemas operacionais Windows NT mais antigos não têm implementados um modelo adequado de suporte a SMP, o ganho de performance pode não ser tanto quanto o esperado. Sistemas Linux têm suporte a SMP adequado. Utilize um Disco Rígido Dedicado -------------------------------- Se você tem um banco de dados armazenado no mesmo drive que as pagefiles do servidor, a elevação das operações de I/O das operações de memória virtual do servidor impactará na performance de sua aplicação. Aloque sempre seu banco de dados em um drive separado. Se você tem dinheiro para isto, eu recomendaria que seu sistema operacional fosse para um drive, seu banco de dados para outro e o arquivo de swap para outro drive. E/S de Disco Rápida ------------------- Operações de I/O em disco são frequentemente um gargalo para performance do banco de dados. Drives IDE frequentemente usam algum recurso de CPU. Se você puder, coloque sistemas SCSI mais rápidos. Ser mesquinho nesta área custará muito a você em termos de degradação da performance. Sistemas RAID também oferecem melhor performance que sistemas de disco único. Um apropriado array de drives SCSI é a melhor solução. Utilize um IP Estático no Servidor ---------------------------------- Um IP estático no servidor significa que o endereço IP do servidor pode ser encontrado mais rápido do que se for usado um serviço de tradução de nomes de endereço. Este IP deveria ser armazenado no Host file do servidor e no Host files das máquinas cliente. Utilize TCP/IP como Protocolo de Rede ------------------------------------- TCP/IP é um protocolo baseado em conexão (pacotes são roteados para o receptor pretendido ao invés de ir para todas as máquinas) o qual gera menos tráfico de rede que protocolos sem conexão como NetBEUI and IPX/SPX. TCP/IP é também mais rápido que estes protocolos e tem a vantagem de estar disponível em uma grande variedade de plataformas. Sempre que possível, TCP/IP deveria ser usado para comunicar-se com o Interbase por suas vantagens de velocidade. Para melhorar a performance além disto não é aconselhável instalar múltiplos protocolos na rede pois isto aumenta o "barulho" na rede. Se isto for inevitável, assegure-se que o protocolo de rede que você usa terá maior prioridade através da rede. Não Utilize Proteção de Tela ---------------------------- Protetores de tela, particularmente os tipos 3GL podem estar sobrecarregando o processador e degradarão visivelmente o desempenho do sistema. Na maioria dos casos os protetores de tela não são necessários pois os monitores modernos são projetados de modo que o risco de queimar a tela seja insignificante pois possuem sistema de proteção de energia e se desligarão após certo período de tempo. Se você não tiver um monitor com sistema de proteção de energia somente desligue-o- você estará gastando menos energia e diminuindo o aquecimento da sua sala. Se você tiver que usar um protetor de tela então use uma tela em branco ou marquee (ajuste a velocidade do texto para uma taxa lenta para evitar a utilização excessiva da CPU) pois estes usam menos quantidade de recursos do sistema. Logins de Console ----------------- Muitas pessoas tendem a usar Windows NT/2000 pois estão mais familiarizadas com o sistema operacional Windows. Se você realmente usa Windows NT, então não faça login desnecessariamente ou fique logado. Além de ser uma questão de segurança, deixar o servidor logado permite que processos rodem em segundo plano, o que pode degradar a performance do servidor. Até mesmo processos em segundo plano podem usar de 20-30% dos recursos do servidor. Há várias ferramentas que permitem a você manter seu servidor Interbase sem a necessidade de ter o servidor continuamente logado. Utilize a Mesma Versão do Servidor no Cliente --------------------------------------------- Se você tem uma versão do Cliente do Interbase ultrapassada na sua máquina cliente, compare com a versão instalada no servidor. Você pode estar sofrendo com um problema de performance. Testes com Interbase 5.1 e 5.6 podem demonstrar uma performance diferente em pouco mais que 50% por usar uma instalação de cliente ultrapassada. Também, características mais novas podem não estarem disponíveis se você não está usando a mesma versão de cliente e servidor e erros de programa podem resultar (em alguns casos isto pode causar um crash no seu servidor Interbase e possivelmente corromper seu banco de dados). Vencendo Restrições de E/S de Disco ----------------------------------- É possível reduzir o problema de operações de E/S em discos no Interbase. Depois de ter realizado o backup e o restore, crie uma tabela temporária no banco de dados (usando campos Blob ou colunas Varchar grandes). Preencha esta tabela com uma grande quantidade de dados. Então apague (drop) a tabela temporária e faça o sweep do banco de dados. Isto significa que o Interbase irá aproveitar o espaço dentro do banco de dados durante operações e não pedirá para ao SO espaço em disco até que o espaço vazio dentro do banco de dados tenha sido aproveitado. Isto aumenta a velocidade de operações de gravação para o banco de dados na medida que E/S de disco não é essencialmente um fator de limitação. Proteção de Arquivos no Windows ------------------------------- Algumas versões do Windows (Windows XP) têm implementado mecanismos de proteção a arquivos com extensão.GDB (Banco de dados Interbase). Se você está usando Sistema Operacional Windows mais recente que Windows 2000, você pode experimentar de-activating Windows File Protection ou renomear seu banco de dados para uma extensão diferente (Para Banco de dados Interbase superior a 7.0 ou FireBird 1.5). Os cínicos entre nós podem querer saber se a Microsoft fez isto para reduzir a performance do Interbase em comparação ao seu próprio banco de dados, o SQL Server... ________________________________________________________________________ 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. Inclusão de Componentes na Barra de Status Por Alex Schlecht http://www.bombus-software.de Tradução: Fabio Barreto A TStatusbar geralmente não permite que você coloque componentes nela. Mas, às vezes, pode ser bastante proveitoso incluir, por exemplo, uma TProgressBar num StatusBar. Este artigo mostra como adicionar componentes à uma TStatusbar e como ajustá-lo em um de seus painéis. Estas são (pelo memos) as duas formas de se incluir componentes no seu Statusbar: 1) Criando seu próprio objeto Statusbar --------------------------------------- Criar seu próprio Statusbar e pertmita a adição de componentes ao mesmo. Isto é possível estendendo o constructor Create: type TMyStatusBar = class(TStatusBar) public constructor Create(AOwner: TComponent); override; end; implementation constructor TMyStatusBar.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csAcceptsControls]; end; Isto é tudo! Agora este componente aceita outros como "filhos" e você pode colocá-los dentro do Statusbar em tempo de projeto. Mas eu não gosto muito desta forma porque você tem que usar este novo componente. Eu prefiro utilizar o componente "antigo" alterando-o um pouco. Assim, vamos dar uma olhada na minha forma favorita: 2) "Adote" um outro componente ------------------------------ A forma mais simples de incluir componentes num StatusBar é adotar os componentes! Coloque no seu furmulário um TStatusbar e também um TProgressBar (ou outro componente que você queira incluir no seu StatusBar). Então, escreva o seguinte no evento OnShow do Form: ProgressBar1.Parent := StatusBar1; ProgressBar1.Top := 1; ProgressBar1.Left := 1; Agora, o ProgressBar foi "adotado" pelo StatusBar. Mas, infelizmente, isto não parece muito legal porque o ProgressBar é mais largo que o panel e sua posição não está correta. Assim, nós temos que determinar a posição exata do ProgressBar utilizando as propriedades Border, Width and Height do StatusBar (nós temos que incluir este código no evento OnShow do form porque no evento OnCreate não existe handle disponível). uses CommCtrl; procedure TForm1.FormShow(Sender: TObject); var r : TRect; begin StatusBar1.Perform(SB_GETRECT,0,integer(@R)); // Determina o tamanho do panel 1 // SB_GETRECT precisa da Unit CommCtrl // 0 = primeiro panel do StatusBar; 1 = o segundo e assim por diante ProgressBar1.Parent := StatusBar1; // "Adota" o ProgressBar ProgressBar1.Top := r.Top; // Define o tamanho do... ProgressBar1.Left := r.Left; // ...ProgressBar para... ProgressBar1.Width := r.Right - r.Left; // ...ajustá-lo dentro do... ProgressBar1.Height := r.Bottom - r.Top; // ...panel end; Agora, o ProgressBar está ajustado precisamente dentro do primeiro painel do StatusBar! Se você deseja utilizar um segundo ou mais painéis, você só precisa mudar o parâmetro do comando "Perform". Comentários e aperfeiçoamentos são bem-vindos! Alex Schlecht ________________________________________________________________________ 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". ________________________________________________________________________ 4. Enumerando Conexões de Rede Detetando Conexões de Rede Ativas Por Igor Siticov SiComponents: http://www.sicomponents.com Tradução: Fabio Barreto Como detectar as conexões de rede atuais? A partir do prompt do MS-DOS, você pode enumerar as conexões de rede (drives) utilizando o seguinte comando: net use Em programação, você pode chamar WNetOpenEnum() para iniciar a numeração dos recursos conectados e WNetEnumResources para continuá-la. O código exemplo a seguir, enumera as conexões de rede: procedure TForm1.Button1Click(Sender: TObject); var i, dwResult: DWORD; hEnum: THANDLE; lpnrDrv, lpnrDrvLoc: PNETRESOURCE; s: string; const cbBuffer:DWORD = 16384; cEntries: DWORD = $FFFFFFFF; begin dwResult := WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, nil, hEnum); if dwResult <> NO_ERROR then begin ShowMessage('Não é possível enumerar as conexões da rede.'); Exit; end; s := ''; repeat lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer)); dwResult := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer); if dwResult = NO_ERROR then begin s := 'Unidades de red:'#13#10; lpnrDrvLoc := lpnrDrv; for i := 0 to cEntries - 1 do begin if lpnrDrvLoc^.lpLocalName <> nil then s := s + lpnrDrvLoc^.lpLocalName + #9 + lpnrDrvLoc^.lpRemoteName + #13#10; Inc(lpnrDrvLoc); end; end else if dwResult <> ERROR_NO_MORE_ITEMS then begin s:=s+'Não é possível completar a numeração dos drives de rede.'; GlobalFree(HGLOBAL(lpnrDrv)); break; end; GlobalFree(HGLOBAL(lpnrDrv)); until dwResult = ERROR_NO_MORE_ITEMS; WNetCloseEnum(hEnum); if s = '' then s := 'Não existem conexões na rede.'; ShowMessage(s); 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. Pesquisando Arquivos em Delphi Por Charl Linssen Tradução: Adilson Vahldick Olá leitor! Em um projeto meu precisei de uma procedure que procurasse um diretório e todos os seus subdiretórios e ainda mostrasse todos os seus arquivos. Pensei que acharia alguma rotina procedure assim na Internet, mas não achei nada descente. Assim, decidi escrever minha própria rotina. Aqui está ela: const MAXFILES = 1000; var CurrSearchedDir: Array [1..MAXFILES] of String; OriginalPath, OldSearchedDir: String; InSubDir: Boolean = False; CurrInstance: Integer; [...] procedure search(BasePath:String); var DirInfo: TSearchRec; I:Integer; begin Inc(CurrInstance); If InSubDir then CurrSearchedDir[CurrInstance] := OldSearchedDir + '\' + CurrSearchedDir[CurrInstance-1]; FindFirst(BasePath+'\*', faDirectory, DirInfo); repeat If (DirInfo.Name = '.') or (DirInfo.Name = '..') then Continue; If (ExtractFileExt(DirInfo.Name) <> '.html') and not ((DirInfo.attr and faDirectory) = faDirectory) then Continue; // Remova a linha acima quando você desejar procurar por qualquer // arquivo if (DirInfo.attr and faDirectory) = faDirectory then Begin InSubDir := True; OldSearchedDir := CurrSearchedDir[CurrInstance]; CurrSearchedDir[CurrInstance] := DirInfo.Name; Search(BasePath + DirInfo.Name + '\'); Continue; End; frMain.ListBox1.Items.Add(OriginalPath + CurrSearchedDir[CurrInstance] + '\' + DirInfo.Name); Until FindNext(DirInfo) <> 0; Dec(CurrInstance); end; Como você pode ver, examinando-a profundamente, esta procedure é recursiva. Isto significa que ela chama a si própria. Isto acontece quando é encontrado um subdiretório e é preciso procurar por arquivos e outros subdiretórios dentro dele. Esta procedure funciona para tantos subdiretórios quanto existirem. Divirta-se. -- Charl ________________________________________________________________________ 6. Assembler Inline em Delphi (VIII) -Aritmética Inteira de 128 bits (2) Por Ernesto De Spirito Tradução: Adilson Vahldick No código-fonte exemplo (anexado) você encontrará a implementação de algumas funções para operações com o tipo Hugeint que foi introduzido no artigo passado. A proposta é exemplificar as instruções que nós vimos há muito tempo com algumas novas: BT (Bit Test): BT dword ptr [eax], edx --> CF = valor do EDX-ésimo bit na memória apontada por EAX BTS (Bit Test and Set): BTS dword ptr [eax], edx --> atribui 1 para o EDX-ésimo bit na memória apontado por EAX CF = valor anterior deste bit BTR (Bit Test and Reset): BTR dword ptr [eax], edx --> atribui 0 para o EDX-ésimo bit na memória apontado por EAX CF = valor anterior deste bit BTC (Bit Test and Complement): BTC dword ptr [eax], edx --> inverte o valor do EDX-ésimo bit na memória apontada por EAX CF = valor anterior deste bit Não reproduziremos as funções aqui, uma vez que você pode encontrá-los no código-fonte anexo, mas mostraremos diferentes implementações da função _IsNeg, simplesmente apresentando mais exemplos das instruções que vimos tempos atrás: function _IsNeg(x: Hugeint): boolean; // Resultado := x < 0; // Se x < 0 retorna True (1) senão retorna False (0) // Parâmetros: EAX = @x asm mov eax, [eax+_3_] // EAX := 32 bits de alta ordem de x shr eax, 31 // AL := Bit de alta ordem de EAX (sign bit) end; function _IsNeg(x: Hugeint): boolean; asm cmp dword ptr [eax+_3_], 0 // if x[3] < 0 then jl @@negative // goto @@negative mov al, 0 // Result := False; ret // exit; @@negative: // @@negative: mov al, 1 // Result := True; end; function _IsNeg(x: Hugeint): boolean; asm // atribuir o Sign Flag e colocá-lo em AL mov eax, [eax+_3_] // EAX := 32 bits de alta ordem de x or eax, eax // SF := Sign bit de EAX // alt.: add eax, 0 // ou: sub eax, 0 // ou: and eax, eax // ou: and eax, -1 // ou qq valor negativo // ou: test eax, eax // ou: test eax, -1 // ou qq valor negativo sets al // AL := SF; // Sign Flag // alt.: lahf; shr ax, 31 // ou: lahf; rol ax, 1; and al, $1 end; function _IsNeg(x: Hugeint): boolean; asm // atribui o Carry Flag com o Sign Bit e colocá-lo em AL mov eax, [eax+_3_] // EAX := 32 bits de alta ordem de x bt eax, 31 // CF := Sign bit de EAX // alt.: shl/rol/rcl eax, 1 setc al // AL := CF; // Carry Flag // alt.: mov al, 0; rcl, 1 // ou: mov al, 0; adc al, al // ou: lahf; mov al, ah; and al, $1 // ou: lahf; ror/rcr/shr/sar ax, 1; shr al, 7 // ou: lahf; ror/shr/sar ax, 8; and al, $1 // ou: lahf; rol ax, 8; and al, $1 // ou: lahf; rcl ax, 9; and al, $1 end; function _IsNeg(x: Hugeint): boolean; asm // atribuir o Parity Flag e negá-lo em AL mov al, [eax+_3_+3] // EAX := 8 bits de alta ordem de x or al, $7F // PF := Not Sign bit // alt.: and eax, $80000000 setnp al // AL := Not PF; // Not Parity Flag // alt.: lahf; rol/shl ax, 6 / rcl ax, 7; xor al,-1 / not al; and al, $1; // ou: lahf; ror/shr/sar ax, 10 / rcr ax, 11; xor al,-1 / not al; and al, $1; end; Na próxima parte veremos funções para adicionar, subtrair, multiplicar e dividir inteiro HugeInt. ________________________________________________________________________ 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/ ________________________________________________________________________ 7. 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 ________________________________________________________________________ 8. 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 ------------------- * LMD StoragePack - por LMD Innovative - Shareware (EUR 59) Oito componentes para salvar/restaurar as configurações (em tempo de desenvolvimento, através de diálogo avançado de Seleção de Propriedades) a partir do Registro do Windows, arquivos INI, XML ou binários- também é fácil trocar os mecanismos de salvamento. Código fonte completo e projetos de exemplo incluídos. http://www.ceberus.com/lmd/products/index.php3#P9 Freeware -------- * Mozilla v1.3 - by mozilla.org Mozilla 1.3 is now available for download. First there was image blocking, then came pop-up blocking and now we have junk-mail filtering. Mozilla 1.3 also offers image auto-sizing, newsgroup filters, dynamic profile switching, nearly 2000 bug fixes, and more. http://www.mozilla.org/ * Compile Time Expert v1.12 - by Vit Kovalcik (with source) Compile Time is expert, which generates small file right before compilation. You can include this file in some of your units and easily use time of compilation stored in this file. http://www.fi.muni.cz/~xkovalc * Local Heap Memory Manager v1.0 - by Carsten Zeumer (with source) A Delphi memory manager replacement which allows you to limit the memory available to your application. Helps in finding memory holes in your components or to simmulate low memory conditions. http://www.torry.net/vcl/system/memory/localheapmm.zip * TOpacityForm v1.6.0 - by Vjacheslav Maslov (with source) Allows you to create transparent form. You can change transparency at runtime. Uses Layered technology so only Win2k and later supported. http://www.torry.net/vcl/forms/effects/opcform.zip * JG's TIMDBImport v1.02 - by JustGuy (with source) Native Delphi class for importing data from The Internet Movie Database and process it. Including search results and movie info. http://www.torry.net/vcl/internet/other/imdbimport.zip * TVortex OpenSource IRC v2.8.5 - by JoepezT (w. source) (DELPHI/KYLIX) OpenSource IRC components, includes: TVortexIRC for IRC connectivity; TClusterFile for handling incoming files; TClusterChat for handling incoming/outgoing DCC chats; Identd Server for auth services. http://www.berzerk.net * yEnc into a String - by Joao Barata (with source) (DELPHI/KYLIX) Converts a file into a string, which can be imported to TStringList. http://b-tools.hopto.org Atualizações do Delphi ---------------------- * Update: Delphi 6 RTL Update Pack 3 A fix for frame streaming is available for download. This update pack is not cumulative, so you need to have installed the General Update and the Update Pack 2 before applying this update. http://community.borland.com/article/0,1410,29932,00.html * Update: StarTeam integration for Delphi 6, 7 and C++Builder 6 Get access to the functionality of StarTeam directly from within the IDE with these new plug-ins (for owners of purchased products). http://community.borland.com/article/0,1410,29831,00.html Artigos, Dicas e Truques ======================== * Sip from the Firehose: CodeWright - by David I About the new Borland CodeWright Product Group. http://community.borland.com/article/0,1410,29854,00.html * Non-Rectangular Translucent Forms - by Philippe Randour How, on Windows 2000/XP, you can easily add a non-standard UI to your application by taking advantage of translucency and transparency. http://community.borland.com/article/0,1410,29579,00.html * Sip from the Firehose: Borland Wins Three Jolt Awards - by David I http://community.borland.com/article/0,1410,29882,00.html * Using Semaphores in Delphi: Part 1 - by Cary Jensen Semaphores are like mutexes on steroids. Not only can they coordinate multiple threads and process, but they can permit more than one simultaneous lock. This article shows how to use these useful objects in a multithreaded environment. http://community.borland.com/article/0,1410,29908,00.html * Registering DLL and ActiveX controls from code - by Zarko Gajic How to register and unregister OLE controls such as DLLs or ActiveX Controls from a Delphi application. http://delphi.about.com/library/weekly/aa040803a.htm * How to convert a WideString to a String? http://www.swissdelphicenter.ch/en/showcode.php?id=1692 * How to know if a form already exist before you dynamically create it? http://www.swissdelphicenter.ch/en/showcode.php?id=1693 * Pointer to variant - caution! http://www.swissdelphicenter.ch/en/showcode.php?id=1450 * How to create a database at run-time with ZEOS? http://www.swissdelphicenter.ch/en/showcode.php?id=1552 * How to enable/disable cut, copy, paste, clear of a TEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1700 * How to use a format parameter more than once? http://www.swissdelphicenter.ch/en/showcode.php?id=1690 * How to insert text at a Bookmark (MS Word)? http://www.swissdelphicenter.ch/en/showcode.php?id=1691 * How to create an Access Database? http://www.swissdelphicenter.ch/en/showcode.php?id=1695 * How to copy/paste TStringGrids cells to/from ClipBoard? http://www.swissdelphicenter.ch/en/showcode.php?id=1696 * How to Get the image size of a JPG, GIF and PNG image file? http://www.swissdelphicenter.ch/en/showcode.php?id=1698 * Determine whether the computer supports hibernation, the sleep states? http://www.swissdelphicenter.ch/en/showcode.php?id=1699 * How to get the language of MS Word? http://www.swissdelphicenter.ch/en/showcode.php?id=1688 * How to locate on a non-indexed field in a TTable? http://www.swissdelphicenter.ch/en/showcode.php?id=1348 * How to add records to TStrings (TTreeview / TListview)? http://www.swissdelphicenter.ch/en/showcode.php?id=1482 * How to convert a ADO Recordset to XML and the reverse way? http://www.swissdelphicenter.ch/en/showcode.php?id=1498 * How to create a TListView which automatically resorts by column click? http://www.swissdelphicenter.ch/en/showcode.php?id=1500 * How to stretch a bitmap? http://www.swissdelphicenter.ch/en/showcode.php?id=1566 * How to rotate the text in a StringGrid cell by 90°? http://www.swissdelphicenter.ch/en/showcode.php?id=1596 * How to change the OnClick behavior of a TRadioButton, TCombobox? http://www.swissdelphicenter.ch/en/showcode.php?id=1609 * How to combine two icons? http://www.swissdelphicenter.ch/en/showcode.php?id=1636 * How to save a TImagelist with all its images to a file? http://www.swissdelphicenter.ch/en/showcode.php?id=1626 * How to show a indeterminate ProgressBar in Win XP? http://www.swissdelphicenter.ch/en/showcode.php?id=1680 * How to search a directory tree for a specified file? http://www.swissdelphicenter.ch/en/showcode.php?id=1654 * How to align Text in a TRichEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1655 * How to detect whether a file's volume is NTFS? http://www.swissdelphicenter.ch/en/showcode.php?id=1657 * How to sort a Stringlist with the CustomSort Method? http://www.swissdelphicenter.ch/en/showcode.php?id=1664 * How to read/write REG_DWORD values from/to the Registry? http://www.swissdelphicenter.ch/en/showcode.php?id=1665 * How to get notified when the user changes the theme (XP)? http://www.swissdelphicenter.ch/en/showcode.php?id=1669 * How to store a TDateTime in the registry? http://www.swissdelphicenter.ch/en/showcode.php?id=1670 * How to Convert method pointers into function pointers? http://www.swissdelphicenter.ch/en/showcode.php?id=1671 * How to Get / Set the Clipboard text (without using VCL)? http://www.swissdelphicenter.ch/en/showcode.php?id=1677 * How to convert a WideString to a String? http://www.swissdelphicenter.ch/en/showcode.php?id=1692 * How to know if a form already exists before you dynamically create it? http://www.swissdelphicenter.ch/en/showcode.php?id=1693 * How to do a 2D Convolution on an Image? http://www.swissdelphicenter.ch/en/showcode.php?id=1704 * How to capture a Delphi CLX Form? http://www.swissdelphicenter.ch/en/showcode.php?id=1708 * Creating a System Restore Point - by Thomas Stutz How to create and cancel system restore points. http://www.delphi3000.com/articles/article_3575.asp * TEdit that damn background - by Matt Harrison Using WMEraseBkGnd to create a TEdit descendant that is transparent or has a background. http://www.delphi3000.com/articles/article_3576.asp * Introduction to SSL - by Eugene Mayevski Why SSL and how it works. http://www.delphi3000.com/articles/article_3577.asp * Certificate basics - by Eugene Mayevski Key management can be an issue in security-related tasks. Certificates define a standard way of managing keys and associated information. They are also used in SSL/TLS protocol and S/MIME. http://www.delphi3000.com/articles/article_3578.asp * How to store and retrieve GIF,BMP + JPG in a RDBMS - by Marcello Dias http://www.delphi3000.com/articles/article_3579.asp * Add task job - by Smile xiao Add a scheduled task job to your system. http://www.delphi3000.com/articles/article_3582.asp * Complete TFTP Server example, using Indy components - by Kim Sandell Example of multi-thredded TFTP Server, using Indy components. http://www.delphi3000.com/articles/article_3583.asp * Retrieve DSN names and ODBC Drivers list - by Oscar Noe Martin http://www.delphi3000.com/articles/article_3584.asp * No, You're not crazy Sql Server doesnt have generators - Marcello Dias How to make a 'Work around' on this limitation. http://www.delphi3000.com/articles/article_3586.asp * An Application Loader with a TCPServer - by Max Kleiner We had the requirement starting different Delphi apps from a linux or windows server, wherever you are. We call it Delphi Web Start (DWS). http://www.delphi3000.com/articles/article_3588.asp * Drawing a Shaded Rectangle - by Serhiy Perevoznyk Using GradientFill API function. http://www.delphi3000.com/articles/article_3591.asp * Bitmap Rotation - by Serhiy Perevoznyk Rotate a Bitmap Image in 90-Degree Increments. http://www.delphi3000.com/articles/article_3592.asp * Drawing Transparent Bitmaps - by Serhiy Perevoznyk http://www.delphi3000.com/articles/article_3593.asp * Alpha Blending a Bitmap - by Serhiy Perevoznyk http://www.delphi3000.com/articles/article_3594.asp * Simple example for the COMPOSITE Design Pattern - by Jochen Fromm What is the Composite Design Pattern? How do you copy a directory with all subdirectories in a simple way? http://www.delphi3000.com/articles/article_3595.asp * Get and use Sender properties, typecast it - by Steen Pedersen How to use the Senders Properties. http://www.delphi3000.com/articles/article_3596.asp * Get FullPath Application of Any Object - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3597.asp * Add Line into the end of a file - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3598.asp * Mouse Moviment Limiting - by Gilberto Saraiva If you want limit the mouse region, use this procedure. http://www.delphi3000.com/articles/article_3599.asp * How to disable the TreeView Hint - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3600.asp * OpenGL II: moving and rotating 2D shapes - by Eber Irigoyen This article shows you some basic movement and rotating and also tries to explain how openGL works. http://www.delphi3000.com/articles/article_3603.asp * Improve Interbase Client Server Performance - by Peter Mc Leod How do you get the best out of your Interbase Client Server System? http://www.delphi3000.com/articles/article_3606.asp * language for MS Office - by Mike Shkolnik How to read the default language of installed MS Office application? http://www.delphi3000.com/articles/article_3607.asp * PHP Alike implode & explode functions for Delphi - by Ronald Buster Implode returns a string containing the elements of a string array in order with a glue string between each element. Explode is the reverse. http://www.delphi3000.com/articles/article_3609.asp * OutlookExpress Directorie - by Ronald Buster How to find the OutlookExpress mailbox dir. http://www.delphi3000.com/articles/article_3611.asp * Ms Access LastinsertID - by Ronald Buster Retrieve the last insert id of the autoincrement field in Access. http://www.delphi3000.com/articles/article_3612.asp * OpenGL III: Moving and rotating 3D shapes - by Eber Irigoyen How to rotate around a shape's axis or rotate around another object. http://www.delphi3000.com/articles/article_3617.asp * Retrieve Current User and Domain Names on Win NT - Serhiy Perevoznyk How to retrieve the Current User and Domain Names on Windows NT using security functions within the Win32 API. http://www.delphi3000.com/articles/article_3618.asp * How to use TClientDataset as memory dataset - by Mike Shkolnik http://www.delphi3000.com/articles/article_3619.asp * Extended Mapi - by Tommy Andersen Accessing the Extended Mapi interface is not allways trivial. This component helps a quite a bit with this problem. http://www.delphi3000.com/articles/article_3620.asp * Simple way to rotate region - by Nik Ozniev http://www.delphi3000.com/articles/article_3623.asp * Understanding Threads - by Subha Narayanan http://www.delphi3000.com/articles/article_3624.asp * Setting File Summary Information - by Serhiy Perevoznyk How to set File Summary Information for non Office files (NTFS). http://www.delphi3000.com/articles/article_3625.asp * Give Me the Details or File Summary Info - by Serhiy Perevoznyk How to retrieve File Summary Information for non Office files (NTFS). http://www.delphi3000.com/articles/article_3626.asp * D7 ActiveX Web deployment bug workaround - by Robert White A workaround for Delphi 7 bug that disables Web Deployment. http://www.delphi3000.com/articles/article_3628.asp * Removing the popup menu in Flash .OCX with Delphi 4 - by Miguel Lucero Removing the popup menu in Macromedia Flash .OCX with Delphi 4. http://www.delphi3000.com/articles/article_3630.asp * OpenGL IV: Texture mapping - by Eber Irigoyen Texture mapping: The process of applying an image to a primitive. Texture mapping is often used to add realism to a scene. For example, you can apply a picture of a building facade to a polygon representing a wall. This article shows how to do texture mapping so your 3D objects become more realistic. http://www.delphi3000.com/articles/article_3631.asp * Making a reliable drawing procedure (random numbers) - Martin Strand How to make sure the same field/name/whatever is not drawn twice? http://www.delphi3000.com/articles/article_3632.asp * DOC to PRN - by Eddie Shipman Creating PRN file from MS Word DOC File. This works with the Word97 components and to make it work with the Word2000 components, some function calls and parameters must be changed. http://www.delphi3000.com/articles/article_3633.asp * Display a Property dialog for file, folder or drive - by Mike Shkolnik http://www.delphi3000.com/articles/article_3634.asp * HTML Dialog Boxes - by Wes Mess Using the ShowHTMLDialog function. http://www.delphi3000.com/articles/article_3635.asp * A Pragmatic Book for Programmers of Any Level - by Brian Kotek If you ever thought it would be great to have a veteran developer answer all of your methodology questions, take a look at this book. Appropriate for all experience levels it explains the development process from a language-neutral perspective. It's one of my favourite books and it includes some examples in Pascal as well as C and Java. http://builder.com.com/article.jhtml?id=u00320030317BXK01.htm * Deciding Between mySQL and SQL Server - by Sanders Kaufman, Jr. MySQL may be free but what if money isn't the only determining factor? Find out how these two database heavyweights stack up against each other and how to decide which one to use as your database system. http://builder.com.com/article.jhtml?id=u00320030318SKJ01.htm * Relational Databases: Inspiration Behind The Theory - by Susan Harkins Discover the origin of the modern relational data model and what every developer should know about this theory. Also, find out what the most important step is toward creating an efficient and flexible database. http://builder.com.com/article.jhtml?id=u00320030402ssh01.htm * Four Things to Consider Before Upgrading to .NET v1.1 - Tim Landgrave Architects and developers will need to consider four key areas that have changed from v1.0 v1.1 of the .NET Framework. These areas are newly integrated features, new functionality, compatibility issues, and security changes. http://builder.com.com/article.jhtml?id=u00320030409lan02.htm * Fast and Furious Guide to MySQL Database Engines - Sanders Kaufman Jr What if you were a racecar driver and could swap engines with the flip of a switch instead of having to make a trip to the garage? The MySQL database does something like this for developers; it gives you a choice of database engines and an easy way to switch them. Let's look at how you choose the engine and how to change between engines that are available to you. http://builder.com.com/article.jhtml?id=u00320030407SKJ01.htm * Tweak Oracle Data Buffers to Cache Entire Databases - Donald Burleson This advanced Oracle article explores the internal mechanisms of the Oracle data buffers, the RAM that Oracle uses to prevent unnecessary rereads of data blocks from disk. Understanding how data buffers operate is an important key to successfully using them in performance tuning an Oracle database. http://builder.com.com/article.jhtml?id=u00320030408brl01.htm Tutoriais ========= * Nesting DataSets in ClientDataSets - by Cary Jensen Like the name suggests, a nested dataset is a dataset within a dataset. By nesting one dataset inside another, you can reduce your overall storage needs, increase the efficiency of network communications, and simplify data operations. http://community.borland.com/article/0,1410,29825,00.html * Writing Robust Code - by Pedro Agulló Soliveres There are many subtle issues to be aware of when it comes to ensuring code correctness and robustness: this article examines some of these issues, with a special emphasis on contract-based programming. http://www.thedelphimagazine.com/samples/1599/1599.htm * Connection Closed Gracefully - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=1 * Introduction to Web Development with Delphi - by Hadi Hariri http://www.swissdelphicenter.ch/en/showarticle.php?id=2 * Introduction to sockets - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=3 * Introduction to Indy - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=4 * Building Kylix Applications: Indy Chapters - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=5 * IntraWeb: Implementing a "Hello World" application - Atozed Software http://www.swissdelphicenter.ch/en/showarticle.php?id=6 * IntraWeb Tutorial: User Input - by Atozed Software http://www.swissdelphicenter.ch/en/showarticle.php?id=7 * Creating Oracle User-Defined Aggregate Functions - by Beth Bowden By creating your own aggregate functions, you can extend Oracle's functionality and encourage code reuse in your applications. Find out how easy it is to add this skill to your repertoire. http://builder.com.com/article.jhtml?id=u00320030401adm01.htm * Download Builder.com's 'Remedial XML' series - by Lamont Adams Six-part series, which started with the basics of XML and moved on through data validation and parsers now available to download complete with all the code in either DOC or HTML format. http://builder.com.com/article.jhtml?id=u00320020717adm01.htm * Relational Databases: Inspiration Behind The Theory - by Susan Harkins Trying to use an RDBMS without applying relational database theory to your design is like trying to drive a standard transmission without using the clutch: you're not going to get very far. This series of articles shows how to apply relational rules and develop an efficient design that protects the validity of your data. The series starts with a look at the origins of the relational data model. http://builder.com.com/article.jhtml?id=u00320030402ssh01.htm * Relational Databases: Using Normal Forms to Create Databases - by Susan Harkins Developers have certain rules, known as normal forms, that they follow to create well-designed databases. This article examines normal forms through the creation of a simple database for storing information about a collection of books. http://builder.com.com/article.jhtml?id=u00320030409ssh01.htm * Relational Databases: Applying the First Normal Form - Susan Harkins The normal forms are so abstract that some developers have trouble figuring out how to apply them. Perhaps the best way to understand the normal forms is to start applying them to data, since rules tend to make more sense when you actually have data to divide. This article works through applying the 1NF rule, which is initially the most complicated to apply, to a sample book catalog database. http://builder.com.com/article.jhtml?id=u00320030416ssh01.htm * Relational Databases: Achieving Normalization - by Susan Harkins The last installment of this series began with a single table and worked through making it conform to 1NF. This table wound up becoming four tables. this article finishes the normalizing process by applying 2NF, 3NF and BCNF. http://builder.com.com/article.jhtml?id=u00320030423ssh01.htm Outros Links ============ * Pascal Newsletter: Mozilla Sidebar - by Dave Murray Our latest feature for Mozilla and Netscape 6+ users is a sidebar that lets you keep up to date with the latest issue of the newsletter while you browse the web. Just visit our website and click the 'add sidebar' button on the right-hand side of most pages. http://www.latiumsoftware.com/en/index.php * Pascal Newsletter: Opera Hotlist Panel - by Dave Murray Our latest feature for Opera 7 users is a hotlist panel that lets you keep up to date with the latest issue of the newsletter while you browse the web. Just visit our website and click the 'add hotlist panel' button on the right-hand side of most pages. http://www.latiumsoftware.com/en/index.php * Get Set for .NET with Borland launch events - by Anders Ohlsson http://community.borland.com/article/0,1410,29953,00.html * Built With Delphi - by Baltic Solutions Provides a list of all quality commercial, shareware and freeware products that have been developed using Delphi. http://www.balticsolutions.com/bwd/ * Mastering Delphi 7 - by Marco Cantu At the end of February, Sybex released Marco Cantu's latest book, Mastering Delphi 7. To learn more about its contents, differences from the previous version and download the source code visit Marco's site. http://www.marcocantu.com/md7 * Project JEDI Alliance Program Recently a number of people have approached Project JEDI, interested in having their projects become part of JEDI. The Steering Group announces the JEDI Alliance Program and provides guidelines for projects interested in joining. http://www.delphi-jedi.org/Jedi%3AADMIN_JEDI_ALLIANCE%3A441740 * Complete ASCII Table http://www.asciitable.com * The Latest Builder.com Technology Use Survey - by Lamont Adams http://builder.com.com/article.jhtml?id=u00320030331adm02.htm Notícias ======== * Open Letter to the Delphi Community - by Simon Thornhill Simon Thornhill writes about the next Delphi release. http://community.borland.com/article/0,1410,29951,00.html * Octane and Delphi Q&A - by Anders Ohlsson Q&A about the future of Delphi. http://community.borland.com/article/0,1410,29952,00.html * 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/ * News Digest: Update for Borland Customers An analyst news digest for Borland Customers. http://community.borland.com/article/0,1410,29848,00.html * Your Future: Delphi 8 OCTANE - by Zarko Gajic Octane is the code name for the next release of your favorite RAD tool. For the 8th anniversary of Delphi, Borland is preparing the most significant Delphi release: Octane will continue to provide VCL and CLX development for Win32 and Linux as well as new features and continued framework, compiler, IDE, and design time enhancements. http://delphi.about.com/cs/delphifornet/a/aa041703a.htm * SwissDelphiCenter NewsFeed Get the 10 most recent programming tips and developer news from SwissDelphiCenter as an RDF NewsFeed file. With the RDF file you can integrate the tips into your website or use them with a newsticker. http://www.swissdelphicenter.ch/en/newsfeed.php ________________________________________________________________________ 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/p0046.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 principal.....: http://www.latiumsoftware.com/br/pascal/index.php 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!






