Boletim Pascal #48 - 26 DE OUTUBRO DE 2003
Índice
1. Algumas Palavras dos Editores
2. Caixas de Diálogo HTML
Usando a função de API ShowHTMLDialog de MSHTML.dll
3. Substituindo o editor local padrão do TStringGrid
Como alterar o TStringGrid para apresentar uma caixa de
seleção ou botão na célula selecionada
4. Usando os Controles do Shell no Delphi
5. Assembler Inline em Delphi (X) - Reproduzindo sons com o PC speaker
6. Fóruns / Listas
7. Delphi na Rede
- Sites em português
- Componentes, Bibliotecas e Utilidades
· Shareware/Comercial
· Freeware
· Atualizações do Delphi e Produtos Borland
- Artigos, Dicas e Truques
· White Papers / Estudos de Caso
- Tutoriais
- Outros Links
- Notícias
________________________________________________________________________
1. Algumas Palavras dos Editores
Editorial da Versão em Português
--------------------------------
Mais uma edição do Boletim Pascal está pronta! A versão em inglês sofreu
algum atraso. Infelizmente, quando ficou pronta, tives alguns atrasos
até que pudesse realizar a tradução. Espero que o próximo número possa
chegar até vocês com o mínimo de atraso.
Gostaria de reiterar o convite aos interessados em apresentar artigos
para o boletim. Para quem gosta de escrever e tem algo interessante a
compartilhar com a comuniadde, sejam meus convidados e enviem suas
propostas de artigo- vocês podem ser traduzidos e publicados para um
grupo de quase 10000 assinantes do Boletim nos vários idiomas- nada
mal, hein? Isso sem contar que ainda podem ser premiados com um dos
vários softwares distribuídos mensalmente pelo Boletim.
Agora chega de conversa. Divirtam-se com nosso boletim!
Demian Lessa
demian@knowhow-online.com.br
Editor da versão em português
________________________________________________________________________
Junte-se ao maior e mais influente grupo de discussão Delphi em língua
portuguesa. http://groups.yahoo.com/group/delphi-br
________________________________________________________________________
Editorial da Versão em Inglês
-----------------------------
Já faz quase um mês desde o último número mas estou feliz em anunciar
o retorno do Boletim! Agradeço pelas palavras de apreciação e
encorajamento que recebi dos assinantes. É importante saber que o
Boletim não passa despercebido.
Como de costume, gostaria de começar agradecendo aos autores que
contribuíram com os artigos desse número: Wes Turner, Werner Palmer e
Dave Murray. Fico feliz em entregar os prêmios dessa edição para:
* Wes Turner ("Caixas de Diálogo HTML")
· SMImport v1.75 - por Scalabium Software ($30 padrão, $50 com fontes)
Pacote nativo da VCL que permite a importação de dados para um dataset
sem o uso de bibliotecas externas. Suporta importação de dados a
partir do: MS Access (usando DAO/MS Jet), MS Excel (sem OLE/DDE),
Lotus 123, QuattroPro, texto, HTML, XML (incluindo o formato
TClientDataset), Paradox, dBase e qualquer descendente de TDataSet.
Novidades na versão 1.75: construtor visual de expressões; importação
do MS Word; importação direta do dBase, sem BDE; carga de campos BLOB
para XML; estilos estendidos para os diálogos dos assistentes; evento
OnCreateStructure que permite a criação de dataset com colunas
processadas antes da importação propriamente dita; e muito mais.
http://www.scalabium.com/
* Werner Palmer ("Substituindo o editor local padrão do TStringGrid")
. EurekaLog v4.1.1 - por Fabio Dell'Aria (Std $24, Pro $49, Ent $99)
EurekaLog permite que sua aplicação (GUI, Console, Web, etc.) capture
todas as exceções ocorridas, gere um registro detalhado (com
informações de unidade, classe, método e número de linha) da execeção
e o envie por e-mail. Totalmente integrado no IDE, você só precisa
fazer um Rebuild de seu projeto para acrescentar a funcionalidade a
sua aplicação. Não interfere com a performance e aumenta o tamanho do
executável final em apenas 0,5%-4%. Compatível com Delphi 3-7 e todas
as plataformas Windows.
http://www.eurekalog.com/bannerclick.php?id=15
Para o próximo número, temos os seguintes prêmios disponíveis para dois
de nossos colaboradores:
* NTTools 7 For Delphi - por i-tivity (US$49.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
complete está incluído com o produto.
http://www.i-tivity.biz/nttools.htm
* LMD SearchPack 2.0 - por LMD Innovative (EUR 39)
LMD SearchPack inclui 3 controles que permitem a integração de
capacidades avançadas de pesquisas sobre texto nos seus projetos, com
suporte aos operadores AND, OR, NEAR e NOT. Código fonte completo e
vários projetos de exemplo estão incluídos.
http://www.lmdinnovative.com/products/vcl/lmdsearchpack/
A unidade HighResTimer.pas publicada no último número como parte do
artigo "Temporização de Alta Precisão"- porMichael Darling- foi ajustada
de modo que agora funciona nos Delphi 6 e 7 (e possivelmente Delphi 8).
Agradeço ao Francisco Arena por nos informar sobre o problema da
compilação condicional. A versão atualizada pode ser baixada a partir do
link abaixo:
http://www.latiumsoftware.com/en/file.php?id=p47
A propósito, houve uma atualização do artigo "Codificação e
Decodificação Base64 (MIME)"- por Daniel Wischnewski- publicado no
Boletim Pascal #40. Agradeço ao autor pela revisão. A versão atualizada
pode ser baixada a partir do link abaixo:
http://www.latiumsoftware.com/en/file.php?id=p40
Gostaria de parabenizar a EC Software por seu produto, Help & Manual (um
utilitário de autoria de ajuda), que foi escolhido como Produto do Ano
na Delphi Informant Magazine Readers Choice Awards 2003, além de ter
recebido estrondosos 51% dos votos na categoria Help-authoring Package!
http://www.delphizine.com/opinion/2003/09/di200309jc_o/di200309jc_o.asp
Usuários do Keynote podem encontrar os 6 últimos números do Boletim num
arquivo Keynote compilado por Jayan Chandrasekhar:
http://www.tranglos.com/free/files/kn_latium_delphi_newsletter.zip
Sobre o Keynote (freeware): http://www.tranglos.com/free/keynote.html
Bem, é isso por hora. Espero que gostem dessa edição.
Cordialmente,
Ernesto De Spirito
pascal-newsletter-owner@yahoogroups.com
__________________
Colaboraram nesse número: Dave Murray
________________________________________________________________________
Help & Manual 3, by EC Software - Shareware ($ 279) - Help & Manual is a
WYSIWYG help authoring tool that will aid you in creating standard
WinHelp files (.HLP), Adobe PDF files, HTML pages and the new HTML HELP
(.CHM) files introduced in Windows 98, as well as other file formats and
printed documentation, everything from a single source. This is a must-
have for any software developer. http://www.helpandmanual.com/hmpage.htm
________________________________________________________________________
2. Caixas de Diálogo HTML
Usando a função de API ShowHTMLDialog de MSHTML.dll
Por Wes Turner <splitdfile @ yahoo.com>
Tradução: Demian Lessa
Onde está a função ShowHTMLDialog? Num arquivo .pas?
====================================================
Não. A função ShowHTMLDialog() está na biblioteca MSHTML.dll e você
precisará usar
hLib := LoadLibrary('MSHTML.DLL');
para acessar a DLL e então usar
ShowHTMLDialog := GetProcAddress(hLib, 'ShowHTMLDialog');
para obter o enderço para a função.
Você pode usar essa função somente se o MS Internet Explorer versão 4
ou superior estiver instalado.
Qual a aparência de uma Caixa de Diálogo HTML?
==============================================
Quando ShowHTMLDialog é usado, o MSIE exibe uma janela do navegador
com apenas uma barra de títulos no estilo de um diálogo (nada de menu,
barras de ferramenta ou status). Essa janela de navegador lerá o HTML
de um arquivo e exibi-lo como uma janela do navegador. Se você precisa
de entradas do usuário (botões, caixas de edição, botões de rádio), você
deverá usar JScript ou VBScript como a linguagem para as funções lerem
e/ou alterarem essas entradas.
Qual o código necessário para usar um diálogo HTML?
===================================================
Uma vez que o diálogo HTML é uma janela de navegador do MSIE, COM é
usado para a comunicação entre seu programa e o MSIE, usando variantes
e as interfaces IMoniker e IHTMLDialog. A função ShowHTMLDialog irá
implementar essas interfaces para você.
A função ShowHTMLDialog está definida abaixo:
function ShowHTMLDialog(
hwndParent: Cardinal; // handle do parente
UrlMnk: IMoniker; // IMoniker que possui os fontes em HTML
PvarArgIn: PVariantArg; // endereço do Variant que possui o PWChar
// enviado ao diálogo
PWCHOptions: PWChar; // ponteiro para um WideChar com opções
// do diálogo
PvarArgOut: PVariantArg // endereço do Variant que recebe os dados
// de IHTMLDialog::returnValue
): HRESULT; // o resultado da função é um OLE HRESULT (Integer)
Parâmetros
hwndParent - Handle para a janela parente da caixa de diálogo, que
pode ser zero.
UrlMnk - Uma interface IMoniker contendo a URL a partir da qual o
arquivo HTML para a caixa de diálogo é carregada- o arquivo pode
estar nos recursos da aplicação.
PvarArgIn - Ponteiro para um registro VariantArg que contém os dados
enviados à caixa de diálogo. Os dados passados nesse VariantArg são
colocados na propriedade IHTMLDialog::dialogArguments da janela da
caixa de diálogo. Normalmente, esse valor recebe VT_BSTR, com um
PWChar para o texto que o diálogo exibirá. Esse parâmetro pode ser
um VariantArg vazio (VT_EMPTY).
PWCHOptions - Opções de janela para a caixa de diálogo. Esse parâmetro
pode ser NIL ou o endereço de um PWChar que contém uma combinação de
valores separados por ponto-e-vírgula (;).
POptions := 'dialogHeight:13;dialogWidth:21;resizable:no;help:no;'
+ 'center:yes'
PvarArgOut - Ponteiro para um registro VariantArg que possui os dados
enviados da caixa de diálogo quando ela é fechada. Esse registro
recebe os dados da propriedade IHTMLDialog::returnValue da janela da
caixa de diálogo. Esse parâmetro pode ser um VariantArg vazio
(VT_EMPTY).
Result Value - Retorna S_OK se bem sucedida ou um valor de erro.
O segundo parâmetro em ShowHTMLDialog é um tipo IMoniker. Para colocar
dados num IMoniker, você usa a função CreateURLMoniker em UrlMon.pas,
definida abaixo:
function CreateURLMoniker(
MkCtx: IMoniker; // moniker para usar como contexto básico
// - pode ser NIL
szURL: PWChar; // contém a URL a ser apresentada
out mk: IMoniker // moniker com a nova URL criada a partir de MkCtx
// e szURL
): HResult; // o resultado da função é um OLE HRESULT (Integer)
Essa URL (szURL) precisa ser prefixada com um "file://" para identificar
a localização do arquivo ou com um "res://" para identificar um recurso
da aplicação. No caso de recurso, a URL deve ser seguida do caminho,
nome de arquivo e um "/#" precedendo o número de recurso. Vejam os
exemplos abaixo para arquivo
UrlStr := 'file://C:\Program Files\HtmlDlg1.htm';
ou
UrlStr := 'file://' + ExtractFilePath(ParamStr(0)) + 'HtmlDlg1.htm';
e para recurso:
UrlStr := 'res://MyProgram.exe/#101';
ou
UrlStr := 'res://' + ExtractFileName(ParamStr(0)) + '/#101';
====> o #101 está definido no fonte do recurso, o arquivo .rc
Os terceiro e quinto parâmetros em ShowHTMLDialog são do tipo
PVariantArg, ou seja, um variante que o Delphi não decodifica
automaticamente para você de modo que você precisa ler ou definir o tipo
de dado do variante, .vt (VarArgs.vt) e então referenciar o "tipo" de
dado ao utilizar os dados do variante.
Exemplo de click de botão para exibir a caixa de diálogo HTML
=============================================================
Aqui está um click de botão que irá exibir uma caixa de diálogo HTML. Eu
não verifico a versão do Internet Explorer, já que esse exemplo não usa
DHTML ou objetos COM que estão disponíveis apenas em versões mais
avançadas do IE (5, 6, 7 , 8). O exemplo usa um arquivo HTML no disco
(HtmlDlg1.htm) no caminho da aplicação. Um texto (VarArgs.bstrVal) é
enviado ao diáglogo com o título do diálogo, um texto de informação e
itens de texto para preencher uma caixa de seleção. O código para a
página HtmlDlg1.htm está logo abaixo do código do click do botão.
uses ActiveX, ComObj, UrlMon;
procedure TForm1.button_FileHtmlDlgClick(Sender: TObject);
type
TShowHTMLDialog = function(hwndParent: Cardinal;
UrlMnk: IMoniker; PvarArgIn: PVariantArg;
PWCHOptions: PWChar; PvarArgOut: PVariantArg): HRESULT; stdcall;
var
hLib2: Integer;
ShowHTMLDialog: TShowHTMLDialog;
URLMoniker: IMoniker;
VarArgs, VarReturn: TVariantArg;
ArugStr, UrlStr, Return: String;
POptions: PWChar;
begin
Return := 'ERRO, a versão do IE é anterior à versão 4 ou não '
+ 'suporta diálogos HTML';
hLib2 := LoadLibrary('MSHTML.DLL');
if hLib2 <> 0 then
try
ShowHTMLDialog := GetProcAddress(hLib2, 'ShowHTMLDialog');
if Assigned(ShowHTMLDialog) then
begin
// PvarArgIn é usado para passar dados ao diálogo HTML.
// VarArgs será usado como um PWChar, com o caractere ^
// sendo usado como delimitador para as sete strings
// enviadas ao diálogo
ArugStr := 'HTML Dialog Top Title^This is Information text '
+ 'passed to the Dialog<br>Type your Name Below^'
+ 'Small^Medium^Large^My Size^One size fits all';
// A primeira string é o título do diálogo; a string seguinte é
// o texto (e o HTML) que será escrito no HTML usando o JScript
// document.write(ArgArray[1]); note que o uso de tags HTML
// nesse texto permite a personalização do diálogo pela
// aplicação; as strings restantes são usadas na caixa de
// seleção
VarArgs.vt := VT_BSTR;
VarArgs.bstrVal := StringToOleStr(ArugStr);
// UrlStr é precedida de file:// para indicar um arquivo em
// disco e res:// para indicar um recurso do aplicativo
UrlStr := 'file://'+ExtractFilePath(ParamStr(0))+'HtmlDlg1.htm';
// URLMoniker é definido com a URL do fonte do arquivo htm usado
// no diálogo- pode ser um arquivo em disco, um recurso do
// programa ou um endereço da Internet; se o html não for
// encontrado, uma caixa de diálogo em branco é exibida
OLECheck(CreateURLMoniker(nil, StringToOleStr(UrlStr),
URLMoniker));
POptions := 'dialogHeight:17;dialogWidth:23;resizable:no;'
+ 'help:no;center:yes';
// POptions pode ser omitido (definido como nil), mas permite
// que se definam propriedades do diálogo como largura e altura
VariantInit(OleVariant(VarReturn));
// VariantInit define VarReturn.vt como VT_EMPTY
if ShowHTMLDialog(Handle, URLMoniker, @VarArgs, POptions,
@VarReturn) = S_OK then
begin
// O JScript window.returnValue vai definir automaticamente o
// tipo de dado em VarReturn.vt para o tipo atribuído; apenas
// dois tipos foram usados para window.returnValue, um texto
// JScript (VT_BSTR- OLE wide string) e um inteiro (VT_I4), de
// modo que qualquer outro tipo é um indicativo de erro
if VarReturn.vt = VT_BSTR then
begin
Return := VarReturn.bstrVal;
// Uso um ^ para delimitar VarReturn.bstrVal, mas o
// primeiro caractere é o número da caixa de rádio, que é
// abaixo de 9, então não delimito isso já que sempre será
// um único caractere
Return := 'OK was Clicked'#10'Radio was '+Return[1]+#10
+ 'Combo1 was '+Copy(Return,2,Pos('^',Return)-2)
+ #10'Edit Text was '
+ Copy(Return,Pos('^',Return)+1, 512);
end else
if VarReturn.vt = VT_I4 then
Return := 'OK NÃO foi clicado'#10'VarReturn é '
+ IntToStr(VarReturn.lVal)
else
Return := 'Tipo do Variant não é inteiro ou string OLE, '
+ 'ERRO';
end else
Return := 'ShowHTMLDialog FALHOU';
end;
finally
FreeLibrary(hLib2);
end;
ShowMessage(Return);
end;
Código HTML para o diálogo acima
================================
Abaixo apresento o código HTML para a página "HtmlDlg1.htm", a ser
exibida na caixa de diálogo HTML criada com o código Delphi acima.
Para obter a funcionalidade da caixa de diálogo (pressionamento de
botões, entrada de texto, caixas de seleção) você precisará utilizar
uma linguagem script. Se você não conhece HTML ou qualquer linguagem
de script HTML (JScript, JavaScript, VBscript) então caixas de diálogo
HTML não são para você.
window.dialogArguments permite acessar os dados passados ao diálogo.
Você normalmente passa um Wide String ou Integer no parâmetro VarArgs
para a caixa de diálogo. Se você precisa de mais de um dado no seu
variante VarArgs, você pode usar uma string delimitada e o método
Split:
ArgArray = window.dialogArguments.split("^");
Split usa o parâmetro passado como caractere delimitador e divide a
string em um vetor. O único retorno possível com esse tipo de uso de
caixas de diálogo HTML é o variante VarReturn. Se você precisa retornar
mais de um item você pode, uma vez mais, usar uma string delimitada,
como demonstrado abaixo.
<html id=dlg1 style="width: 25.9em; height: 22em">
<!-- Se você NÃO USA PWCHOptions em ShowHTMLDialog, você pode definir
as dimensões da janela de diálogo acima -->
<head>
<title>HTML Dialog Test</title>
<script language="JScript">
var RBnum = 0;
var ArgArray = new Array();
// carregando os argumentos do diálogo para um vetor usando o método
// .split e o delimitador
ArgArray = window.dialogArguments.split("^");
// a verificação do ArgArray abaixo não é necessária mas permite que
// se tenha uma caixa padrão com PvarArgIn vazio de ShowHTMLDialog
if (ArgArray.length == 0) {ArgArray[0] = "Dialog Title";}
if (ArgArray.length == 1) {ArgArray[1] = "No <b>Info</b> Text";}
if (ArgArray.length == 2) {ArgArray[2] = "None";}
// o primeiro argumento é o título
document.title = ArgArray[0];
// o retorno padrão
window.returnValue = 0;
function StartUp()
{
// limpar a caixa de seleção
Combo1.options.length = 0;
// incluir as strings de seleção na caixa
var index;
index = 2;
// iniciar com o índice 2 pois as duas primeiras strings são o título
// e as informações
while(index < ArgArray.length)
{
var tempOption = new Option(ArgArray[index]);
Combo1.options[Combo1.options.length] = tempOption;
index++;
}
// definir o item selecionado por padrão
Combo1.options[0].selected = true;
}
function OkClick()
{
// o valor de retorno indica que o botão OK foi pressionado
window.returnValue = RBnum+Combo1.options[Combo1.selectedIndex].text+
"^"+Edit1.value;
// como window.returnValue é um variante, não pode receber texto,
// números ou objetos- o inteiro RBnum é automaticamente convertido
// para texto
// fechando a janela de diálogo
window.close();
}
function CancelClick()
{
// o retorno -1 indica que o botão Cancel foi pressionado
window.returnValue = -1;
window.close();
}
function RadioClick(num)
{
RBnum = num;
// marcar e desmarcar os botões de rádio
RB1.checked = (num == 0);
RB2.checked = (num == 1);
RB3.checked = (num == 2);
}
</script>
</head>
<body onload="StartUp()" BGCOLOR="#A0E2F2" TEXT="Black">
<center>
<font size="5"><b>A HTML Dialog Box</b></font>
<!-- I use Fixed Font sizes because IE may have it's default font
size as large or small, throwing off your sizing, but you could
use style sheet settings to define fonts, colors, borders -->
<font size="3">
<br><script language="JScript">
// a very usefull operation - document.write( )
// the second array string is the INFO text written here
document.write(ArgArray[1])
</script>
<br><input type=text name="Edit1" value="No Name" size="24"
title="Type your Name Here"><p>
<table border="2" cellpadding="8" cellspacing="0">
<tr>
<td><font size="3"><input type=radio name="RB1" checked=1
onClick="RadioClick(0)">Howdy<br>
<input type=radio name="RB2" onClick="RadioClick(1)">Late<br>
<input type=radio name="RB3" onClick="RadioClick(2)">Goomba</font>
</td>
<td><font size="3">Pick your Size - <select
name="Combo1"></select></font>
</td>
</tr>
</table>
<P><input type=button value="OK" id="OkBut" onClick="OkClick()"
title="Click to use the Entries above">
<input type=button value="Cancel" id="CancelBut"
onClick="CancelClick()">
</font>
</center>
</body>
</html>
Existem sete strings no parâmetro VarArgs do ShowHTMLDialog- a primeira
é usada como título do diálogo. A segunda é a "informação" escrita na
página HTML com JScript. Todas as demais strings são adicionadas à caixa
de seleção. Para caixas de diálogo HTML mais avançadas é possível
definir uma interface IDispatch como ligação entre a caixa de diálogo e
sua aplicação, de modo que a caixa de diálogo possa chamar código Delphi
no seu programa através do IDispatch.
Usando um recuros para o fonte HTML
===================================
Você pode usar o mesmo código acima ao usar um recurso HTML no programa,
exceto que o parâmetro UrlStr deve ser alterado
UrlStr := 'res://' + ExtractFileName(ParamStr(0)+'/#101');
OLECheck(CreateURLMoniker(nil, StringToOleStr(UrlStr), URLMoniker));
e o recurso incluído no executável. Será preciso definir o recurso HTML
como número 23 e definir a chamada do recurso como um número, da
seguinte forma em HtmDlg.rc:
#define RT_HTML 23
#define Dlg1 101
Dlg1 RT_HTML "HtmlDlg1.htm"
Será preciso definir RT_HTML como 23 (pode usar qualquer designação que
queira- RT_HTML é o nome utilizado pela Microsoft), e definir números
para os arquivos HTML, como 101.
Se você possui um browser ou outra forma de exibição de páginas web em
seu aplicativo, você pode considerar o uso de diálogos HTML em seu
programa.
__________________
Visit the author's web site if you want to learn how to code programs in
API without the Forms Unit: http://www.angelfire.com/hi5/delphizeus/
You'll find many example programs for basic Windows programming.
________________________________________________________________________
Delphi-PRAXiS is a community for German speaking (and writing)
programmers using Borland Delphi. We are not just (one of) the fastest
growing German Delphi-forums, we also offer some unique services like
our "Delphi-PRAXiS Expert", which is an add-on for your Delphi IDE
allowing accessing to our libraries directly from within your
development environment. We have a special section called our "code
library" where you can find several tips, tricks and snippets ready to
use. Furthermore, our database contains more than 50,000 articles for
searches of any kind.
Based on the common software phpBB we still improve it's usability to
fit your needs in the best way possible.
We want to be a free communication-platform for everyone who needs help
and/or wants to help. Of course, you may post your questions also in
English. ;-)
All this is bundled with a charming, modern and unique design. Register
for free and give us a try at http://www.delphipraxis.net ! Now! ;-)
________________________________________________________________________
3. Substituindo o editor local padrão do TStringGrid
Como alterar o TStringGrid para apresentar uma caixa de
seleção ou botão na célula selecionada
Por Werner Palmer <werner.pamler @ infineon.com>
Tradução: Demian Lessa
TStringGrid é um componente Delphi amplamente utilizado. É possível
entrar com texto diretamente nas células do grid mas, às vezes, é
desejável usar formas alternativas de entrada de dados, como caixas de
seleção ou botões. Ainda que isso seja um comportamento padrão para um
TDBGrid, não está disponível para a versão mais simples, TStringGrid.
Soluções podem ser encontradas na web, mas a funcionalidade básica,
entretanto, encontra-se implementada no ancestral de qualquer grid,
TCustomGrid. Isso é verdade no Delphi 6, mas pode não sê-lo em versões
anteriores.
O editor local (inplace editor) que possui as propriedades mencionadas
pode ser encontrado na unidade Grids com o nome TInplaceEditList. Ele
pode ser acessado pela derivação de um novo componente a partir do
TStringGrid, que será chamado TNewStringGrid aqui. Nesse novo
componente, o método "CreateEditor" é especializado de modo a utilizar
TInplaceEditList como editor local (ao invés do TInplaceEdit padrão). O
novo grid também herda o método "GetEditStyle" que determina quais as
células que utilizarão o novo editor local.
Na implementação do TNewStringGrid, criamos um novo evento,
"OnGetEditStyle", que chama o método GetEditStyle. O manipulador do
evento recebe as coordenadas das células e retorna o estilo do editor
(esSimple, esPickList ou esEllipsis, conforme definido em Grids.pas).
Adicionalmente, para o estilo esPicklist, temos que oferecer um
manipulador de evento para o evento "OnGetPickListItems", de modo a
oferecer a lista de valores (um TStringList) para o novo grid. Para o
estilo de editor esEllipsis, precisamos de um manipulador de evento para
"OnEditButtonClicked", disparado quando o usuário pressiona o botão de
elipsis; esse manipulador pode, por exemplo, abrir um diálogo complexo
solicitando ao usuário informações para o preencimento dos dados da
célula.
Não esqueça de ativar a opção goEditing para o StringGrid; sem ela, você
não poderá editar os dados no grid.
A unidade NewStringGrid e um projeto de exemplo podem ser encontrados no
código anexo.
________________________________________________________________________
Outlook Express Data Backup 2.0 - EXCLUSIVE RIGHTS FOR SALE at $990
OE Data Backup is a backup and synchronization tool for the Outlook
Express mail client. It allows you to backup and restore your messages
(including attachments), address book, mail and news accounts, settings,
message rules, lists of blocked senders, signatures and Internet
favorites. You can backup data on one computer and restore to another.
For more information, visit this page: http://users.volja.net/bzibrat/
________________________________________________________________________
4. Usando os Controles do Shell no Delphi
Por Dave Murray <irongut @ vodafone.net>
Tradução: Demian Lessa
A partir do Delphi 6, a Borland oferece controles do shell, incluindo
TShellTreeView e TShellListView que imitam a funcionalidade do Windows
Explorer mas estão escondidos na página Samples da paleta de
componentes, não possuem documentação alguma, e até mesmo seus fontes
são difíceis de encontrar; estão em Delphi\Demos\ShellControls. Você
está perdoado se pensar que esses controles são uma idéia posterior e
que seu uso não é esperado.
Recentemente, eu quis construir meu próprio cliente FTP porque eu não
gostava de qualquer um dos gratuitos que já havia testado. Eu pensei
'Eu tenho Indy' então, quão difícil pode ser? Verifiquei o exemplo do
TIdFTP, o componente cliente FTP do Indy, e a parte de rede pareceu
fácil o suficiente, então comecei a pensar a respeito da interface. Eu
queria algo simples e optei por uma visão do sistema de arquivos local
acima e uma visão do sistema de arquivos remoto abaixo com uma barra de
ferramentas no meio. Cada visão iria conter um TreeView e um ListView
com alguns botões para navegação simplificada, como o Explorer. Queria
poder arrastar e soltar entre os controles e também com o Explorer.
Nesse ponto, fui procurar componentes para implementar a parte local e
encontrei os controles shell da Borland. Decidi que esse tipo de layout
é algo que poderia ser reutilizado, então comecei a trabalhar num frame
genérico.
Então, como eles funcionam? Alguma funcionalidade é fácil de implementar
mas, de outra forma, esses controles podem ser estranhos e confusos. A
maioria dos métodos que se esperaria encontrar não existem ou retornam
parâmetros que são de valores duvidosos. Frequentemente, são de tipos
incorretos para outras chamadas que se deseja realizar. O que deveria
ter sido um trabalho de poucas horas e fácil programação transformou-se
rapidamente em várias noites de leitura de código, experimentação e
esticar de cabelos. Em algum ponto durante o processo, decidi fazer
desse trabalho um artido de modo que eu pudesse compartilhar minha dor
com vocês. ;)
Vamos começar com a parte fácil. Conectei meu TShellTreeView com um
TShellListView e então iniciei a barra de ferramentas. O primeiro botão
que queria era um que levasse ao diretório imediamtamente superior na
árvore de diretórios; após alguma busca, verifiquei que o método
TShellListView.Back faz exatamente isso. A maioria dos demais botões
trouxe alguma complicação, então voltarei a esses mais tarde. Mas um
deles foi fácil- o botão de visões para o TShellListView. Apenas criei
um menu de popup para o botão que definia o TShellListView.ViewStyles.
Nesse ponto, eu tinha um gerenciador de arquivos simples que oferecia
características básicas de navegação e menus de contexto padrão do
Explorer.
Considerei a possibilidade de acrescentar um TShellComboBox sobre a
lista de arquivos. Queria que ele fosse redimensionado com o frame
assim como os demais controles mas ele não possui a propriedade Align.
Tentei utilizar âncoras mas não consegui o efeito desejado então
decidi abandonar a idéia.
Agora vamos à parte complicada. Os controles do shell não oferecem
métodos que auxiliem na manipulação dos arquivos, então foi preciso
usar a API do Windows. A função SHFileOperation() pode copiar, mover,
excluir e renomear, então escrevi o seguinte wrapper para facilitar
seu uso.
function TconExplorerFrame.FileOperation(const source, dest : string;
op, flags : Integer) : boolean;
// copia, move, exclui e renomeia arquivos e pastas usando a WinAPI
var
Structure : TSHFileOpStruct;
src, dst : string;
OpResult : integer;
begin
// inicializar a estrutura FileOp
FillChar(Structure, SizeOf (Structure), #0);
src := source + #0#0;
dst := dest + #0#0;
Structure.Wnd := 0;
Structure.wFunc := op;
Structure.pFrom := PChar(src);
Structure.pTo := PChar(dst);
Structure.fFlags := flags;
case op of
// definir o título do diálogo de progresso
FO_COPY : Structure.lpszProgressTitle := 'Copying...';
FO_DELETE : Structure.lpszProgressTitle := 'Deleting...';
FO_MOVE : Structure.lpszProgressTitle := 'Moving...';
FO_RENAME : Structure.lpszProgressTitle := 'Renaming...';
end; // case op of..
OpResult := 1;
try
// realizar a operação
OpResult := SHFileOperation(Structure);
finally
// informar sucesso / falha
result := (OpResult = 0);
end; // try..finally..
end; // function TconExplorerFrame.FileOperation
Essa função retorna true se a operação é bem sucedida e exibe um diálogo
de progresso se necessário. Procure por SHFILEOPSTRUCT na ajuda da
WinAPI e veja os possíveis valores de op e flags. Como ainda não sei se
precisarei utilizar esse função fora do frame, deixarei-a por hora como
um método privado- mas isso pode ser mudado no futuro.
Um botão de exclusão agora era simples- tudo a fazer era determinar
que arquivo ou pasta está selecionado e exclui-lo utilizando
FileOperation().
Enquanto fazia o botão Atualizar, decidi escrever uma função genérica
que poderia ser chamada a partir de outros métodos e atualizaria ambos
os controles. TShellTreeView.Refresh toma um nó como parâmetro- mas qual
nó passar? Tentei passar a pasta atual, mas isso nem sempre funcionou
(isso também parece ser um problema com o Explorer). Então tentei passar
o nó raiz e isso funcionou corretamente. TShellListView pisca quando
atualizamos o TShellTreeView ao qual está conectado, então o desconecto
antes. Veja a rotina TconExplorerFrame.Refresh nos fontes.
Na criação de uma nova pasta, precisamos atribuir um nome único. O
procedimento usual é chamá-lo de 'Nova Pasta' e acrescentar um número
ao nome se a pasta com esse nome já existir. Escrevi GetNewFolderName()
para retornar um nome único; precisei da função DirectoryExists() de
SysUtils.pas e de um loop while. Meu botão de Criar Pasta chama essa
função e então usa CreateDir() de SysUtils.pas.
Queria oferecer um botão de propriedades mas os controles do shell
não possuem métodos interessantes para isso. Como ao pressionar
Alt+Enter num TShellListView funciona, mergulhei em ShellCtrls.pas e
verifiquei o fonte. Inicialmente, pareceu simples, tudo que era
preciso era uma chamada a DoContextMenuVerb. Ou não, uma vez que
DoContextMenuVerb não é um método de TShellListView, mas uma rotina
privada em ShellCtrls.pas. Nesse ponto, decidi que o plágio era o melhor
caminho e então copiei esse código na unidade do meu frame.
Clicar duplo em arquivos no TShellListView não funciona (no Win2k, pelo
menos), mas selecionar Open pelo menu de contexto funciona. Ao verificar
o código, o controle possui um método DblClick que chama ShellExecute().
Nesse instante, notei TShellFolder.ExecuteDefault. Já que TShellFolder
pode ser um arquivo ou pasta e podemos obetr o item selecionado como
um TShellFolder chamando TShellListView.SelectedFolder, escrever um
manipulador para o evento OnDblClick foi simples. Isso também garante
que o clicar duplo não apenas tenta abrir o arquivo, mas executa a ação
padrão do seu menu de contexto- que é exatamente o que o Explorer faz.
Veja TconExplorerFrame.shlllstvwFilesDblClick.
Nesse ponto, tinha tudo que queria exceto pelo arrastar e soltar. Eu
jamais havia implementado esse tipo de funcionalidade antes então tive
que ler um pouco antes de começar. O ideal seria alterar o cursor no
pressionamento do Ctrl, como o Explorer faz. Isso implica em utilizar
um TDragControlObject para fornecer uma lista de imagens de arrasto,
então decidi manter as coisas simples por hora e deixar esse efeito
de lado.
Comecei arrastando do TShellListView para o TShellTreeView. Os métodos
e propriedades necessários (com os valores de retorno corretos) não
parecem existir até que você percebe que a propriedade SelectedFolder
pode retornar arquivos assim como pastas. Escrevi um evento OnDragOver
para o TShellTreeView de modo que ele aceitass itens do TShellListView
e então iniciei com seu evento OnDragDrop. Rapidamente descobri que não
poderia acessar o arquivo sendo arrastado nesse evento, então decidi por
armazenar esse valor numa variável global ao frame durante o evento
TShellListView.OnStartDrag e então limpá-la no TShellListView.OnEndDrag.
Também tive problemas com a pasta de destino- TTShellTreeView.GetNodeAt
e TTShellTreeView.DropTarget retornam um TTreeNode mas, para conseguir
o caminho para a operação de arquivo eu precisava de um TShellFolder;
então seleciono o DropTarget para recuperar o SelectedFolder (um
TShellFolder) e então seleciono a pasta anterior uma vez mais. Isso faz
o TShellListView piscar terrivelmente (você pode ver a mudança de
diretórios) então tentei utilizar TShellListView.Items.BeginUpdate e
EndUpdate mas isso também não funcionou, então tive que desconectar o
TShellTreeView, realizar as ações, e então reconectá-lo. Isso é uma
verdadeira gambiarra, eu não gosto, mas funciona. O evento OnDragDrop
não oferece informação acerca do estado do teclado e eu queria
implementar a operação de cópia se o usuário estivesse pressionando
Ctrl ao final do arrasto. Eu usei GetKeyState() da biblioteca Jedi
(JCLSysInfo.pas) para isso.
Tendo colocado o arrasto para funcionar a partir do TShellListView eu
alterei os eventos OnDragOver e OnDragDrop para também aceitarem uma
pasta arrastada do TShellTreeView e acrescentei os eventos OnStartDrag
e OnEndDrag a ele. Esses seis eventos oferecem todas as funcionalidades
necessárias para soltar um arquivo no TShellTreeView a partir do frame.
Para manter simples, eu apenas permito ao usuário arrastar um item de
cada vez.
O Explorer permite que você arraste uma pasta da árvore para a lista de
arquivos e arquivos para pastas dentro da lista. Mas arrastar uma pasta
do TShellTreeView seleciona e exibe o conteúdo da pasta e, em ambos os
casos, TShellListView.DropTarget sempre retorna nil! Por isso, não pude
encontrar uma forma de implementar essas funcionalidades. :(
Tendo feito o possível para oferecer a funcionalidade de arrastar e
soltar no frame, agora precisava fazer que funcionasse também com o
Explorer. Para aceitar um arquivo arrastado do Explorer, é preciso usar
mensagens do Windows. Eu estava incerto a respeito do efeito que isso
teria sobre os eventos de arrastar e soltar já implementados; fiquei
satisfeito ao verificar que não houve interferência. Tive problemas para
chegar às configurações corretas, no entanto. É preciso chamar a função
DragAcceptFiles() com o handle do controle que irá aceitar os arquivos
para permitir que o Windows saiba como enviar a mensagem de soltar
arquivos. Mas TFrame não possui um evento OnCreate e não podemos
usar referências a seus componentes ou a ele próprio na seção de
inicialização. Quis que meu frame fosse totalmente auto-contido, mas
tive que aceitar ter que chamar DragAcceptFiles() no evento OnCreate do
formulário que o contém. Inicialmente, pensei em passar o handle para o
TShellListView de modo que os arquivos pudessem ser soltos apenas nesse
controle, mas para isso necessitaria de uma mensagem WMDROPFILES para
TShellListView então decidi aceitar que os arquivos fossem soltos em
qualquer lugar do frame passando seu handle. Uma vez contornados esses
problemas o resto foi fácil.
A procedure TconExplorerFrame.WMDROPFILES lida com a mensagem de soltar.
ela usa DragQueryFile() da WinAPI para determinar o número de itens
sendo soltos e então a chama de novo para recuperar o caminho completo
de cada item na medida em que faz a iteração pela lista. O Windows nos
oferece de forma automática com um cursor de cópia e, pressionar Ctrl
ou Shift não tem qualquer efeito, então eu copio os itens para a pasta
exibida no TShellListView.
Também quis implementar arrastar e soltar do programa para o Explorer
e entre instâncias do próprio aplicativo, mas não consegui encontrar
artigos ou dicas que explicassem como fazer isso. Esperei que, ao
habilitar o arrasto a partir do Explorer, poderia obter, como efeito
colateral, uma dessas funcionalidades; ou, pelo menos, um indicativo
de como implementá-las, mas não foi esse o caso. Acho que preciso
criar meu próprio descendente de TCustomShellListView habilitado para
arrasto com o shell, mas não estou certo de como começar.
Então esse é o fim de minha exploração dos controles shell da Borland.
Se algum de vocês souber como arrastar do Delphi para outras aplicações
ou podem sugerir melhorias para o meu frame, por favor entrem me
contato. Os fontes para meu frame e o programa de teste estão no arquivo
em anexo - estejam à vontade para utilizar em seus próprios programas.
________________________________________________________________________
Support us! Vote for the Pascal Newsletter in The Programming Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
Vote for the Pascal Newsletter in The Programming Pages!
http://www.programmingpages.com/?r=latiumsoftwarecomenpascal&Language=29
________________________________________________________________________
5. Assembler Inline em Delphi (X) - Reproduzindo sons com o PC speaker
Por Ernesto De Spirito <edspirito @ latiumsoftware.com>
Tradução: Demian Lessa
As instruções assembler IN e OUT permitem ler e escrever em uma porta de
E/S respectivamente.
Para ler de uma porta:
IN acumulador, porta
IN le um byte, word ou doubleword da porta especificada para o registro
acumulador, isto é, AL, AX, ou EAX para byte, word ou doubleword
respectivamente. O número de porta pode ser uma constante do tipo byte
(0..255) um o registro DX (para acesso a todas as portas de E/S).
Para escrever em uma porta:
OUT porta, acumulador
OUT escreve o byte, word ou doubleword no registro acumulador para a
porta especificada. Novamente, o número da porta pode ser uma constate
do tipo byte ou o valor do registro DX.
NOTA: Uma vez que IN e OUT implicam no acesso direto ao hardware, e
sabendo que os Windows NT/2000/XP não permitem que aplicativos
do usuário acessem o hardware diretamente, essas instruções não
funcionarão (irão gerar exceções) nesses sistemas operacionais
(a não ser que estejam rodando em modo protegido no anel 0, ou
modo kernel).
Abaixo, veremos um exemplo do uso de assembler na leitura e escrita
às portas de E/S para programar os chips 8253/8254 Contador/Timer e
o 8255 Programmable Peripheral Interface (PPI) na placa-mãe de modo
a fazer o PC speaker reproduzir um som.
Os passos para tocar um som usando os chips são os seguintes:
1) Prepare os 8253/8254 para receber a freqüência. Isso é feito ao
escrever o valor $B6 no Timer Control Register (porta $43).
2) Escrever a freqüência do som no Frequency Register do 8253/8254
(porta $42). Na verdade, não é a freqüência em Hertz que devemos
escrever no registro, mas o resultado de 1331000 dividido nesta
freqüência. Primeiramente devemos escrever o byte de mais baixa
ordem do resultado para, em seguida, o byte de mais alta ordem.
3) Ligar o PC speaker e fazê-lo utilizar o 8253/8254 Counter/Timer.
Isso é feito ao definir os dois primeiros bits da Porta B do 8255
PPI (porta $61).
4) Desligar o PC speaker quando o som finalizar. Isso é feito ao
zerar o segundo bit da porta B do 8255 PPI (porta $61).
A função assembler inline abaixo implementa os passos listados acima:
procedure SpeakerSound(Frequency: word; Duration: longint);
// Copyright (c) 2003 Ernesto De Spirito
// Visit: http://www.latiumsoftware.com
// Plays a tone thru the PC speaker using the 8253/8254
// Counter/Timer chip and the 8255 Programmable Peripheral
// Interface (PPI) chip on the motherboard.
// NOTE: This code won't work under Windows NT/2000/XP.
asm
push edx // Push Duration on the stack (for Sleep)
mov cx, ax // CX := Frequency;
// Prepare the 8253/8254 to receive the frequency data
mov al, $B6 // Function: Expect frequency data
out $43, al // Write to Timer Control Register
// Compute the frequency data
mov dx, $14 // DX:AX = $144F38
mov ax, $4F38 // = 1331000
div cx // AX := 1331000 / Frequency;
// Send the frequency data to the 8253/8254 Counter/Timer chip
out $42, al // Write low byte to the Frequency Address
mov al, ah // AL := High byte of AX
out $42, al // Write high byte to the Frequency Address
// Tell the 8255 PPI to start the sound
in al, $61 // Read Port B of the 8255 PPI
or al, $03 // Set bits 0 and 1:
// bit 0 --> use the 8253/8254
// bit 1 --> turn speaker on
out $61, al // Write to Port B of the 8255 PPI
// Wait
call Sleep // Sleep(Duration); // requires Windows unit
// Tell the 8255 PPI to stop the sound
in al, $61 // Read Port B of the 8255 PPI
and al, NOT 2 // Clear bit 1 (turn speaker off)
out $61, al // Write to Port B of the 8255 PPI
end;
Exemplo de chamada:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Randomize;
for i := 1 to 3 do
SpeakerSound(Random(900)+100, 200);
end;
NOTA: Usar o PC speaker para gerar som é OBSOLETO. Aplicações devem usar
sons MIDI ou WAVE ao invés.
________________________________________________________________________
Delphi BUGS?
Catch & Log every BUG showing Unit, Class, Method, Line #.
Now with support for command-line compiler and IntraWeb applications.
http://www.eurekalog.com/bannerclick.php?id=15
________________________________________________________________________
6. Fóruns / Listas
Tradução: Demian Lessa
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: Todos os usuários de língua portuguesa são bem-vindos ao grupo
de discussão; se você é um novato ou um guru, essa lista é para você.
Essa é a maior e mais bem conceituada lista de discussão Delphi em
língua portuguesa!
http://br.groups.yahoo.com/group/delphi-br/
Assinatura:
http://br.groups.yahoo.com/group/delphi-br/
delphi-br-subscribe@yahoogroups.com
* Delphi (inglês): Um grupo sobre Delphi aberto a todos os níveis de
usuários.
http://groups.yahoo.com/group/delphi-all/
Assinatura:
http://groups.yahoo.com/group/delphi-all/join
delphi-all-subscribe@yahoogroups.com
* 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
________________________________________________________________________
Merlin's Delphi Forge
Delphi and Kylix news, FAQ, downloads, links, forums and more.
Accepting uploads and submissions.
http://www.delphifaq.net/
________________________________________________________________________
7. Delphi na Rede
Por Dave Murray <irongut @ vodafone.net>
Sites em português
==================
* Comunidade Delphi de Rio Preto
Portal com componentes, novidades, artigos, links e mais.
http://www.delphirp.com.br/
* Planet Delphi
Site brasileiro especializado em componentes para Delphi. Download
grátis.
http://www.fprass.hpg.ig.com.br/
* Delphi Company
Site do Fernando Gonçalves dedicado ao mundo Delphi
http://www.delphicompany.hpg.ig.com.br/
* IntereSite
Tudo sobre Delphi
http://www.ulbrajp.com.br/~tecnobyte/
* Advanced Developers
Delphi, productos, novidades, consultoria...
http://www.adev.com.br
* Fórum Delphi-BR
http://br.groups.yahoo.com/group/delphi-br/
* Fórum Delphi !!
http://www.qualyinf.com.br/forum/delphi/delphi.html
Componentes, Bibliotecas e Utilidades
=====================================
Shareware / Comercial
---------------------
* InterBase 7.1 Trial - by Borland
http://community.borland.com/article/0,1410,30157,00.html
* Trial Version of C#Builder Enterprise Available for Download
http://bdn.borland.com/article/0,1410,30278,00.html
* Personal Edition of C#Builder 1.0 Available for Download.
This edition is limited to free non-commercial development.
http://bdn.borland.com/article/0,1410,30203,00.html
Freeware
--------
* TurboPower OfficePartner v1.64b - by TurboPower (with source)
OfficePartner is the easy way to integrate your project with Microsoft
Office. With OfficePartner you can access COM services in Office with
easy to use VCL components.
http://sourceforge.net/projects/tpofficepartner/
* KeyNote v1.6.1 - by Marek Jedlinsky (MPL 1.1 with source)
A flexible, multi-featured tabbed notebook based on Windows' standard
RichEdit control. It's always accessible with a single keypress, even
when working in another application. The basic idea of KeyNote is that
you can include many separate notes within a single file. Features
include strong data encryption, styles, macros, plugins and templates.
Delphi source code available.
http://www.tranglos.com/free/keynote.html
* DScriptVCL - by DelphiScript (freeware, source code available for $49)
Give your applications Winamp's look & feel with DScriptVCL. Includes
Main Forms, Menus, Panels, Leds, Numeric Displays, Progress Bars,
Buttons, Checkboxes and many more graphical components.
http://www.delphiscript.com/dscriptvcl/
* WinAmpDll - by Ivan Spiridonov (with source)
A DLL Project that shows how to create WinAmp General Purpose Plugins.
http://www.torry.net/vcl/mmedia/winamp/wagppdll.zip
* Keyboard Macro Manager v1.0 - by Daniel Cunningham
Delphi IDE Enhancement for saving / restoring keyboard macros.
http://www.torry.net/vcl/experts/ide/keymac.zip
* TssSimpleIPC v1.0 - by Sunisoft (with source)
TssSimpleIPC is a component for Interprocess Communications.
http://www.torry.net/vcl/system/appscommunications/simpleipc.zip
* QTest v1.9 - by Michael Johnson (with source)
Delphi friendly way to create test cases for test-centric coding, ala
extreme programming. Update includes logging capability, more detail,
and some expansion of the methods of testing.
http://www.sourcecodeonline.com/details/qtest.html
* QSetup Installation Suite 4.0.0.4 - by Pantaray Research
Highly effective and powerful setup program featuring a user-friendly
and intuitive user interface designed to let you create high quality
sophisticated installation delivery with minimum effort and no script
programming. QSetup is FREE for independent software developers.
http://www.pantaray.com/
* Delphi.DX - by Tim Baumgarten (with source)
DirectX header file conversions for DirectX 7, 8 and 9.
http://www.crazyentertainment.net/dx.php?ver=nine
* PBPreview v4.50.00.00 - by BakSoft-Denmark (with source)
OpenDialog with custom Preview of your files.
http://bak-o-soft.dk/Default.asp?Page=PBPreview
* PBPrinter-SetupDialog v6.10.00.00 - by BakSoft-Denmark (with source)
Printer Setup dialog with the ability to get/set printer settings at
designtime & runtime.
http://bak-o-soft.dk/Default.asp?Page=PBPrinterSetupDialog
* TFindFile - by HANAX Software (with source)
Very simple component, can be used to searching for specified files
in specified directory(ies) and all it's subfolders.
http://hanaxsoftware.com/files/hanax_findfile.zip
Atualizações do Delphi e Produtos Borland
-----------------------------------------
* DbExpress Driver for IBM DBM v8 for Delphi 7 Users
This patch for Delphi 7 is available to registered users.
http://community.borland.com/article/0,1410,30320,00.html
* Fixes for Kylix 3 Issues on Newer Distros (updated) - Andrés Colubri
Kylix 3 (particularly C++) on newer Linux distros (eg. RedHat 8+,
Madrake 9+, SuSE 8.2) has a number of bugs: compilation errors with
STL, unresolved references when linking, installer and IDE hangs, etc.
This package contains a collection of fixes to address these issues.
http://codecentral.borland.com/codecentral/ccweb
* First Update Pack for C#Builder Available to Registered Users
http://bdn.borland.com/article/0,1410,30287,00.html
Artigos, Dicas e Truques
========================
* Simple Programming Tip #3 - by Charlie Calvert
Learn how refactoring can help you create robust and easy to maintain
programs.
http://community.borland.com/article/0,1410,30304,00.html
* Interview with Nick Hodges - by Clay Shannon
Nick Hodges, member of TeamB and the Borland Conference Advisory
Board, explains why he prefers WebSnap to 3rd party web app creation
solutions, talks about his Super Bowl bet with the interviewer, his
unusual method of working, etc.
http://community.borland.com/article/0,1410,30040,00.html
* Data Access in ADO.NET - by Cary Jensen
ADO.NET provides the native data access layer for the .NET framework.
This article is the first in a series to look at ADO.NET, and begins a
discussion of the data access mechanism.
http://community.borland.com/article/0,1410,30113,00.html
* Using Visual Form Inheritance with IntraWeb 5.1 in Delphi 7
- by Tjipke A. van der Plaats
This article explains a way to be able to use visual form inheritance
with IntraWeb (5.1). Something that normally is not working.
http://community.borland.com/article/0,1410,30195,00.html
* Interview with Marco Cantu - by Clay Shannon
Author and trainer Marco Cantu tells us about the 15th century house
in which he lives, encourages people to turn off their televisions,
praises Stupid White Men (the book, not obtuse caucasians) and, of
course, talks about programming.
http://community.borland.com/article/0,1410,30052,00.html
* Interview with Ray Konopka - by Clay Shannon
Ray Konopka talks about the mechanics of the Borland Conference
advisory board, his work on Code Site for .NET, the great BorCon pizza
thread time slice demonstration, his High School record in Track and
Field, and Octane.
http://community.borland.com/article/0,1410,30095,00.html
* Interview with Cary Jensen - by Clay Shannon
Trainer/author/BorCon Advisory Board member Cary Jensen talks about
his hair, his books, JBuilder, psychology, .NET data sets and predicts
fun surprises at BorCon this coming November in San Jose.
http://community.borland.com/article/0,1410,30114,00.html
* Data Storage in ADO.NET - by Cary Jensen
This article is the second in a series to look at ADO.NET. In this
installment we take a look at the ADO.NET data storage classes.
http://community.borland.com/delphi/0,1419,1,00.html
* InterBase 7.1 Trial Technical Specifications - Sriram Balasubramanian
Capabilities of the InterBase 7.1 Trial version.
http://community.borland.com/article/0,1410,30151,00.html
* The Coad Letter 110: Announcing UML 2.0 - by Randy Miller
The UML 2.0 Specification has been approved by the OMG. The final
editing process is going on and the specification is set to be
released to the public by the end of the year. Here is what is new.
http://community.borland.com/article/0,1410,30144,00.html
* What's New in UML 2? The Use Case Diagram - by Randy Miller
This article examines a new element of the use case diagram in UML 2.0
including multiplicities and conditions on "extends" relationships.
http://community.borland.com/article/0,1410,30166,00.html
* Business Rules - by Randy Miller
This article looks at business rules in a modeling and development
environment.
http://community.borland.com/article/0,1410,30158,00.html
* InterBase Community Tools and Solutions - by Aaron Ruddick
Third party tools and solutions for InterBase.
http://community.borland.com/article/0,1410,30126,00.html
* Interview with Steve McConnell - by Clay Shannon
Steve McConnell, the author of several important programming books
including "Code Complete", "Rapid Development", "Software Project
Survival Guide", and "After the Gold Rush" answers questions about his
current projects.
http://community.borland.com/article/0,1410,29921,00.html
* Get Your Delphi Apps off to a Fast Start - by Clay Shannon
Explains how and why you should create a template project. This can
save you a lot of time whenever you begin a new Delphi project, as the
normal "setup work" you do will already be done - setting properties,
adding forms and units, etc.
http://community.borland.com/article/0,1410,29907,00.html
* Interview with Lino Tadros - by Clay Shannon
Lino Tadros talks about creating the first ActiveX control ever
written with Delphi, a practical joke he played on some of his
employees, why he eschews the newsgroups lately, who he impersonates,
and the new magazine he is writing for.
http://community.borland.com/article/0,1410,30085,00.html
* Simple Programming Tip #2 - by Charlie Calvert
A discussion of benefits to be derived from using testing tools such
as JUnit, DUnit, NUnit or CppUnit. The heart of the argument is that
such tools encourage programmers to create highly modular, reusable
classes that are easy to maintain.
http://community.borland.com/article/0,1410,30049,00.html
* Are We Not Geeks? - by Clay Shannon
Why is programming the least understood of all professions? There is
a conspiracy to defame us! Hollywood and Madison Avenue don't want us
to come out from behind our cubicle walls. A tongue-in-cheek take on
how programmes are viewed.
http://community.borland.com/article/0,1410,29920,00.html
* Interview with Chad "Kudzu" Hower - by Clay Shannon
Chad "Kudzu" Hower, prime mover behind Indy and IntraWeb, talks about
the future of Delphi, what he thinks of .NET, how to bring about world
peace, why he rarely reads computer books, and other things.
http://community.borland.com/article/0,1410,30038,00.html
* Disseminating Your Software - by Clay Shannon
The difference between deployment and dissemination of software is
discussed, as is the relative merits of hosting your own software or
outsourcing that chore. DIY vs. outsourcing is also examined relative
to the processing of payments.
http://community.borland.com/article/0,1410,29931,00.html
* InterBase 7.1 DataType to ADO.NET C# Type mappings - by Borland
Developer Support Staff
InterBase SQL datatypes and C# Object Type mappings using the
InterBase Borland Data Provider (BDP).
http://community.borland.com/article/0,1410,30108,00.html
* Distributed Information Systems, From A to Z: Part I - Serge Dosyukov
This article is a first in a series discussing several aspects of
building distributed information systems using Delphi 7 and Indy.
http://community.borland.com/article/0,1410,30025,00.html
* Interview with Ray Lischner - by Clay Shannon
Ray Lischner talks about his books, how he backed into programming,
his keyboard deafness, the extent of his multilingualism, C#, his
predictions for a post-.NET Borland and what he's working on.
http://community.borland.com/article/0,1410,30013,00.html
* Life cycle of a Database Application - by Oleg Meeting
Analyses a database project's life pattern and concludes some useful
recommendations for developers.
http://community.borland.com/article/0,1410,28994,00.html
* This Old Pipe - by Randall Nagy
Few appreciate how much modern computing relies upon pipes and
streams. This article reviews how to apply these elegant IPC
mechanisms to your console and GUI applications.
http://community.borland.com/article/0,1410,29772,00.html
* Using XMLBroker with IntraWeb - by Guinther Pauli
This article will explain how to use the XMLBroker in a IntraWeb
application, caching data and updates in browser. And finally, how to
solve this updates to database server.
http://community.borland.com/article/0,1410,29860,00.html
* Advanced Dynamic Packages - by Vino Rodrigues
Topics covered include: Calling Custom Class Methods, Calling Standard
Functions and Procedures, Obtaining Package Information and Obtaining
Knowledge of Class Names.
http://community.borland.com/article/0,1410,29119,00.html
* An Introduction To Endo-Testing Using Mock Objects - by Sascha Frick
Problems arise when applying unit testing and test driven development
principles to complex projects. This article describes how to overcome
the problems with endo-testing and mock objects.
http://www.thedelphimagazine.com/samples/1677/1677.htm
* Creating Custom Windows Event Logs - by Dennis Passmore
Explains what is involved in creating custom event logs and why they
will come in handy to monitor your applications.
http://www.thedelphimagazine.com/samples/1655/1655.htm
* Code Reuse Through Interfaces - Rob Collins
Code reuse is perhaps more talked about than done, so this article
shows how code reuse can be achieved, with aggregated Delphi
interfaces.
http://www.thedelphimagazine.com/samples/1664/1664.htm
* Registering DLL and ActiveX Controls from Code - by Zarko Gajic
How to register / unregister OLE controls such as dynamic-link library
(DLL) or ActiveX Control (OCX) files from a Delphi application.
http://delphi.about.com/library/weekly/aa040803a.htm
* Exposing the OnClick Event for a DBGrid - by Zarko Gajic
Delphi's DBGrid does not respond to the OnClick event. Here's how to
hack a DBGrid and surface the OnClick event - using the so-called
"protected hack".
http://delphi.about.com/library/weekly/aa083003a.htm
* Accessing Protected Members of a Component - by Zarko Gajic
Many Delphi components have useful properties and methods that are
marked invisible ("protected") to a Delphi developer. In this article
you will find the workaround to this problem - thus enabling you to
access a DBGrid's RowHeights property, for example.
http://delphi.about.com/library/weekly/aa082603a.htm
* Accessing protected members of a component - by Zarko Gajic
Many Delphi components have useful properties and methods that are
marked invisible ("protected") to a Delphi developer. In this article
you will find the workaround to this problem - thus enabling you to
access a DBGrid's RowHeights property, for example.
http://delphi.about.com/library/weekly/mpreviss.htm
* CheckBox inside a DBGrid - by Zarko Gajic
Here's how to place a check box into a DBGrid. Create visually more
attractive user interfaces for editing boolean fields inside a DBGrid.
http://delphi.about.com/library/weekly/aa082003a.htm
* Adding components to a DBGrid - by Zarko Gajic
How to place just about any Delphi control (visual component) into a
cell of a DGBrid. Find out how to put a CheckBox, a ComboBox (drop
down list box) and even an Image inside the DBGrid.
http://delphi.about.com/library/weekly/aa081903a.htm
* Computer restrictions with Delphi and Registry - by Zarko Gajic
How to enable your applications to make restrictions to what users can
(and cannot) do with their computer using Delphi and the Registry.
http://delphi.about.com/library/weekly/aa081703a.htm
* Implementing PING without using raw sockets - by Serhiy Perevoznyk
Implementing Internet pings using Delphi and the Icmp.dll.
http://delphi.about.com/od/internetintranet/l/aa081503a.htm
* A Simple example of Artificial Intelligence using Delphi - R. Dhungel
The article explores Delphi approach to AI, using the pebble picking
game. A simple game is used to show how computer can learn by
correcting mistakes.
http://delphi.about.com/library/weekly/aa081003a.htm
* DLLs Made Simpler - by Richard Le Mesurier
This article is aimed at removing the fear of writing DLLs for
beginners. A lot of beginners think DLLs are really complex, when
actually they are pretty simple.
http://delphi.about.com/library/weekly/aa080803a.htm
* Professional Looking Grids with Custom Drawing - by Vegar Vikan
Using custom drawing to make your grids look as nice as the expensive
third party suites. Three main topics are presented: how to fix-up the
column headers, how to add clickable buttons and checkboxes inside
cells and how to simulate merged cells.
http://delphi.about.com/library/weekly/aa072203a.htm
* PDF Managing Tools - by Zarko Gajic
Need to create, encrypt or manage PDF files from Delphi? Using the
tools and components in this listing you will get powerful control of
PDF documents in your applications.
http://delphi.about.com/cs/toppicks/tp/aatppdf.htm
* Reading and Manipulating XML files - by Zarko Gajic
Learn how to read and manipulate XML documents with Delphi using the
TXMLDocument component.
http://delphi.about.com/library/weekly/aa072903a.htm
* Locate, Display and Execute Control Panel Applets - by Zarko Gajic
Interested in Delphi code to mimic the Windows Control Panel folder
behavior? In this article you can learn how to find CPL files, how to
extract description, name and even the applet icon. Even more, learn
how to execute applets from your applications.
http://delphi.about.com/library/weekly/aa062403a.htm
* TComplexMath - by Thomas Bejstam
When using Delphi to develop engineering applications, you'll often
find that the mathematics support in the development environment is
not enough. TComplexMath unit is a way out! Full source code.
http://delphi.about.com/library/weekly/aa070103a.htm
* Free Source VCL Sets! - by Zarko Gajic
Looking for a free source multi-purpose Delphi component collection
to add more power to your applications? Look no more, here's a list
of the best Delphi component (free with source) sets on the Net!
http://delphi.about.com/cs/toppicks/tp/aatpfreevclset.htm
* A TreeView of Data - by Anand Gopalakrishnan
How to display a dataset of records from a table or query in a
treeview component.
http://delphi.about.com/library/weekly/aa060603a.htm
* Adding Regular Expression Filtering to ShellListView - George Merriman
How to add regular expression (filename) filtering to the Delphi file
explorer application.
http://delphi.about.com/library/weekly/aa052503a.htm
* Shell Controls: Delphi's Hidden Gems - by George Merriman
How to create a reasonable Delphi facsimile of the Windows Explorer,
all without writing a single line of code.
http://delphi.about.com/library/weekly/aa052503a.htm
* Records in Delphi: Part 1 - by Zarko Gajic
Learn about records, Delphi's Pascal data structure that can mix any
of Delphi's built in types including any types you have created.
http://delphi.about.com/library/weekly/aa062700a.htm
* Records in Delphi: Part 2 - by Kevin S. Gallagher
Why and when to use variant records and creating an array of records.
http://delphi.about.com/library/weekly/aa070803a.htm
* TNumEdit - by Michael Klaus
TNumEdit is a TEdit descendant that only accepts numerical input. You
can adjust whether to accept positive or negative numbers, integers or
decimals. You can also limit the input by using MinValue and MaxValue.
http://delphi.about.com/library/weekly/aa070603a.htm
* About Delphi Programming *Current Headlines* - by Zarko Gajic
Put About Delphi Programming *Current Headlines* on your web site for
FREE! Get the *Current Headlines* without leaving the Delphi IDE using
the free Delphi IDE add-on.
http://delphi.about.com/library/blsticker.htm
* UML Sequence Diagrams Show Class Collaboration - by Kirk Knoernschild
The dynamic aspects of class collaborations can be represented in UML
with sequence diagrams. Find out how to use sequence diagrams as a
tool in your application development and get a better understanding of
object interaction.
http://builder.com.com/article.jhtml?id=u00320030814KXK01.htm
* Follow these Steps to Secure your Data Layer - by Robert W. McLaws
A secure data layer is essential for a truly secure application. Learn
how to nurture a secure environment for the pivotal Data tier of your
application with the correct tools.
http://builder.com.com/article.jhtml?id=u00320030731MCL01.htm
* Three Recovery Models for Backing Up your SQL Server - by Ed Martin
Backing up SQL Server is a standard practice, but knowing which
recovery model to use can be confusing. Use these tips to get started
with your backup strategy.
http://builder.com.com/article.jhtml?id=u00320030429gcn01.htm
* SQL Server: Design for Security from the Start - Harkins + Gunderloy
When developing a SQL Server database security must be a priority even
during the design process. Prepare a more secure database application
by familiarizing yourself with these guidelines before you start your
next project.
http://builder.com.com/article.jhtml?id=u00320030715ssh01.htm
* Use Microsoft JET'S ShowPlan to Write More Efficient Queries
- by Susan Sales Harkins and Mike Gunderloy
In large databases, an inefficient query can reduce performance to a
crawl and incur the ire of users. The ShowPlan feature of Microsoft's
Jet engine can help you plan more efficient queries, optimize your
database, and increase performance.
http://builder.com.com/5100-6388-5064388.html?fromtm=e601
* Secure SQL Server: Installing for Security - by Harkins + Gunderloy
Securing SQL Server is vital to the proper design of any database
system. Get the lowdown on how to install SQL securely, protect data
from prying eyes, and ensure its validity.
http://builder.com.com/5100-6388-5054470.html
* Basic .Net: Framework Compatibility Issues - by Builder.com
Multiple .NET Framework versions means there are more options to
consider during implementation. This article looks at compatibility
issues between versions 1.0 and 1.1 of the .NET Framework and explore
what you can do to reduce versioning problems.
http://builder.com.com/5100-6389-5055539.html
* Differences Between Jet's ISNULL() and T-SQL's COALESCE() Functions
- by Susan Sales Harkins and Doris Manning
Null values are handled differently by Access when compared to SQL
Server. Get a hands-on explanation of the appropriate null functions
for each database and improve your application's reliability.
http://builder.com.com/5100-6388-5053997.html
* Avoid Security Vulnerabilities in your CGI Programs - Scott Robinson
CGI makes creating Web-executable programs quick and easy - both for
you and for hackers. Learn about some of the explicit security
vulnerabilities of CGI and how to avoid them.
http://builder.com.com/5100-6371-5061201.html
* How to execute a Javascript function in a Webbrowser/ IE Document?
http://www.swissdelphicenter.ch/en/showcode.php?id=1732
* How to display items in a listview control display as a group (XP)?
http://www.swissdelphicenter.ch/en/showcode.php?id=1782
* How to know when a form is activated or deactivated?
http://www.swissdelphicenter.ch/en/showcode.php?id=1775
* How to Determine if you are running inside Virtual PC?
http://www.swissdelphicenter.ch/en/showcode.php?id=1756
* How to implement a Linked List Memory Table?
http://www.swissdelphicenter.ch/en/showcode.php?id=1758
* How to get the server (router) and client IP address of your dial-up
connection? - by Sunish Issac
There are quite a lot of articles on retrieving IP addresses for LAN
interfaces. Here's one for dialup using RAS(Remote Access Services).
http://www.delphi3000.com/articles/article_3683.asp
* Changing the z-order of controls - by Daniel Wischnewski
Move your control step-by-step.
http://www.delphi3000.com/articles/article_3684.asp
* RAVE Export Device for EMF, WMF and Bitmaps - by Julian Ziersch
How to implement a generic RAVE render device.
http://www.delphi3000.com/articles/article_3685.asp
* How To Use MSAccess In Delphi (using BDE Components) - by Ameenudeen M
Methods to access data in MS Access Database from Delphi Application
using standard BDE Components.
http://www.delphi3000.com/articles/article_3687.asp
* Handle OleExceptions - by Andreas Schmidt
A EOleException has more information than the default handler shows.
http://www.delphi3000.com/articles/article_3694.asp
* DialogUnits To Pixels - by Jean Claude Servaye
How to convert dialogs units in pixels if the dialog do not use the
system font.
http://www.delphi3000.com/articles/article_3695.asp
* Check for exe files and DLLs - by Peter Johnson
This article looks at how we examine a file to check if it is a DOS or
Windows executable and, if so, whether it is a program file or a DLL.
http://www.delphi3000.com/articles/article_3696.asp
* TreeView+ComboBox - by Eugine Veselov
How to create a combobox which has a popup treeview.
http://www.delphi3000.com/articles/article_3699.asp
* Converting ASCII to Paradox - by gourari noureddine
Exports delimited file to a Paradox table.
http://www.delphi3000.com/articles/article_3700.asp
* Dynamic ODBC DSN create and ADV MS-SQL Login - by Mike Heydon
This class adds dynamic ODBC Alias/DSN generation at run-time. Also
featured is two login modes, one that lets the programmer handle
returned errors and another that stays in a loop with error messages
that allows retry and Alias/DSN user setup. There are also properties
that set and retrieve ODBC Alias/DSN driver and dsn settings such as
CPTimeout, Version etc.
http://www.delphi3000.com/articles/article_3702.asp
* Advanced exception handler to find the exception source file name,
call stack and all other related information - by Clever Components
This article describes how to replace the standard Delphi exception
handlers with advanced ones in order to get more control over all
errors occuring during run-time execution. It is possible to collect
very detailed information about all occured exceptions and save this
information for later use without any interference with end-user.
http://www.delphi3000.com/articles/article_3703.asp
* Using TList's and Pointers in Delphi - by Stewart Moss
A small demonstration that shows how to use the TList helper object
and how to use pointers. It creates a list of Pointers to Integers but
they could be a list of pointers to any record or class type.
http://www.delphi3000.com/articles/article_3705.asp
* Component to Monitor Clipboard - by Enrique Ortuño
http://www.delphi3000.com/articles/article_3708.asp
* Direct File Access with a StringGrid - by Max Kleiner
From time to time we need to populate a StringGrid from a file and
save it to a file in a well defined structure like a record. Here's a
way to handle this with a contol class.
http://www.delphi3000.com/articles/article_3709.asp
* Converting a floating point value to an integer value - by Jim Carter
Real to Integer typecasting.
http://www.delphi3000.com/articles/article_3712.asp
* Methods for Cutting and Pasting SQL Select Order by Clause - A. Wijoyo
Most of data access components don't have method for sorting in memory
records. So the only way for sorting records is add an order by clause
to the query and reopen it. These method make this task easier to do.
http://www.delphi3000.com/articles/article_3715.asp
* Inline-editing with a TTreeView - by Omer Can
http://www.delphi3000.com/articles/article_3720.asp
* TTreeView descendant showing LAN hierarchy - by Eugine Veselov
This component shows your LAN resources represented as a tree.
http://www.delphi3000.com/articles/article_3721.asp
* Design time Icons for CoClasses - by Andreas Schmidt
How to add icons to CoClasses in an ActiveX DLL or automation server.
Icons will be shown in IDEs like VB, VC++, Delphi, etc.
http://www.delphi3000.com/articles/article_3725.asp
* Exchange Items in a TListView - by Mike Shkolnik
http://www.delphi3000.com/articles/article_3726.asp
* Open Password Protected xls File + Save Without Password - M. Shkolnik
http://www.delphi3000.com/articles/article_3727.asp
* Replace Text or Font in doc File - by Mike Shkolnik
How to use an OLE automation for MS Word and replace some text string
in any document.
http://www.delphi3000.com/articles/article_3728.asp
* BitCompression - by Ritchie Blackmore
Why using whole byte to store bynary data when single bit is enough?
With this unit you can compress boolean array into byte array in one
move.
http://www.delphi3000.com/articles/article_3730.asp
* Read picture maketime from digital camera file - by Maarten de Haan
Almost every digital camera stores the datetime of the camera clock in
the JPG-file when a picture is taken. This function will return the
first occurence of the datetime found in the JPG-file.
http://www.delphi3000.com/articles/article_3732.asp
* plain MySQL access - by Ionel Roman
How to access MySQL databases in plain source code using just library.
(Windows and Linux)
http://www.delphi3000.com/articles/article_3733.asp
* Adding Line no and Column no to TRichTextBox - by Sridhar n
http://www.delphi3000.com/articles/article_3734.asp
* Exporting an TImage contents to WMF format - by Walter Alves Chagas
http://www.delphi3000.com/articles/article_3735.asp
* Show System Menu for Form - by Mike Shkolnik
How to activate a system menu by button click.
http://www.delphi3000.com/articles/article_3737.asp
* WinInet: Implementing Resuming Feature - by Clever Components
This article describes the most efficient way to continue downloading
a file from a point where it stoped and organize the mutithreaded
downloading feature using the WinInet library.
http://www.delphi3000.com/articles/article_3738.asp
* When to use Interfaces, when to use Inheritance? - by Max Kleiner
There are two possibilities to define a (same) class hierarchy: with
interfaces, with inheritance. Which one suits your needs?
http://www.delphi3000.com/articles/article_3745.asp
* Delphi .NET: "Hello, world!" - by Herbert Poltnik
http://www.delphi3000.com/articles/article_3750.asp
* Delphi .NET: Get Computer IP address - by Herbert Poltnik
How to get the list of the computer's IP addresses.
http://www.delphi3000.com/articles/article_3751.asp
* Reterive Windows / IExplorer Special Folders - by Magnus Flysjö
Using SHGetSpecialFolderPath API to get special folders.
http://www.delphi3000.com/articles/article_3759.asp
* Increasing speed of a ListBox with 1,000,000 lines - by Werner Pamler
Populating the items of a ListBox can become extremely slow for a VERY
large number of items. Is there a way to speed this up?
http://www.delphi3000.com/articles/article_3761.asp
* How To Load File Data To a String Using TFileStream - by Michael Cone
How To Load File Data To a String Using TFileStream.
http://www.delphi3000.com/articles/article_3762.asp
White Papers / Estudos de Caso
------------------------------
* Case Study: Smart Restaurant Solutions
See how Smart Restaurant Solutions took advantage of Delphi 7 Studio
to deliver a Web Services-based solution to keep ahead of the
competition.
http://www.open-consult.com/casos/srs.pdf
Tutoriais e Treinamento
=======================
* BorCon 2003 to be be held in San Jose, California November 1-5, 2003
http://info.borland.com/conf2003/
* Borland Web Seminars
The Borland Web Seminar Series is designed to address the latest in
development, deployment, and integration technologies.
http://info.borland.com/web_seminar/
Available Web Seminars include:
- Delivering high-performance applications for the Microsoft .NET
Framework
- Simplifying Integration of the Microsoft .NET Framework with
J2EE/CORBA
- Driving Alignment of IT Initiatives with Business Goals
- Why Upgrade to JBuilder 9
- Accelerating Productivity with Agile Modeling
- Introduction to the Borland Embedded Databases
- Performance Management for J2EE Systems
* Writing MS SQL Server Extended Stored Procedures with Delphi
- by Berend de Boer
Presents a framework which makes writing Microsoft SQL Server Extended
Stored Procedures a breeze with four sample xp's (Extended Stored
Procedures) shown and discussed.
http://www.berenddeboer.net/article/1293.zip
Source code: http://www.berenddeboer.net/article/1293_C.zip
* Integrating with Outlook - By Berend de Boer
This article explores the possibilities of using Microsoft Outlook as
an extension of your program, or vice versa, your program as an
extension of Outlook. The article gives you a good idea of Outlook's
object model. You'll be able to integrate straight into Outlook itself
by extending Outlook's menu and toolbars. After reading this article
you should be able to program and control Outlook, sending mail and
reading contacts. Also you should have a good start in writing
Exchange Extensions.
http://www.berenddeboer.net/article/1292.zip
Source code: http://www.berenddeboer.net/article/1292_C.zip
Outros Links
============
* Get the New Delphi Desktop Wallpaper - by Borland
Show your support for Borland with our cool new Delphi wallpaper.
http://community.borland.com/article/0,1410,30321,00.html
* Borland Partner CDs are online - by John Kaster
The partner CD submissions for Borland's latest IDE products are
available for download.
http://community.borland.com/article/0,1410,29797,00.html
* C#Builder Personal Download Now Available
C#Builder Personal is now available as a free download for
non-commercial development.
http://www.borland.com/products/downloads/download_csharpbuilder.html
* Delphi-PRAXiS
Delphi community for German speaking programmers.
http://www.delphipraxis.net
* Delphi Programmers @ SETI - by m3rlin
Newly founded SETI@Home group created for Delphi programmers.
Join myself and m3rlin in the search for little green men. :)
http://setiathome.ssl.berkeley.edu/stats/team/team_156396.html
Notícias
========
* Borland Upgrades Embedded Database - by Paul Krill
Borland Software introduced InterBase 7.1, a cross-platform embeddable
database that adds support for Windows Server 2003.
http://www.infoworld.com/article/03/06/17/HNinterbase_1.html?platforms
* BorCon 2003 to be be held in San Jose, California November 1-5, 2003
http://info.borland.com/conf2003/
Other Borland conferences around the world:
- EKon 7 - 7th German/Borland Developers Conference - Frankfurt -
September 21-26, 2003
http://www.entwicklerkonferenz.de
http://www.entwicklerkonferenz.com/
- Borland Conference Europe - Amsterdam - November 10-12, 2003
http://www.europeanborlandconference.com/
- Borland Conference France - Paris - December 10-11, 2003
http://info.borland.fr/conference/2003/
* Open Letter to the Borland C++ Developer Community - by J.P. LeBlanc
Learn about the future of the Borland C++ product line.
http://bdn.borland.com/article/0,1410,30279,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/p0048.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.
________________________________________________________________________
|