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.lmdinnovative.com/products/vcl/lmdstoragepack/
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://top100borland.com/in.php?who=20
________________________________________________________________________
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/?r=latiumsoftwarecomenpascal
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-2006 & 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://tech.groups.yahoo.com/group/components/
Assinatura:
http://tech.groups.yahoo.com/group/components/join
components-subscribe@yahoogroups.com
* Desenvolvedores de Software (inglês): Esse é um fórum para discussões
sobre o desenvolvimento de software e para a troca de experiências de
trabalho em ambientes profissionais e comerciais. Esse não é um fórum
sobre programação; os assuntos abordados são mais gerais e
independentes de linguagem de programação.
http://tech.groups.yahoo.com/group/software-developers/
Assinatura:
http://tech.groups.yahoo.com/group/software-developers/join
software-developers-subscribe@yahoogroups.com
________________________________________________________________________
Delphi BUGS?
Chatch & Log every BUG showing Unit, Class, Method, Line #.
http://www.eurekalog.com/bannerclick.php?id=15
________________________________________________________________________
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.lmdinnovative.com/products/vcl/lmdstoragepack/
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://cc.codegear.com/Item/19663
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://articles.techrepublic.com.com/5100-10878_11-1044778.html
* 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://articles.techrepublic.com.com/5100-10878_11-5034716.html
* 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/?r=latiumsoftwarecomenpascal
Encontre o Pascal Newsletter na seção de Delphi e siga a link "Vote".
________________________________________________________________________
VOCÊ PODE NOS AJUDAR
Nós precisamos de sua ajuda para manter esse boletim ativo e cada vez
maior. Você pode ajudar indicando o boletim a seus amigos e colegas:
http://www.latiumsoftware.com/br/pascal/index.php
Você também pode votar para nós em um ou todos esses rankings para dar
maior visibilidade a nosso site e assim aumentar o número de assinantes
do boletim:
http://www.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
São alguns segundos para você que REALMENTE significam muito para nós.
Não esqueça que também precisamos de artigos para os boletins e que
existe um prêmio para um dos autores em cada número (em inglês).
Todos os artigos serão considerados mas nós estamos particularmente
interessados em artigos sobre Kylix já que existe pouco material
disponível online.
* Envie seu artigo em inglês para
pascal-newsletter-owner@yahoogroups.com
* Envie seu artigo em português para
boletim-pascal-owner@yahoogrupos.com.br
________________________________________________________________________
Se você não recebeu o código fonte completo dos exemplos neste número,
você pode obtê-los em http://www.latiumsoftware.com/br/pascal/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.
________________________________________________________________________
|