Boletim Pascal #34 - 20-ABR-2002
ÍNDICE
1. ALGUMAS PALAVRAS DOS EDITORES
2. NOTÍCIAS QUENTES
- Borland TeamSource DSP Disponível
3. APLICATIVOS SEM VCL (I)
4. ASSEMBLER NO DELPHI
5. TTRAYCOMPONENT
6. IMPEÇA O WINDOWS DE EXIBIR MENSAGENS DE ERRO CRÍTICO
7. EXIBINDO O DÍALOGO "ABRIR PASTA" (II)
8. FÓRUMS
9. DELPHI NA REDE
- Componentes, Bibliotecas e Utilidades
. Shareware/Comercial
. Freeware
- Artigos, Dicas e Truques
. Kylix
- Tutoriais
________________________________________________________________________
1. ALGUMAS PALAVRAS DOS EDITORES
Editorial da Versão em Português
================================
Olá Pessoal,
Gostaria de tomar um pouco desse espaço para me apresentar. Me chamo
Demian e sou o editor da versão em português do Pascal Newsletter que,
em português, passará a chamar-se Boletim Pascal. Nas edições em língua
portuguesa, estarei apresentando a vocês a tradução dos artigos originais
da versão em inglês. Mas não será apenas isso!!! A versão em português
trará, eventualmente, artigos originalmente escritos em português, além
de outros recursos desenvolvidos no nosso idioma nativo como dicas,
truques e até mesmo programas completos. Por isso, convido a todos os
interessados a entrarem em contato comigo para discutirmos possibilidades.
Aproveito a oportunidade para chamá-los a visitar nossa página na web:
* Boletim Pascal
http://www.latiumsoftware.com/br/pascal/index.php
E lembrem-se: vocês são os maiores responsáveis pelo sucesso de nosso
boletim!
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
=============================
Olá Pessoal,
Gostaria de agradecer aos autores dos artigos incluídos neste número
e gostaria de conceder a licença do Greatis Print Suite, um conjunto
de componentes para impressão e visualização fornecido pela Greatis
Software, como prêmio a José Manuel Rodríguez (JMR). Conheça mais sobre
o produto no site:
http://www.greatis.com/delphicb/printsuite/
No próximo número, um de nossos colaboradores será premiado com uma
licença do SMImport, um conjunto integrado de componentes para conversão
entre os mais populares formatos de dados, fornecido pela Scalabium:
http://www.scalabium.com/smi/index.htm
Graças a Demian Lessa, a edição em Português do bloetim é agora uma
realidade:
* Boletim Pascal
http://www.latiumsoftware.com/br/pascal/index.php
Se você deseja receber o Boletim Pascal, você pode assinar através da
web (é preciso ter um Yahoo! ID - você pode registrar-se para receber
um de forma gratuita se não tiver um) ou, mais facilmente, através de
email:
http://br.groups.yahoo.com/group/boletim-pascal/join
boletim-pascal-subscribe@yahoogrupos.com.br
Agora aos artigos!
Charl Linssen
pascal-newsletter-owner@yahoogroups.com
editor da versão em inglês
__________________
Colaborou neste número: Dave Murray.
________________________________________________________________________
JfControls Library. Multi-language. Multi-appearance. Skins. Privileges.
More than 40 integrated and customizable components. Impressive GUI.
Centralized resources administration. Multiple programming problems
solved. For Delphi 3-6 and C++ Builder 3-5. http://www.jfactivesoft.com/
________________________________________________________________________
2. NOTÍCIAS QUENTES
Borland TeamSource DSP Disponível
=================================
Borland TeamSource DSP is a collaborative development platform for
distributed teams. In plain English, if you need to coordinate the work
of your software development staff thru the Internet, then TeamSource
DSP might be the solution you are looking for. TeamSource DSP is not
software... well it involves software, but basically it's a service
(a web services solution hosted on a Borland's server, to be precise),
and it is charged as a subscription on a per user and per month basis.
To learn more about Borland TeamSource DSP and take the tour, visit
TeamSource DSP's main page at http://www.borland.com/teamsource/
________________________________________________________________________
Greatis Print Suite Pro - An extremely convenient set of VCL components
which provides advanced print and preview features into Delphi and C++
Builder applications. Forget BeginDoc, EndDoc, NewPage and other low-
level printing procedures, just draw your print job and Print Suite will
handle the rest! >>>>> http://www.greatis.com/delphicb/printsuite/ <<<<<
________________________________________________________________________
3. APLICATIVOS SEM VCL (I)
Por José Manuel Rodríguez (JMR)
Copyright: JMR, Madrid 1997/1999/2002
A VCL do Delphi nos permite, em poucos minutos, fazer coisas que, em
outros ambientes levaria horas e horas. Entretanto, isso vem a um preço,
que é a carga que a VCL deixa no produto final.
Cada vez que utilizamos um novo componente, boa parte do código das
unidades da VCL que direta ou indiretamente suportam o componente,
incluindo classes ancestrais e classes associadas, são ligadas em nosso
executável ou DLL (SmartLinking garante que apenas o código referenciado
é ligado e não todo o código das unidades; de qualquer forma, é bastante
código). Claro, isso acontece somente na primeira vez que utilizamos o
novo componente. Os componentes desse tipo ou de tipos relacionados que
forem acrescentados mais tarde produzem incrementos muito menores (boa
parte dos ancestrais comuns já foram incluídos no código), mas no começo,
ou quando incluímos certos componentes, nós acabamos com acréscimos
brutais no tamanho. Por exemplo, a utilização de um simples TButton
produz um súbito incremento da ordem de 150-200K no tamanho do código;
daí em diante, cada controle padrão (paleta Standard) que acrescentamos
gera um acréscimo de apenas 1 ou 2K no tamanho total do código; se, no
exemplo, acrescentarmos um TListView, o tamanho volta a crescer bastante
mas, novamente, a adição de outros controles comuns (common controls)
produzirá incrementos insignificantes no tamanho do PE (portable
executable) final.
A utilização de pacotes (packages) aborda, de certa forma, esse problema
mas, no final das contas, o tamanho do programa mais o suporte de tempo
de execução (os pacotes de runtime) acaba sendo maior que o programa
ligado da forma convencional.
Considerando que, para a maioria dos projetos, recusar-se a utilizar a
versatilidade e as facilidades da VCL pode ser considerado insanidade,
para projetos menores como servidores, utilitários e similares, DLLs e
aplicativos de console, o uso da VCL é totalmente supérfluo. De fato,
muitas vezes não utilizamos a VCL mas, inadvertidamente, acabamos fazendo
referências a ela, causando a inclusão de parte de seu código no produto
final. Normalmente, as referências à VCL não percebidas vêm de algum
aspecto visual do programa, como a interação com o usuário (exibição
ou recuperação de dados do usuário).
Bem, as rotinas da unidade APIDlgs apresentadas aqui pretendem resolver
esse problema, oferecendo caixas de diálogo para entrada e saída que não
utilizam a VCL, mas apenas recursos comuns do Windows e a API do Windows.
A unidade não faz interface com a VCL de modo que você pode usá-la sem
problemas em aplicativos baseados na VCL. Nos exemplos que acompanham a
unidade você verá um programa que utiliza a VCL (withVCL.dpr) ocupando
178K e o mesmo programa utilizando apenas a APIDlgs (withoutVCL.dpr)
ocupando apenas 42K (veja você mesmo)! De qualquer forma, em aplicativos
convencionais, não é viável ou desejável trabalhar sem a VCL; contudo,
você verá que as funções incluídas aqui são mais versáteis que suas
análogas da VCL (MessageDlg/InputDlg) de modo que, mesmo que você use
a VCL, você pode ainda assim querer utilizar a APIDlgs.
Descrição
=========
A unidade contém duas famílias de funções distintas. A primeira conta com
as funções APIMsgShow, APIInput e suas irmãs descafeinadas QuickShow e
QuickInput e utiliza recursos comuns do Windows, criados com o editor
de recursos; a segunda conta com as funções APIMsgBox e CriticalMsg e
utiliza uma função interna do Windows (a mesma usada pela bem conhecida
MessageBox) e, portanto, utilizam recursos contidos nas bibliotecas
Windows.
Logo abaixo, a sintaxe das funções:
function APIShowMsg(hParent: THandle; const cTitle, cText: String;
Buttons: TAPIDlgBtns; DefaultBtn: TAPIDlgBtn;
hIcon: THandle; HelpCtx: Integer): TAPIDlgBtn;
function QuickShow(cTitle, cText: String;
Buttons: TAPIDlgBtns): TAPIDlgBtn;
function APIInput(hParent: THandle; const cTitle, cText: String;
hIcon: THandle; HelpCtx: Integer): String;
function QuickInput(cTitle, cText: String): String;
-------
function APIMsgBox(hParent: THandle; const cTitle, cText: String;
WinFlags: LongInt; HelpCtx: Integer): LongInt;
procedure CriticalMsg(const Title, Text: String);
Devido a limitação de tempo, estou omitindo as explicações na esperança
de que as declarações sejam claras o suficiente e que, através de uma
rápida inspeção do código fonte seja suficiente para a compreensão dos
parâmetros e valores de retorno.
Comentários
===========
a) A unidade foi projetada para 32 bits. Não foi testada para 16 bits
mas, exceto por APIMsgBox, que é baseada na API Win32, não há razão
para que não funcionem também no Delphi 1 e no Windows 3.1x.
b) A unidade foi testada, ainda que não de forma exaustiva. Nenhum bug
foi encontrado até o momento mas eu não posso garantir que a unidade
esteja livre deles.
c) Todo o código é de minha autoria mas eu gostaria de agradecer as dicas,
colaborações e sugestões de alguns colegas programadores, em especial
Nicolás Aragón (nico@nicoaragon.com). A teoria por trás desse trabalho
pode ser encontradas em livros e artigos (PC Magazine USA) sobre o
Windows 32 bits por Charles Petzold e Delphi por Neil J. Rubenking.
d) Essa unidade pode ser utilizada gratuitamente em programas compilados
sem quaisquer restrições mas, se você utilizá-la, eu agradeceria se
você mencionasse o autor nos créditos do programa.
Se for distribuída na forma de código fonte, todo o pacote deve ser
distribuído gratuitamente, com todos os arquivos na íntegra, inclusive
as notas de copyright.
A primeira parte desse artigo inclui a unidade APIDlgs e alguns programas
de exemplo. Na segunda (e última) parte, eu apresentarei a unidade APIApp
que permitirá o desenvolvimento de aplicativos (sem o uso da VCL) de forma
mais flexível.
Quaisquer sugestões, correções ou críticas (construtivas, claro) serão
bem-vindas.
José Manuel Rodríguez <jmr@clubdelphi.com>
________________________________________________________________________
SMImport component suite 1.46 - Components for data loading from Text,
CSV, HTML, XML, MS Excel (without OLE), MS Access (without the BDE),
Lotus 1-2-3, QuattroPro and Paradox/DBF. Available for Delphi 3-6 and
CBuilder 3-6. Price $35. >>> http://www.scalabium.com/smi/index.htm <<<
________________________________________________________________________
4. ASSEMBLER NO DELPHI
Por Max Kleiner <max@kleiner.com>
Nós sempre achamos que o OP (Object Pascal) produzisse código rápido e
eficiente e que, com os ambientes RAD do Delphi e do Kylix, a utilização
de assembler torna-se questionável.
Esse artigo é quase como um resumo do excelente paper "Learning Assembler
with Delphi" de Ian Hodger em:
http://www.delphi3000.com/articles/article_2245.asp
Era desejo de meus alunos fazê-lo mais curto e mencionar algumas coisas
sobre depuração.
Anexado ao boletim, você encontrará um exemplo impressionante de assembler
num Shell DOS que mostra um efeito gráfico de fogo na tela.
Ao longo de nosso trabalho com o OP nós encontramos apenas cinco momentos
em que achamos adequado o uso de código de baixo nível:
1. Percorrer e processar grandes quantidades de dados. Claro, ficam
excluídas dessa situação os casos onde uma linguagem de consulta com
um otimizador pode ser empregada, mas nem sempre numa automação ou
num ambiente de micro-controlador.
2. Por razões científicas, de forma a fornecer simulações de alta
performance ou simplesmente para treinamento com as etapas CALL,
Compiler-Assembler-Linker-Loader (Compilação-Montagem-Ligação-Carga).
3. Para programação de controladores, para desenvolver ou testar
periféricos como dispositivos COM, por exemplo, na detecção de portas
COM livres (detectadas pelo Windows...), e chamar algumas funções não
permitidas pelo Windows, por exemplo, para detectar uma porta COM se o
mouse está conectado. Utiliza uma chamada DPMI no assembler.
4. Rotinas para exibição de alta velocidade; aqui, a preferência é por
rotinas rápidas e fáceis que vêm com o OP, não chamadas estranhas
a partir de cabeçalhos C++, funções externas de biblioteca ou ainda
exigências de hardware confusas do DirectX.
5. Algoritmos rápidos e fortes de criptografia como codificadores, hashes
ou checksums, de forma que o código principal da rotina seja escrito
em assembler altamente otimizado.
Afirmar que a escrita de código de máquina é uma tarefa amigável seria
pouco; quanto à depuração de uma linguagem assembler, digamos que seja
apenas uma forma fácil de lembrar quais operações estão disponíveis no
código de máquina. A tarefa de gerar o código de máquina é do assembler;
assim, o Turbo Assembler da Borland está embutido no Delphi.
Vamos praticar:
Se olharmos para a adição do inteiro 15 ao registrador eax, a instrução
assembler correspondente é
add eax,15 // a := a + 15
De forma análoga, subtrair de eax o valor de ebx
sub eax,ebx // a := a - b
Para armazenar um valor para um outro dia, podemos movê-lo para outro
registrador
mov eax,ecx // a := c
ou ainda melhor, salvar o valor num endereço de memória
mov [1733],eax // armazene o valor de eax no endereço 1733
e, claro, recuperar o valor novamente
mov eax,[1733]
Isso significa que o maior valor que pode ser armazenado num registrador
por exemplo, eax, é 2 elevado à 32 menos 1 ou exatamente 4294967295.
Tenha em mente que os valores que você está movendo; a operação mov
[1733],eax afeta não somente o endereço de memória 1733 mas 1734, 1735 e
1736 também, porque eax tem 32 bits, ou 4 bytes!
O próximo passo é o exemplo:
step := step + 1;
nós escreveríamos algo como:
mov eax, step
add eax, 1
mov step, eax
ou simplesmente:
inc step
Agora estamos prontos para nosso primeiro código assembler, mas esqueçamos
por hora a natureza simples desse exemplo. Considere as seguintes linhas
de código OP:
function BigSum(A, B: integer): integer;
begin
result := A+B;
end;
O OP oferece a construção asm...end como uma forma de introduzir código
assembler no nosso código. Assim, a função acima pode ser escrita como:
function BigSum(A, B: integer): integer;
begin
asm
mov eax,A
add eax,B
mov result,eax
end;
end;
Isso funciona, mas há um porém. Não há ganho em velocidade e nós acabamos
por perder a legibilidade do nosso código. O fato é que todo nosso projeto
de classes é, no final das contas, "quebrado" por um assembler.
Você também pode escrever rotinas inteiramente através de assembler inline,
sem incluir um bloco begin...end, como mostrado no exemplo abaixo:
function LongMul(X, Y: Integer): Longint;
asm
mov eax, X
imul Y
end;
O compilador realiza várias otimizações nessas rotinas de forma que
nenhum código é gerado para copiar parâmetros em variáveis locais. Isso
afeta todos os parâmetros string passados por valor e outros parâmetros
cujo tamanho não seja 1, 2 ou 4 bytes. Dentro da rotina, eles devem ser
tratados como se fossem parâmetros passados por referência (var).
Se formos produzir código realmente útil, em algum ponto teremos que
implementar rotinas mais complexas como, por exemplo, para exibir uma
saída baseada nos valores de duas variáveis. Imagine um mapa em três
dimensões onde as coordenadas [X,Y] estão associadas a uma altura H.
Quanto marcamos o ponto [X,Y] na tela, precisamos atribuir-lhe uma
impressão de profundidade. Isso pode ser feito através de cores de
diferentes intensidades, azul para posições abaixo do nível do mar e
verde para posições acima. O que se precisa é de uma função que converta
uma altura H na profundidade de cor para um nível de mar arbitrário.
Depurando Código
----------------
Para finalizar este artigo, vamos falar um pouco sobre depuração. É muito
fácil configurar watches, quebras (breaks), e percorrer um programa OP
linha a linha. Isso é igualmente verdadeiro quando utilizamos assembler.
Tudo que precisamos é acrescentar os registros gerais de 32 bits eax, ebx,
ecx e edx à lista de watch e ver o efeito de cada linha. Numa janela do
DOS, você pode digitar "debug" e então "u" para desmontar. O assembler
do permite que você escreva código assembler Intel dentro de programas
OP. Ele implementa uma grande subconjunto da sintaxe suportada pelo Turbo
Assembler e pelo Microsoft Macro Assembler, incluindo todos os opcodes
8086/8087 e 80386/80387 e todos (exceto alguns) dos operadores de
expressão do Turbo Assembler.
Funções assembler retornam seus valores da seguinte forma:
- Valores ordinais são retornados em AL (valores de 8-bits)
- AX (valores de 16-bits) ou EAX (valores de 32-bits)
- Valores reais são retornados em ST(0), na pilha de registros do
coprocessador
- Ponteiros, incluindo strings longas, são retornados em EAX
- Strings curtas e todos os tipos variantes são retornados na variável
temporária temp. para a qual @result aponta
Espero que você sinta um pouco mais a velocidade do Delphi e meus
agradecimentos a Ian por seus fundamentos.
________________________________________________________________________
Join our Delphi forum for intermediate-level Delphi programmers at
Yahoo! Groups >>>>> http://groups.yahoo.com/group/delphi-en <<<<<
________________________________________________________________________
5. TTRAYCOMPONENT
Stewart Moss <stewartm@idcorpholdings.com> apresenta suas modificações
do TTrayComponent para fazer o código "Exibir na Barra de Tarefas"
funcionar no Windows 2000/NT. O TTrayComponent foi originalmente escrito
por Alexander Rodigin, baseado no componente Stealth, por Janus N.
Tøndering e o TTrayIcon, por Pete Ness. O componente está no arquivo
TrayComp.pas.
________________________________________________________________________
6. IMPEÇA O WINDOWS DE EXIBIR MENSAGENS DE ERRO CRÍTICO
Por Zarko Gajic http://delphi.about.com
Quando realizamos certas funções, é necessário que nossos programas
assumam total controle sobre as mensagens de erro. Por exemplo, se o
nosso programa deseja verificar "silenciosamente" se o floppy drive
tem um disco, você pode não querer que o Windows exiba uma mensagem
de erro crítico se o drive estiver vazio.
Você pode controlar quais as mensagens o Windows exibe utilizando a
chamada de API "SetErrorMode()" da seguinte forma:
var
wOldErrorMode: Word;
begin
// informe ao Windows para ignorar erros
// críticos e salvar o modo de erro atual
wOldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
// código que pode gerar o erro vai aqui...
finally
// voltar ao modo de erro anterior
SetErrorMode(wOldErrorMode);
end;
end;
________________________________________________________________________
7. EXIBINDO O DÍALOGO "ABRIR PASTA" (II)
Por Ernesto De Spirito <edspirito @ latiumsoftware.com>
No último número, eu publiquei código para exibir o diálogo padrão
de "Abrir Pasta" e, desde então, tive bastante retorno. Por isso,
resolvi escrever essa segunda parte, abordando alguns pontos levantados
pelos leitores.
SelectDirectory
===============
Várias pessoas me lembraram que a função SelectDirectory que vem em
FileCtrl faz isso. Bem, isso não é exatamente verdade...
Uma das duas versões sobrecarregadas de SelectDirectory permite que
você defina a raiz, mas não o diretório selecionado:
var
Directory: string;
begin
Directory := 'C:\Delphi\';
if SelectDirectory('Select folder', '', Directory) then
ShowMessage(Directory);
end;
A outra versão de SelectDirectory permite que você selecione o diretório,
mas não a pasta base (raiz), apesar de permitir algumas configurações
interessantes (permitir a criação de pastas, permitir que o usuário digite
o nome da pasta ou ainda, oferecer o id de contexto para o help), mas
essa versão da função não utiliza o diálogo padrão do Windows de "Abrir
Pasta":
var
Directory: string;
begin
Directory := 'C:\Delphi\';
if SelectDirectory(Directory, [], 0) then
ShowMessage(Directory);
end;
Liberando PIDLs
===============
No código, utilizao o GlobalFreePtr para liberar a memória alocada para a
PIDL. É uma forma rápida e suja de fazer isso, mas não é segura. PIDLs
devem ser liberados através de chamadas a IMalloc.Free. Uma forma fácil
de substituir GlobalFreePtr pode ser utilizando a função a seguir:
uses shlobj, ActiveX;
procedure IMallocFree(Ptr: Pointer);
var
pMalloc: IMalloc;
begin
if Succeeded(SHGetMalloc(pMalloc)) then
pMalloc.Free(Ptr);
end;
Pasta base como string
======================
Alguns leitores solicitaram que, ao invés da CSIDL de uma pasta especial,
o parâmetro da pasta base pudesse ser qualquer diretório passado como uma
string de forma que, eu fiz algumas mudanças no código para ter os valroes
de TBrowseInfo.pidlRoot baseados nesse parâmetro (agora chamado de
RootFolder, uma WideString):
:
function BrowseForFolder(Title: string; RootFolder: WideString = '';
InitialFolder: string = ''): string;
var
:
IDesktopFolder: IShellFolder;
Eaten, Attributes: LongWord;
begin
with BrowseInfo do begin
:
pidlRoot := nil;
if RootFolder <> '' then begin
SHGetDesktopFolder(IDesktopFolder);
IDesktopFolder.ParseDisplayName(Application.Handle, nil,
PWideChar(RootFolder), Eaten, pidlRoot, Attributes);
end;
:
end;
:
end;
________________________________________________________________________
8. FÓRUMS
Delphi (em Português)
=====================
http://br.groups.yahoo.com/group/delphi-br/
Se você quer juntar-se ao grupo, a melhor forma é assinar a partir da
web, uma vez que pode acessar as funcionalidades especiais disponíveis
no site web (um ID Yahoo! é necessário; você pode obter um gratuitamente
registrando-se como um usuário Yahoo!) mas, se você não quer registrar-se
ou se não possui acesso Internet completo, você também pode assinar por
email:
http://br.groups.yahoo.com/group/delphi-br/join
delphi-br-subscribe@yahoogrupos.com.br
Delphi (em Inglês)
==================
Se você sabe bastante Delphi mas está longe de ser um guru, esse fórum
é para você. Esse é o único fórum para programadores Delphi em nível
intermediário na Web (hackers Delphi também são bem-vindos :-)). O fórum
conta atualmente com mais de 610 membros e, em fevereiro último, teve um
tráfego razoável, com 250 mensagens:
http://groups.yahoo.com/group/delphi-en/
Assinatura:
http://groups.yahoo.com/group/delphi-en/join
delphi-en-subscribe@yahoogroups.com
________________________________________________________________________
9. DELPHI NA REDE
Por Dave Murray
Componentes, Bibliotecas e Utilitários
======================================
Shareware/Comercial
--------------------
* Database Pro v1.14 - by IMG Software
Database Pro includes eleven components and give the most simple and
fast way to filter or find values in the database. You will get:
1) The simplest way to assign conditions of filtering / data retrieval
2) Support BDE, MIDAS, ADO, InterBase, KADao and any alternative
Database Pro is currently available in 18 languages.
http://www.imgsoft.com
* RichView Package - by TRICHVIEW.COM. Shareware ($139)
RichView is a suite of native Delphi/C Builder components for editing
formatted documents with images, tables and hypertext links.
Customizable attributes of text and paragraphs, Unicode, bi-directed
text, HTML export, RTF, printing, data-aware versions and more...
http://www.trichview.com/
* SMImport Suite v1.46 - by Scalabium, Mike Shkolnik
SMImport suite is a components for data loading from Text, CSV, HTML,
XML, MS Excel (without OLE), MS Access, Lotus 1-2-3, QuattroPro and
Paradox/DBF. Available for Delphi 3-6 and CBuilder 3-6, price: $35.
http://www.scalabium.com (mshkolnik@scalabium.com)
Freeware
--------
* dbExpress InterBase 6.5 driver for Delphi 6 available - by J Kaster
http://community.borland.com/article/0,1410,28508,00.html
Artigos, Dicas e Truques
========================
* Bring RAD to your Web app development with WebSnap - by GetPublished
WebSnap enables Delphi to build the scriptable business objects,
database driven web pages, and back-end servers that are integral to
a successful, dynamic web site.
http://community.borland.com/article/0,1410,28567,00.html
* Simple scripting with NetCLX extension components - by John Kaster
C++ Builder 6, Delphi 6 and Kylix all have new RTTI functions that
make simple scripting much easier to implement. John K shares some
producer components that show how.
http://community.borland.com/article/0,1410,28551,00.html
* From XML to Object: Part II - by Keith Wood
Wraps up this series on the XML Data Binding Wizard with sample
applications that demonstrate how to read and display XML documents
and generate new ones.
www.delphimag.com/features/2002/04/di200204kw_f/di200204kw_f.asp
* A Smart Combo Box, etc - by Bruno Sonnino
How to create a combo box that remembers the user's selection or
entry, and offers it as the default the next time around and tips for
RadioGroups and What's This? help.
www.delphimag.com/features/2002/04/di200204bs_f/di200204bs_f.asp
* Taming the Beast from Redmond - by Dave Ball
A step-by-step explanation of how to deploy ISAPI DLLs within an MTS
or COM+ memory-protected development environment, by configuring IIS
settings within the MMC.
www.delphimag.com/features/2002/04/di200204db_f/di200204db_f.asp
* Take Action - by Bill Todd
If you want your menus and toolbars to have the look and feel of
Office 2000, the ActionManager and ActionBars in Delphi 6 may be just
the ticket.
www.delphimag.com/features/2002/04/di200204bt_f/di200204bt_f.asp
* How to get an MP3's ID3-Tag?
http://www.swissdelphicenter.ch/en/showcode.php?id=121
* How to load Rft Text from a resource file into a TRichEdit?
http://www.swissdelphicenter.ch/en/showcode.php?id=1049
* How to refresh the icon cache?
http://www.swissdelphicenter.ch/en/showcode.php?id=1054
* How to enable the Return key in a TWebbrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1055
* How to open local files in a TWebbrowser and start links directly?
http://www.swissdelphicenter.ch/en/showcode.php?id=1057
* How to program a peak level meter? - by Steve Schafer
http://www.swissdelphicenter.ch/torry/showcode.php?id=1086
* How to show the source code of a webpage in a Memo? - by Screaminator
http://www.swissdelphicenter.ch/torry/showcode.php?id=1085
* How to perform a binary seach on a TListview? - by P Below
http://www.swissdelphicenter.ch/torry/showcode.php?id=1078
* Add current page of a TWebbrowser to your favorites - by Screaminator
http://www.swissdelphicenter.ch/torry/showcode.php?id=1094
* How to connect to an ftp server + download a file? - by Thomas Stutz
http://www.swissdelphicenter.ch/torry/showcode.php?id=1095
* How to check if a given folder is empty - by Christian Cristofori
http://www.delphi3000.com/articles/article_3095.asp
* Component for saving User Settings (using Tools API) - D Wischnewski
Writing a Component, a Component Editor and a Property Editors.
http://www.delphi3000.com/articles/article_3096.asp
* A Simple Notepad with Delphi 6 - by S S B Magesh Puvananthiran
http://www.delphi3000.com/articles/article_3098.asp
* Implementation of the State Design Pattern - by Jochen Fromm
http://www.delphi3000.com/articles/article_3099.asp
* Find full path of registered Applications - by Andreas Schmidt
http://www.delphi3000.com/articles/article_3101.asp
* Exporting Syntax Highlighted text to HTML - by Danilo Vieira
http://www.delphi3000.com/articles/article_3103.asp
* Converting HTML colour names and codes to TColor - by D Wischnewski
http://www.delphi3000.com/articles/article_3104.asp
* Writing all controls of given component to TXMLDocument - by N Ozniev
http://www.delphi3000.com/articles/article_3106.asp
* Sending email in console mode - by Arman Rad
http://www.delphi3000.com/articles/article_3107.asp
* Creating High Performance Middleware Apps with Indy - by Romeo Lefter
Indy Step by Step part 4.
http://www.delphi3000.com/articles/article_3108.asp
* Move or resize a TControl object graphically - by Bertrand Goetzmann
Graphically move or resize a TControl object by using another object
that has all the necessary code.
http://www.delphi3000.com/articles/article_3109.asp
* How to get the long path and file name? - by Maarten de Haan
How to get the long path and file name from a DOS name.
http://www.delphi3000.com/articles/article_3110.asp
* Viewing Targa Bitmap File Format in Delphi (256-colors) - by h4ry p
http://www.delphi3000.com/articles/article_3113.asp
* Easiest way to draw a transparent image - by h4ry p
http://www.delphi3000.com/articles/article_3115.asp
* Un-hiding Properties - by Romeo Lefter
Unhiding some usefull properties for VCL controls.
http://www.delphi3000.com/articles/article_3116.asp
* PAS 2 HTML converter - by Eber Irigoyen
Sourcecode to HTML converter for web pages with highlighted syntax.
http://www.delphi3000.com/articles/article_3117.asp
* Grab the PC Serial Number & BIOS info using WMI calls - by Doug Good
Windows Management Instrumentation Calls in Delphi.
http://www.delphi3000.com/articles/article_3118.asp
* Windows detection routines - by Ronald Buster
Here is how to find out the Windows versions for all versions.
http://www.delphi3000.com/articles/article_3119.asp
* Easy logger - by Eber Irigoyen
http://www.delphi3000.com/articles/article_3121.asp
* Placing icons in DBGrid - by Fahad Aljarbou
http://www.delphi3000.com/articles/article_3122.asp
* Extract Icons from .exe, .dll, .lnk - by Prashant Gulati
http://www.delphi3000.com/articles/article_3126.asp
* Syntax Highlighted Source Code Export to HTML or RTF - by Jim McKeeth
Export many different source code files into HTML or FTP with Syntax
Highlighting and end user customization
http://www.delphi3000.com/articles/article_3128.asp
* Web Page to Image File - by Jim McKeeth
How to get the URL from IE, open it with PBear's THTMLViewer and save
it as a image file.
http://www.delphi3000.com/articles/article_3129.asp
* A simple class to implement compound files - by David Bolton
How do I store multiple files within one compound file?
http://www.delphi3000.com/articles/article_3130.asp
* Improving your Object classes reliability - by David Bolton
How to reference count the easy way.
http://www.delphi3000.com/articles/article_3132.asp
* How to send HTML messages with attachments (using Indy) - by N Cross
Using IdMessage to send HTML formatted emails with attachments.
http://www.delphi3000.com/articles/article_3133.asp
* How to parse a wave file? - by Liran Shahar
Parsing a wave file to access each of its chunks.
http://www.delphi3000.com/articles/article_3134.asp
* SignalDisplay component - by Liran Shahar
Ever wanted to display audio from a microphone or see wave file
samples like CoolEdit does?
http://www.delphi3000.com/articles/article_3135.asp
* How to get keys, like up,down,left, right? - by Etienne Nijboer
http://www.delphi3000.com/articles/article_3136.asp
* Determine If a File has One of Several File Extensions - by John Long
http://www.delphi3000.com/articles/article_3137.asp
* Changing IE Proxy Settings - by Shannon Wynter
How do I set proxy settings in IE without having to restart?
http://www.delphi3000.com/articles/article_3138.asp
* How do we implement the Choice Pattern - by Max Kleiner
Working with Interfaces.
http://www.delphi3000.com/articles/article_3141.asp
* How to make a Window with RAW API - by Simone Di Cicco
http://www.delphi3000.com/articles/article_3142.asp
* From XML to Object: Part I - by Keith Wood
The Delphi 6 XML Data Binding Wizard.
www.delphimag.com/features/2002/03/di200203kw_f/di200203kw_f.asp
* Differential Equations - by Alexander Gofen
Implement the Taylor center, a powerful numeric and expression-
processing application with extensive visual features, in Delphi.
www.delphimag.com/features/2002/03/di200203ag_f/di200203ag_f.asp
* Hot Spots: Part II - by Victor Hornback
Build a custom component, showing how to register a custom property
editor, stream non-published data, and more.
www.delphimag.com/features/2002/03/di200203vh_f/di200203vh_f.asp
* Spreadsheet Data via ADO, ODBC, or Automation - by Bill Todd
A detailed explanation and example projects for accessing MS Excel
spreadsheet data via ADO, ODBC, or automation.
www.delphimag.com/features/2002/03/di200203bt_f/di200203bt_f.asp
* Bug in StringReplace (Handling Null characters) - by Stewart Moss
Workaround for a bug in StringReplace function when used on a string
which contains NULL (#0) characters (not null terminated).
http://www.delphi3000.com/articles/article_3090.asp
* Making a "recent files" menu - by Dan Strandberg
How to make a simple "recent files" menu/list in your application.
http://www.delphi3000.com/articles/article_3091.asp
* Yet another "recent file" menu - by Magnus Flysjö
http://www.delphi3000.com/articles/article_3093.asp
* RGB and HSV conversions - by William Egge
Explains HSV and RGB colour values and includes source for converting
between the two.
http://www.delphi3000.com/articles/article_3094.asp
* Quiz: Delphi ADO Programming - by Zarko Gajic
Who Wants to be a Delphi ADO Database Programming Guru - trivia game.
One copy of a great Delphi book will be given away in this
"competition". Closing date is 31st May and a winner will be picked
randomly on 1st June.
http://delphi.about.com/library/weekly/aa030502a.htm
* Spell Checking with MS Word - by Zarko Gajic
Why buy or write spell checking components when you can use MS Word?
Add spell checking + thesaurus capabilities to your Delphi app using
the MS Word Object Library.
http://delphi.about.com/library/weekly/aa032701a.htm
* Creating PDF Documents, the free way - by Romeo Lefter
How to create easy and fast PDF Documents.
http://www.delphi3000.com/articles/article_3076.asp
* Implementation of the Memento Design Pattern - by Jochen Fromm
How do you implement the MEMENTO Design Pattern in Delphi ? A Memento
is an object that stores a snapshot of the internal state of another
object - the memento's originator.
http://www.delphi3000.com/articles/article_3077.asp
* Reducing Source Code Complexity in your application - William Egge
Using a MessageCenter to link your application systems together.
Implementation of an observer pattern except that it uses Delphi's
built in message dispatching and also maintains the relationships.
http://www.delphi3000.com/articles/article_3079.asp
* Creating a simple HTTP Server
How to create a simple HTTP server using TIdHTTPServer from Indy
and the TPageProducer for simple scripting capabilities.
http://www.delphi3000.com/articles/article_3081.asp
* Read/write summary information of an Office document - by B Goetzmann
How read/write summary information of an Office document?
http://www.delphi3000.com/articles/article_3082.asp
* How to create disabled bitmap - by Mike Shkolnik
How can I create a disabled bitmap from original?
http://www.delphi3000.com/articles/article_3085.asp
* Convert Tab to Space - Yilmaz Kaygisiz
How Can i Change TAB Char To Space in my string?
http://www.delphi3000.com/articles/article_3086.asp
* String or Number? Undocumented Effects of Val(...) - by D Wischnewski
Interesting phenomenon where obvious string is incorrectly converted
into a number by Delphi functions Val, IntToStr + InToStrDef.
http://www.delphi3000.com/articles/article_3087.asp
* Lost your MainForm? - by Eber Irigoyen
Has it ever happened to you that the MainForm that you want is not
listed in Delphi's Projects|Options|General?
http://www.delphi3000.com/articles/article_3088.asp
Kylix
-----
* Simple scripting with NetCLX extension components - by John Kaster
C++ Builder 6, Delphi 6 and Kylix all have new RTTI functions that
make simple scripting much easier to implement. John K shares some
producer components that show how.
http://community.borland.com/article/0,1410,28551,00.html
* How to catch kernel-signals in Kylix?
http://www.swissdelphicenter.ch/en/showcode.php?id=1059
* How to use RCDATA resources in Kylix?
http://www.swissdelphicenter.ch/en/showcode.php?id=1060
* How to clone a process in Linux?
http://www.swissdelphicenter.ch/en/showcode.php?id=1061
Tutoriais
=========
* Cup of Coffee for Dolphins Part I - by John Kaster
Java for Delphi programmers. Describes basic Java instructions in
comparison with Delphi.
http://community.borland.com/article/0,1410,28481,00.html
________________________________________________________________________
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/p0034.zip
________________________________________________________________________
Esse boletim é fornecido "COMO ESTÁ" sem garantias de qualquer tipo. Seu
uso implica na aceitação dos termos de licença e isenção de garantia que
podem ser lidos em http://www.latiumsoftware.com/br/pascal/index.php
Os artigos são propriedade e copyright de seus respectivos autores e
foram reproduzidos aqui com sua permissão. Você pode redistribuir esse
boletim desde que na sua íntegra (incluindo notas de propriedade e
copyright), sem alterações e de forma gratuita.
________________________________________________________________________
Página do grupo:.....: http://br.groups.yahoo.com/group/boletim-pascal/
Assinar..............: boletim-pascal-subscribe@yahoogrupos.com.br
Cancelar assinatura..: boletim-pascal-unsubscribe@yahoogrupos.com.br
Assinar/cancelar.....: http://groups.yahoo.com/group/boletim-pascal/join
Problemas com sua assinatura? boletim-pascal-owner@yahoogrupos.com.br
________________________________________________________________________
Boletim Pascal http://www.latiumsoftware.com/br/pascal/index.php
Copyright (c) 2002 por Ernesto De Spirito. Todos os direitos reservados.
________________________________________________________________________
|