Boletim Pascal #43 - 14 DE ABRIL DE 2003 (Original: 16-JAN-2003)
Índice
1. Algumas Palavras dos Editores
2. MS Exchange API usando CDO (Collaboration Data Objects)
Biblioteca Básica CDO (Collaboration Data Objects)
(Comunicando-se com o servidor MS-Exchange)
3. Aplicações Distribuídas, o Caminho Fácil (II)
MsgConnect Básica. Sistema de Chat Simples.
4. Alterando Diálogos Padrão do Windows
Alterando Controles dos Diálogos (Abrir/Salvar) Padrão do Windows
5. Óvos de Páscoa no Delphi - Conheça melhor seu Delphi
6. Fóruns / Listas
7. Delphi na Rede
- Sites em português
- Componentes, Bibliotecas e Utilidades
. Shareware/Comercial
. Freeware
- Artigos, Dicas e Truques
- Tutoriais
- Outros Links
________________________________________________________________________
1. Algumas Palavras dos Editores
Editorial da Versão em Português
--------------------------------
Agora que estamos avançando com as traduções, gostaria de voltar a
convidar os assinantes interessados a submeterem artigos para nosso
Boletim Pascal. Até hoje, somente traduções foram publicadas na edição
em português. Já está mais do que na hora de nossos colaboradores
soltarem o verbo e mostrarem a qualidade do trabalho que desenvolvemos
aqui no Brasil e demais países de língua portuguesa. E, só pra
incentivar vocês um pouco mais, o(s) artigo(s) selecionados pelos
editores serão traduzidos para as demais edições do Boletim Pascal
(inglês e espanhol).Então fico no aguardo de suas colaborações.
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
-----------------------------
Gostaria de agradecer a Mike Heydon, Eugene Mayevski, Igor Siticov e
Bogdan Grigorescu pela colaboração nesse número e fico feliz em
presenter Igor e Mike com os prêmios dessa edição:
* Igor Siticov ("Alterando Diálogos Padrão do Windows")
. TSDBGridFooter v2.0 por Jovan Sedlan, Shareware ($74.50)
Esse componente é uma ferramenta poderosa que permite cálculos
automáticos no seu DBGrid e exibe essa informação num rodapé
configurável abaixo do grid. É projetado para funcionar com o
TSDBGrid (também incluído) apesar de poder ser utilizado em qualquer
descendente de TCustomDBGrid. http://www.softpile.com/Development/Libraries/Review_24756_index.html
* Mike Heydon ("MS Exchange API usando CDO (Collaboration Data Objects)")
. SDL Component Suite 7.0 - por Software Development Lohninger ($99)
O SDL Component Suite oferece uma ampla variedade de copmponentes para
aplicações científicas e de engenharia (matemática, estatística,
química, gráficos, visualização de dados, transformações de Fourier,
plotagem em 3D, mapas geográficos, ajuste de curvas, etc). Disponível
para Delphi 3-7 e BCB 4-6. http://www.lohninger.com/sdlindex.html
Para o próximo número, teremos os seguintes prêmios para nossos
colaboradores (artigos em inglês):
* llPDFLib v1.1 - por llionsoft, Shareware ($70, $280 com fontes)
llPDFLib é uma biblioteca Object Pascal para a criação de documentos
PDF. Não utiliza DLLs ou software externo de terceiros para gerar os
PDFs. A biblioteca consiste de um componente TPDFDocument com métodos
e propriedades análogos ao TPrinter do Delphi, mas orientados à
geração do arquivo PDF. http://www.llion.net/
* Greatis Form Designer v3.4 - por Greatis Software, Shareware ($49.95)
Esse é um editor de formulários de tempo de execução que permite ao
usuário movimentar e redimensionar qualquer controle do formulário.
Não é preciso preparar o formulário para utilizar o Form Designer.
Apenas coloque um componente TFormDesigner num formulário, defina a
propriedade Active para True e pronto! Para Delphi 4-7 e BCB 3-6.
http://www.greatis.com/formdes.htm
Espero que gostem deste número.
Cordialmente,
Ernesto De Spirito
boletim-pascal-owner@yahoogrupos.com.br
__________________
Colaboraram nesse número: Dave Murray
________________________________________________________________________
Greatis Runtime Fusion includes Form Designer Pro ($ 49.95) and Object
Inspector Pro ($ 49.95), two flagship Delphi-related products of Greatis
Software, and costs $89.90 - Save $10 and get additional demos. Let the
user design forms at runtime. >>>>>>> http://www.greatis.com/runtime.htm
________________________________________________________________________
2. MS Exchange API usando CDO (Collaboration Data Objects)
Biblioteca Básica CDO (Collaboration Data Objects)
(Comunicando-se com o servidor MS-Exchange)
Copyright (c) 2002 Mike Heydon
Tradução: Demian Lessa
Esse é um assunto extenso e está fora do escopo deste artigo tratá-lo
em toda seu detalhamento. Essa biblioteca oferece os componentes básicos
para a construção de aplicativos usando CDO. Existem muitas referência
na Net mas o melhor recurso é o arquivo CDO.HLP que acompanha o CD do
Exchange Server, ou o site http://www.cdolive.com/start.htm. O site
cdolive.com é uma excelente referência onde se pode discutir todos os
aspectos relacionados ao CDO inclusive instalação, versões e downloads
(CDO.HLP pode ser baixado de lá).
Minha classe básica oferece a seguinte funcionalidade:
* funções e métodos utilitários
function CdoNothing(Obj : OleVariant) : boolean;
function CdoDefaultProfile : string;
function VarNothing : IDispatch;
procedure CdoDisposeList(WorkList : TList);
procedure CdoDisposeObjects(WorkStrings : TStrings);
procedure CdoDisposeNodes(WorkData : TTreeNodes);
* construtores Create que permite um perfil de logon padrão (Default),
perfis de logon específicos (Specific) e um logon personificado de
usuário (Impersonated) com perfil (obrigatório para um logon bem
sucedido no Windows Service Applications)
constructor Create; overload;
constructor Create(const Profile : string); overload;
constructor Create(const Profile : string;
const UserName : string;
const Domain : string;
const Password : string); overload;
* métodos para carga de listas de strings, treeviews, etc. e iteração de
objetos
function LoadAddressList(StringList : TStrings) : boolean;
function LoadObjectList(const FolderOle : OleVariant;
List : TList) : boolean;
function LoadEMailTree(TV : TTreeView;
Expand1stLevel : boolean = false;
SubjectMask : string = '') : boolean;
function LoadContactList(const FolderOle : OleVariant;
Items : TStrings) : boolean; overload;
function LoadContactList(const FolderName : string;
Items : TStrings) : boolean; overload;
procedure ShowContactDetails(Contact : OleVariant);
* Os serviços acima carregam várias listas em objetos TStrings, listas
ou treeviews. Na liberação de listas, objetos contidos nessas
estruturas são liberados a cada chamada a LoadXXX. Entretanto, a
liberação final é responsabilidade do programador. Você pode fazer
isso você mesmo ou então utilizar a função CdoDisposeXXX(). Veja a
documentação do código para maires detalhes.
function First(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Last(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Next(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Prior(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function AsString(const ItemOle : Olevariant;
const FieldIdConstant : DWORD) : string;
Os serviços acima oferecem iteração de objetos como Caixa de Entrada,
Contatos, etc. A função AsString retorna o valor de um campo de um
objeto como Endereço de Email, Nome, Empresa, etc. (existem inúmeros
desses definidos na seção CONST sob a referência "Field Tags").
* propriedades
property CurrentUser : OleVariant read FCurrentUser;
property Connected : boolean read FConnected;
property LastErrorMess : string read FlastError;
property LastErrorCode : DWORD read FlastErrorCode;
property InBox : OleVariant read FOleInBox;
property OutBox : OleVariant read FOleOutBox;
property DeletedItems : Olevariant read FOleDeletedItems;
property SentItems : Olevariant read FOleSentItems;
property GlobalAddressList : Olevariant read FOleGlobalAddressList;
property Contacts : Olevariant read FOleContacts;
property Session : OleVariant read FOleSession;
property Version : string read GetFVersion;
property MyName : string read FMyName;
property MyEMailAddress : string read FMyEMailAddress;
O construtor Create inicializa os objetos predefinidos InBox, OutBox,
DeletedItems, SentItems, GlobalAddressList, Session e Contacts. As
outras propriedades são auto-explicativas.
Como mencionado anteriormente, a funcionalidade do CDO é extensa e
objetoc como InBox podem ter vários métodos e propriedades, incluindo
Atualização, Inclusão, Exclusão, etc. O arquivo CDO.HLP apresentará
esses membros de classe. Minha classe é a base do CDO e simplifica a
criação de aplicativos; acredito que ela é melhor demonstrada através
de trechos de código. Acredito, um livro inteiro poderia ter sido
escrito a respeito desse assunto, mas é melhor estudar uma alternativa
usando a API do MS Outlook.
uses Cdo_Lib;
var
Cdo: TcdoSession;
MailItem: OleVariant;
// iterar pelos Emails na Caixa de Entrada (InBox)
begin
Cdo := TCdoSession.Create;
if Cdo.Active then
begin
Cdo.First(Cdo.InBox, MailItem);
while true do
begin
if not Cdo.Nothing(MailItem) then
begin
// Faça algo com os dados e exclua o EMail
Subject := MailItem.Subject;
EMailAddress := Cdo.AsString(MailItem.Sender,
CdoPR_EMAIL_AT_ADDRESS);
EMailName := MailItem.Sender.Name;
BodyText := MailItem.Text;
MailItem.Delete;
// Próximo Email
end;
MailItem := Cdo.Next(Cdo.Inbox.MailItem);
end;
end;
Cdo.Free;
end;
// Examplo de como carregar os emails num treeview
// e exibi-los no clique do treeview
unit UBrowse;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, Menus, ExtCtrls, StdCtrls, Buttons,
ImgList, CDO_Lib;
type
TFBrowse = class(TForm)
Panel1: TPanel;
Panel3: TPanel;
Label1: TLabel;
Label2: TLabel;
lbFrom: TLabel;
lbDate: TLabel;
Memo1: TMemo;
Panel2: TPanel;
OKBtn: TBitBtn;
tvCalls: TTreeView;
ImageList1: TImageList;
StatusBar1: TStatusBar;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure tvCallsClick(Sender: TObject);
procedure btnPrintClick(Sender: TObject);
private
{ Private declarations }
Doc: OleVariant;
Cdo: TCdoMapiSession;
public
{ Public declarations }
end;
var
FBrowse: TFBrowse;
implementation
{$R *.DFM}
procedure TFBrowse.FormShow(Sender: TObject);
var
TN: TTreeNode;
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
Cdo := TCdoMapiSession.Create;
Cdo.LoadEMailTree(tvCalls, true, '*Support ---*');
tvCalls.SortType := stText;
TN := tvCalls.Items[0];
TN.Expand(false);
tvCalls.SetFocus;
Screen.Cursor := crDefault;
end;
procedure TFBrowse.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
CdoDisposeNodes(TvCalls.Items);
Cdo.Free;
end;
procedure TFBrowse.tvCallsClick(Sender: TObject);
var
TN: TTreeNode;
begin
TN := tvCalls.Selected;
Memo1.Clear;
lbFrom.Caption := '';
lbDate.Caption := '';
if TN.Data <> nil then
begin
Doc := TOleVarPtr(TN.Data)^;
Memo1.Text := Doc.Text;
lbFrom.Caption := Doc.Sender.Name;
lbDate.Caption := FormatDateTime('dd/mm/yyyy hh:nn',
Doc.TimeSent);
end;
end;
end.
________________________________________________________________________
Qual foi a última vez que você votou para o Boletim Pascal? Suporte essa
iniciativa votando para o Boletim Pascal no The Programming Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
3. Aplicações Distribuídas, o Caminho Fácil (II)
MsgConnect Básica. Sistema de Chat Simples.
Por Eugene Mayevski <Mayevski@eldos.org>
Tradução: Carlos Arrebola
Na primeira parte deste artigo (Edição #42) tivemos um breve
contato com os métodos usados para trocar informações entre
as diferentes partes de uma aplicação. Agora trataremos do
desenvolvimento de um sistema de chat simples para Intranets.
Você encontrará um exemplo (muito rudimentar mas completo) anexado à
aplicação MsgConnect: http://www.msgconnect.com/download.html
É chamado SendNote. Como o próprio nome diz, esta aplicação permite
que você envie notas de texto a destinatários. Você pode usar este
exemplo como material de referência para o que vamos apresentar aqui.
Comecemos do início. Decidimos usar a MsgConnect já que ela pretende
ser independente de plataforma e orientada a mensagens. Para distribuir
a mensagem precisamos de 3 coisas:
1. um componente para enviar a mensagem
2. um componente para distribuir a mensagem
3. um componente para receber a mensagem
Ao contrário da maioria dos métodos de troca de dados, onde as partes
remetente e receptora são componentes distintos, a MsgConnect usa o
mesmo conjunto de componentes para enviar e receber mensagens.
Como descrito na seção "Getting Started" da documentação da MsgConnect,
precisamos somente de 3 componentes- Messenger, Transport e Queue.
O Messenger é o núcleo da MsgConnect- ele faz todo o processamento.
Como o subsistema de mensagens do Windows®, que é baseado em threads,
a classe Messenger foi projetada para ser o único componente Messenger
na thread. Em outras palavras, somente uma instância da classe
Messenger dever ser criada para cada thread. Pode-se criar mais, mas
isto (a) não faz muito sentido e (b) complica a lógica da sua
aplicação.
O Transport é usado para distribuir mensagens aos receptores. Há
atualmente 2 tipos de Transports, baseados em Arquivos de Memória
Mapeados e em Sockets. O Transport baseado em HTTP está sendo criado
e há planos para outros Transports mais tarde. O Transport pega a
mensagem do Messenger, transforma-a em pacotes (também, opcionalmente,
criptografa, comprime e verifica a integridade) e transfere o resultado
para o receptor. A aplicação receptora deve também ter uma instância
ativa de Transport da mesma classe. Isto significa que se você enviar
uma mensagem usando um Transport Socket, é necessário ter um Transport
Socket ativo no outro lado (receptor).
O Queue é usado para distribuir as mensagens que chegam de forma
simples. Pode ser tratado como uma caixa de correio. Do mesmo modo que
você envia a carta à caixa, você envia a mensagem binária ao Queue.
Provavelmente caixa postal seria um termo melhor para o objeto Queue,
mas não vamos mudar o nome agora. Cada Messenger pode ter quantos Queues
você desejar. Os Queues são identificados por um nome simbólico. Há
certas limitações quanto aos nomes dos Queues que estão descritas na
documentação.
Como o Messenger sabe para onde enviar a mensagem? Quando você pede ao
Messenger para enviar algo, você informa o endereço do receptor. O
endereço consta de 3 partes:
* Identificador do Transport. Pode ser o nome do componente ou da
classe Transport conforme descrito na documentação.
* Endereço de destino. Este endereço é específico para cada Transport.
* Nome do Queue de destino.
E a última questão importante: a MsgConnect garante a entrega e a ordem
das mensagens? Bem, sistemas distribuídos são diferentes de processos
únicos em termos de quando e como estes sistemas são iniciados e parados
e que ligações externos eles mantém. Em outras palavras, não é possível
garantir que o sistema remoto receberá e processará a mensagem. Isto
está fora do alcance do controle da MsgConnect. Mas a entrega é ainda
garantida da seguinte maneira: se você usar um dos métodos SendMessage()
(e não PostMessage()) para enviar uma mensagem, você terá alguma
notificação a respeito do sucesso da entrega.
Para a ordem de entrega- devido à natureza bidirecional da MsgConnect
(se a conexão existe, ela pode ser usada para enviar mensagens em cada
direção completamente independente uma da outra)- existe uma chance de
duas mensagens programadas para entrega a um receptor ao mesmo tempo
serem entregues em ordem diferente da que foram postadas no Queue. Esta
situação pode ocorrer somente quando o mesmo Transport é usado tanto
para cliente como servidor (ou seja, inicia e aceita conexões ao mesmo
tempo). Isto é chamado "modo de transporte p2p" para a classe
SocketTransport. A solução é fácil, mas trataremos deste aspecto na
próxima parte do artigo- agora não precisamos nos ater a isso.
Agora que já conhecemos o básico, comecemos a criar nossa primeira
aplicação utilizando a MsgConnect: um chat simples.
Primeiro criamos os objetos Messenger, Queue e SocketTransport. Em
ambientes de desenvolvimento isto pode ser feito através de código ou
colocando-se um componente através do Designer.
Precisamos então ligar os objetos Queue e SocketTransport ao Messenger
apontando suas propriedades Messenger à instância adicionada da classe
Messenger. Em linguagens que não suportam propriedades, isto é feito
chamando o método SetMessenger().
Então apontamos as propriedades Transport (como mostrado nos projetos de
exemplo): MessengerPort (14583 em nosso exemplo), TransportMode (p2p no
nosso caso porque nosso chat envia e recebe mensagens através do mesmo
Transport) e, é claro, a propriedade Active. A MessengerPort é onde a
SocketTransport espera por conexões que chegam e a TransportMode define
como o transporte atua quando é ativado.
As mensagens são recebidas pela aplicação (a) usando o evento
OnUnhandledMessage da classe Queue ou (b) usando objetos MessageHandler.
O uso de objetos MessageHandler é uma boa saída pois permite o uso de
manipuladores de evento distintos para mensagens distintas. Para nosso
chat com uma mensagem usamos um evento OnUnhandledMessage; assim,
precisamos criar um manipulador para este evento. Este manipulador será
chamado quando a mensagem chegar.
Como dissemos anteriormente, a MsgConnect emula um subsistema de
mensagens do Windows e o objeto Messenger é usado em uma thread.
Enviamos uma mensagem usando um dos métodos PostMessage() ou
SendMessage*(). Lembre-se de chamar estes métodos a partir da mesma
thread na qual o objeto Messenger foi criado (o código base em Java da
MsgConnect não tem esta restrição).
Para enviar uma mensagem ao receptor em nossa aplicação chat, o usuário
deve entrar com o texto, nome de quem envia (que não é usado para
enviar mensagens- é somente para informação) e o endereço do receptor.
Aqui vem a parte complicada: na nossa aplicação chat permitimos ao
usuário entrar com o nome do computador ou o endereço de IP. Eles são
usados mais tarde sem tradução como um endereço receptor de mensagem.
Em aplicações mais complexas iremos procurar os nomes dos usuários na
lista ou fazer alguma outra tradução nome->endereço (usaremos isto
quando desenvolvermos uma aplicação de Mensageiro Instantâneo).
A próxima coisa a fazer é desenvolver um protocolo. Um protocolo é uma
seqüência de chamadas ou mensagens, usado para trocar informações entre
os dois lados da conexão. No nosso chat simples usamos um protocolo
muito rústico que consiste de apenas uma mensagem- todos os dados que
estão sendo enviados estão incluídos nesta mensagem.
Assim, temos algo para enviar. Como realmente enviamos a mensagem?
Lembre-se que diferentemente das mensagens do Windows, a MsgConnect
pode tranferir dados binários até 2Gb de tamanho.
Para enviar uma mensagem usamos uma instância da classe Message (um
registro em C++ e em Delphi). Preenchemos propriedades tipo inteiro-
Param1, Param2 e MsgCode. O parâmetro MsgCode tem o mesmo significado
que nas mensagens do Windows; é usado para encontrar o handler correto
na array de MessageHandlers dentro de uma Queue de destino.
Então precisamos anexar nossos dados de aplicação. Estamos enviando o
nome de quem envia e o corpo da mensagem. Nós os juntamos em uma string
e anexamos à classe Message.
Mais uma pequena descrição. A MsgConnect pode enviar dados binários
em uma mensagem enviada usando métodos SendMessage*() em uma ou ambas
direções. Em outras palavras, você pode anexar dados; o receptor os
processará e anexará os dados binários resultantes à resposta. Lembre-se
que na maioria dos casos você envia os dados somente em uma direção,
logo, por default, a propriedade BinDataType da classe/registro Message
é bdtConst. Se o receptor da mensagem precisar trocar os dados
associados com seus próprios dados e devolvê-los, você precisa apontar a
propriedade BinDataType para bdtVar. bdtVar informa ao Messenger para
juntar os dados com a resposta quando ela é criada.
OK, criamos a mensagem e estamos prontos para enviá-la. Qual dos métodos
PostMessage()/SendMessage*() usaremos? Isto depende da maneira que
criamos nossa aplicação.
O modo mais simples é, evidentemente, o PostMessage(). Ele transfere uma
mensagem à fila de mensagens e retorna imediatamente. Neste caso, a
mensagem é enviada em somente uma direção e o resultado da mensagem não
é retornado. Contudo, há um senão neste modelo- sua aplicação nunca sabe
se a mensagem foi realmente enviada. É como um pager- você pode enviar a
mensagem mas a menos que você peça para a pessoa a quem você enviou que
responda imediatamente você não saberá se a mensagem foi entregue. E
ainda pior- se a pessoa para quem você enviou a mensagem não responder a
você, isto não significa que ela não a recebeu.
Assim, SendMessage*() parece ser uma opção melhor. Há 3 funções
SendMessage*() similares - SendMessage(), SendMessageCallback() e
SendMessageTimeout(). As três enviam uma mensagem e tentam esperar
por um resultado, mas os detalhes de como elas operam são diferentes.
A função SendMessage() não retorna até que o resultado da mensagem
retorne ou um erro ocorra. Durante a chamada a este método as mensagens
do Windows (onde aplicáveis) não são processadas e sua interface de
usuário não é atualizada (a menos que você envie mensagens de outra
thread, mas isto está além do que estamos vendo).
A SendMessageTimeout() é similar à SendMessage(), com a diferença de que
a SendMessageTimeout() retorna incondicionalmente ou quando a resposta é
recebida ou quando o tempo expira. Na verdade, a SendMessage é
implementada via SendMessageTimeout().
Enquanto a SendMessageTimeout() é útil em certos casos, em outros
precisamos de outra solução. É o caso do método SendMessageCallback().
Ele envia uma mensagem e retorna imediatamente. A aplicação deve então
chamar o método DispatchMessages() do Messenger.
Como no Windows, a aplicação deve chamar o método DispatchMessages()
para distribuir as mensagens recebidas e chamar os manipuladores
apropriados. DispatchMessages() é usado para receber tanto as mensagens
originais quanto as respostas. Quando uma resposta é recebida pela
aplicação, a próxima chamada a DispatchMessages() chamará a função de
retorno.
Tal esquema requer que a aplicação (a) chame DispatchMessages() de
tempos em tempos e (b) continue suas operações depois que algum timeout
expire. Este requisito torna necessário o uso de um timer. O timer chama
a função que é usada para chamar a DispatchMessages() e também conta o
tempo que passou desde que a mensagem foi enviada.
No nosso chat simples usamos um timer como mencionado acima. A função de
retorno recebe a notificação acerca da entrega e transfere um registro
ao memo box de histórico.
Agora temos todas as partes da aplicação destritas. Nada ajudará mais
que o código de exemplo, então, como pode ver, encerramos o exemplo
SendNote.
Na próxima parte deste artigo criaremos um projeto de um Mensageiro
Instantâneo completo criado com a MsgConnect.
________________________________________________________________________
Greatis Form Designer v3.4 - Shareware ($49.95) - For D4-7 and BCB 3-6
It's a runtime form designer that allows you to move and resize any
control on your form. You don't need to prepare your form to use Form
Designer. Just drop TFormDesigner component onto any form, set Active
property to True and enjoy! >>>>>> http://www.greatis.com/formdes.htm
________________________________________________________________________
4. Alterando Diálogos Padrão do Windows
Alterando Controles dos Diálogos (Abrir/Salvar) Padrão do Windows
Por Igor Siticov
SiCOmponents: http://www.sicomponents.com
Tradução: Fabio Barreto
Pergunta: Como alterar textos como "File name:", "File type:"
e textos dos botões nos diálogos padrão do Windows?
Às vezes precisamos substituir alguns textos ou alguma outra coisa nos
diálogos de Abrir/Salvar padrão do Windows. Infelizmente, os componentes
de diálogo do Delphi não dão acesso a todos os controles localizados no
diálogos comuns do Windows, mas nós podemos fazê-lo utilizando a API do
Windows.
O exemplo a seguir mostra como alterar os controles embutidos de texto
no diálogo de Abrir.
Primeiro, nós precisamos determinar os identificadores dos controles de
diálogo. São eles:
const
LB_FILETYPES_ID = 1089; // texto "File types:"
LB_FILENAME_ID = 1090; // texto "File name:"
LB_DRIVES_ID = 1091; // texto "Look in:"
Em seguida, precisamos enviar uma mensagem para a janela de diálogo para
alterar os controles desejados- algo como:
// uses ..., Windows, CommDlg;
procedure TForm1.OpenDialog1Show(Sender: TObject);
const
LB_FILETYPES_ID = 1089;
LB_FILENAME_ID = 1090;
LB_DRIVES_ID = 1091;
Str1 = 'Quatro';
Str2 = 'Cinco';
Str3 = 'Um';
Str4 = 'Dois';
Str5 = 'Três';
begin
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
IDOK, LongInt(Pchar(Str1)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
IDCANCEL, LongInt(Pchar(Str2)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_FILETYPES_ID, LongInt(Pchar(Str3)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_FILENAME_ID, LongInt(Pchar(Str4)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_DRIVES_ID, LongInt(Pchar(Str5)));
end;
Nota: Os identificadores de diferentes caixas de diálogo e seus valores
podem ser obtidos por importação dos recursos da comctrl32.dll em
qualquer editor de recursos e visualizando-os no formato RC.
__________________
Igor Siticov é o autor de 'TsiLang Components Suite' (conjunto completo
de componentes profissionais para construção elegante, útil e amigável
de aplicações multilíngua em dois minutos) e 'Resource Builder' (editor
visual completo de scripts RC que pode ser um excelente substituto para
o 'Image Editor' e 'Resource WorkShop' da Borland para a criação e
edição de arquivos de recursos), por SiComponents: www.sicomponents.com
________________________________________________________________________
JfControls Library. Multi-language. Multi-appearance. Skins. Privileges.
More than 40 integrated and customizable components. Impressive GUI.
Centralized resources administration. Multiple programming problems
solved. For Delphi 3-2006 & C++ Builder 3-6. http://www.jfactivesoft.com
________________________________________________________________________
5. Óvos de Páscoa no Delphi - Conheça melhor seu Delphi
Por Bogdan Grigorescu [bogdang@gmx.net]
deGrigg Solutions - www.aiua.ro coming soon
Tradução: Demian Lessa
Pergunta: Existem óvos de páscoa no Delphi?
Sei que esse não é o tipo de artigo técnico que você espera encontrar
nesse boletim mas muitas pessoas perguntaram se existem "óvos de páscoa"
no Delphi. Então aqui vai:
1) No Delphi 5 (já vi funcionar em versões Entreprise sem atualização mas
acho que é o mesmo para todas) abra a tela sobre (Help|About).
2) Segure a tecla ALT e digite JEDI ou DEVELOPERS ou TEAM ou QUALITY.
3) Após as palavra DELPHI rolar para fora da tela, você verá:
- um elogio ao JEDI, Joint Endeavour of Delphi Innovators (e um link
para o site deles na tela sobre) ou
- os nomes dos desenvolvedores / equipe / QA que fizeram do Delphi um
produto tão bom
4) Enquanto a rolagem tipo "Star Wars" estiver ativa, você pode
pressionar as setas para cima ou para baixo para inverter o texto até
que ele fique totalmente de ponta-cabeça, quando então você verá a
mensagem:
"Use the Source, Luke"
__________________
Nota do Editor: O ovo de páscoa parece estar presente também em outras
versões do Delphi mas esteja atento pois já houve casos em que exceções
fatais ocorreram durante a verificação do ovo. Teste por sua conta e
risco.
________________________________________________________________________
6. Fóruns / Listas
Para juntar-se a qualquer um de nossos fóruns de discussão, a melhor
forma é assinar através da web, já que dessa forma você poderá acessar
todas as funcionalidades disponíveis no site (como alterar suas opções
de assinatura, visualizar mensagens passadas, baixar arquivos, etc.).
Um ID Yahoo! é necessário para isso e você pode adquirir o seu de forma
gratuita registrando-se como um usuário Yahoo! Mas se você não deseja
registrar-se ou se não tem acesso completo à Internet, você pode fazer
sua assinatura por e-mail (basta ter acesso a uma conta de e-mail).
* Delphi: Participe da lista de discussão do Grupo Delphi-BR e faça
parte da mais profissional lista Delphi do Brasil. Essa lista tem como
objetivo a troca de informações entre os diversos programadores Delphi
em lingua portuguesa. Aqui você encontrará grandes programadores
brasileiros dando suas contribuições para a comunidade e mantendo uma
via de comunicação entre todos os programadores Delphi brasileiros.
http://br.groups.yahoo.com/group/delphi-br/
Assinatura:
http://br.groups.yahoo.com/group/delphi-br/join
delphi-br-subscribe@yahoogrupos.com.br
* Kylix (inglês): Programação Kylix.
http://groups.yahoo.com/group/KylixGroup/
Assinatura:
http://groups.yahoo.com/group/KylixGroup/join
KylixGroup-subscribe@yahoogroups.com
* Componentes (inglês): Esse é um fórum para pesquisa/recomendação de
componentes de software (componetes VCL e CLX, objetos ActiveX, DLLs,
SOs, etc.), assim como utilitários, tutoriais, informações, etc.
http://tech.groups.yahoo.com/group/components/
Assinatura:
http://tech.groups.yahoo.com/group/components/join
components-subscribe@yahoogroups.com
* Desenvolvedores de Software (inglês): Esse é um fórum para discussões
sobre o desenvolvimento de software e para a troca de experiências de
trabalho em ambientes profissionais e comerciais. Esse não é um fórum
sobre programação; os assuntos abordados são mais gerais e
independentes de linguagem de programação.
http://tech.groups.yahoo.com/group/software-developers/
Assinatura:
http://tech.groups.yahoo.com/group/software-developers/join
software-developers-subscribe@yahoogroups.com
________________________________________________________________________
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 Utilitários
======================================
Shareware/Comercial
-------------------
* LMD-Tools 7 - by LMD Innovative
LMD-Tools is a set of more than 300 components including controls for
superior interface design, system programming, file controls, database
applications, internet-/web-components, multimedia, text/data input
(RichEdit), display of formatted text and many more. Advanced features
include transparencies, font and background effects, and HTML support.
http://www.lmdinnovative.com/products/lmdtool7/
* Object Inspector 1.2 - by Greatis Software
Object Inspector is a suite of components that includes a special
component for easy and convenient access to all published properties
and events of any component, a common inspector that can be used for
inspecting everything in your application, and a ready-to-use
component inspector that mimics the IDE Object Inspector. It has
different paint styles, as well as font and color customization
features. For Delphi 3-7 and Borland C++ Builder 5-6.
http://www.greatis.com/objinsp.htm
Freeware
--------
* MsgConnect - By EldoS Group and TamoSoft - License: GPL/Commercial
MsgConnect is a cross-platform protocol-independent communication
framework designed to simplify the task of building peer-to-peer and
client-server applications and middleware components. MsgConnect takes
care of a wide range of low-level technical tasks, letting developers
concentrate on the business logic of the application.
http://www.msgconnect.com
* PGP Components for Delphi v3.3.2 - by Michael in der Wiesche (source)
Provides a direct interface from Delphi 2-7 to PGP 6.5.x, 7.x or 8.x.
Capabilities: Encode and decode (encrypt/decrypt/sign/verify); Create
and verify file detached signatures; Import, export, revoke and delete
keys; Several key management functions; Key generation (DH/DSS, RSA);
Keyserver functions; Utilities.
http://home.t-online.de/home/idw.doc/PGPcomp.htm
* TurboPower Async Professional v4.06 - by TurboPower (with source)
A comprehensive communications toolkit, it provides direct access to
serial ports, TAPI, and the MS Speech API. It supports fax, terminal
emulation, VOIP, & more.
https://sourceforge.net/projects/tpapro/
* TurboPower FlashFiler v2.13 - by TurboPower (with source)
A client-server database for Delphi and C++Builder. It features a
component-based architecture and the server engine can be embedded in
your applications. FlashFiler is easy to configure, performs well and
includes SQL support.
https://sourceforge.net/projects/tpflashfiler/
* TurboPower Orpheus v4.06 - by TurboPower (with source)
An award-winning UI toolkit for Delphi and C++Builder. It contains
over 120 components covering everything from data entry to calendars
and clocks. Other components include an Object Inspector, LookOut bar,
and report views.
https://sourceforge.net/projects/tporpheus/
* TurboPower Internet Professional v1.15 - by TurboPower (with source)
A set of VCL components providing Internet connectivity for Delphi and
C++Builder. Includes POP3, SMTP, NNTP, FTP, HTTP, Instant Messaging
and HTML viewer as well as components for low-level socket access.
https://sourceforge.net/projects/tpipro/
* TurboPower Essentials v1.11 - by TurboPower (with source)
Contains 13 native VCL controls for Delphi and C++Builder. They
include drop-down calendars and calculators, roll-up dialogs, 3D
labels, tiled backgrounds, scrolling messages, menu buttons and more.
https://sourceforge.net/projects/tpessence/
* TurboPower ShellShock v1.02 - by TurboPower (with source)
Provides a set of components that let you customize applications with
the functionality available in the Windows Shell and Windows Explorer,
all without writing code. The components are written in native VCL for
Delphi and C++Builder.
https://sourceforge.net/projects/tpshellshock/
* TurboPower LockBox v2.07 - by TurboPower (with source) (DELPHI/KYLIX)
A cross-platform toolkit for data encryption. It contains routines and
components for use with Delphi, C++Builder and Kylix. It provides
support for Blowfish, RSA, MD5, SHA-1, DES, triple- DES, Rijndael and
digital signing of messages.
https://sourceforge.net/projects/tplockbox/
* TurboPower B-Tree Filer v5.55 - by TurboPower (with source)
A fast library of file-based database routines for Turbo Pascal and
Delphi. Supports stand-alone programs or those running on Microsoft-
compatible networks including Novell Netware.
https://sourceforge.net/projects/tpbtreefiler/
* TurboPower OnGuard v1.13 - by TurboPower (with source)
A library to create demo versions of your Delphi and C++Builder
applications. Create demo versions that are time-limited, feature-
limited, limited to a certain number of uses, or limited to a certain
number of concurrent network users.
https://sourceforge.net/projects/tponguard/
* TurboPower String Resource Manager v1.0.4 - by TurboPower (w/source)
A tool for building string resource libraries in Delphi. It prevents
string resource clashes + simplifies translation of string resources.
https://sourceforge.net/projects/tpsrmgr/
* TurboPower Async Professional CLX v1.01 - TurboPower (source) (KYLIX)
A comprehensive communications toolkit for Borland Kylix. It provides
direct access to serial ports, and supports terminal emulation, file
transfer protocols and much more.
https://sourceforge.net/projects/tpaproclx/
* Drag and Drop Component Suite 3.7 - by Angus Johnson and Anders
Melander (with source)
Enables COM drag-and-drop of files, folders, text, bitmaps and URLs
between applications. Copy, move and link operations. Clipboard
support. Drag image support. Automatic scrolling of the target window
during the drag operation. Relatively simple to derive custom drag-
and-drop components to support other data formats.
http://www.torry.net/vcl/system/draganddrop/DragDrop0402.zip
* TMPAnimatedCursors - by Markus Stephany (with source)
A component to manage + use animated cursors within your applications.
http://www.mirkes.de/en/delphi/vcls.php
* TukangOmong 0.0.1 (with source)
Indonesia Text-to-Speech Engine.
http://www.kioss.com/kioss/proyek.php?nama=aTukangOmong
Artigos, Dicas e Truques
========================
* IntraWeb: A New Way to the Web - by Cary Jensen
IntraWeb is a framework and component set that permits you to quickly
and easily build interactive Web sites using Delphi, Kylix or
C++Builder and it may very well change the way you develop Web
applications from now on.
http://community.borland.com/article/0,1410,29650,00.html
* WebSnap Tips and Tricks - by Nick Hodges
Nick shares some of his tips and tricks to make WebSnap do the things
you need it to do.
http://community.borland.com/article/0,1410,29537,00.html
* Web Services Training: Free Trial! - by Anders Ohlsson
You may not know this, but Borland has an *awesome* Web Services
training CD for sale. And a free teaser for it.
http://community.borland.com/article/0,1410,28381,00.html
* Protect your Delphi Software - by Zarko Gajic
Want to know more about the issues surrounding the protection of your
Delphi applications from any unauthorized usage?
http://delphi.about.com/library/weekly/aa012803a.htm
* "The Big Brother" Delphi Code Toolkit 2 - by Zarko Gajic
Taking control over the system - the Delphi way. Disabling Windows
system keys, Windows shell elements - this time using dWinLock Delphi
component.
http://delphi.about.com/library/weekly/aa012103a.htm
* Top 6 Testing and Debugging Tools - by Zarko Gajic
If you're looking for the best Delphi testing and debugging tools,
look no further. The list contains tools to help you speed up your
development by finding possible bugs, memory leaks, etc.
http://delphi.about.com/od/toppicks/tp/aatpdebug.htm
* Learn the Security Ropes for .NET with this Book - by Lamont Adams
Review of ".NET Security" by Jason Bock, Pete Stromquist, Tom Fischer,
and Nathan Smith.
http://builder.com.com/article.jhtml?id=u00320030109adm01.htm
* How to detect if an application is being debugged - by m3Rlin
www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=214
* How to get the date a file was last accessed - by m3Rlin
www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=215
* Link Label Component - by Daniel Wischnewski
A simple label component for links to web pages, Email, etc.
http://www.delphi3000.com/articles/article_3511.asp
* Extract field from DataSet into TStringList - by Stewart Moss
Component to extract a specific field from a dataset in a TStringList.
Useful for populating TlistBoxes that you dont want to be data aware.
http://www.delphi3000.com/articles/article_3512.asp
* D6 + ADO + SQLServer Convert to Oracle Backend ???? - by Hans Pieters
http://www.delphi3000.com/articles/article_3513.asp
* Save DataSet as CSV Textfile - by Kjetil Rodal-Jalasto
Procedure that saves the content of a DataSet as a CSV textfile, works
fine with both BDE and DBExpress datasets.
http://www.delphi3000.com/articles/article_3514.asp
* Distributed Applications, the easy way II - by Eugene Mayevski
Is there a way to have a flexible data exchange system and don't go to
deep into technical details? This second part of the article describes
basics of MsgConnect usage.
http://www.delphi3000.com/articles/article_3515.asp
* OLE Drag and Drop Delphi Overview - by Herbert Poltnik
http://www.delphi3000.com/articles/article_3520.asp
* Multi Socket Port Scanner - by guy gafni
http://www.delphi3000.com/articles/article_3521.asp
* Adjust a TWinControl's size at RunTime - by quark quark
http://www.delphi3000.com/articles/article_3523.asp
* Delphi ActiveX/Midas Development Hints - by Herbert Poltnik
This document provides a basis for developing multi-tier database
applications that have zero client configuration administration.
http://www.delphi3000.com/articles/article_3524.asp
* Duplicating a Database Record - by Andrew Baylis
http://www.delphi3000.com/articles/article_3525.asp
* Pass a recordset from COM object to ASP VBScript - by Bernhard Angerer
How to return a resultset (dataset) from COM to ASP.
http://www.delphi3000.com/articles/article_3527.asp
* Messing with other applications memory - by Colin Myerscough
http://www.delphi3000.com/articles/article_3528.asp
* Creating a system wide shortcut or hotkey - by Jim McKeeth
http://www.delphi3000.com/articles/article_3529.asp
* How to create a thumbnail from a JPEG image - by Rafael Cotta
http://www.delphi3000.com/articles/article_3530.asp
* OLE Drag and Drop - by Herbert Poltnik
How to drop an email from Outlook into a Delphi form.
http://www.delphi3000.com/articles/article_3533.asp
* Automation Interface Confusions Straightened Out - by Graham Wideman
Interfaces, dispinterfaces, variants, IDispatch, etc.
http://www.wideman-one.com/gw/tech/Delphi/autointf/index.htm
* Understanding Delphi COM (OLE) Interface References, AddRef and All
That - by Graham Wideman
COM References Reference Counting, AddRef and Release, and a test
application to demonstrate how it really works.
http://www.wideman-one.com/gw/tech/Delphi/dragdrop/comrefs/index.htm
* Notes on Delphi Constructors and Destructors - by Graham Wideman
Constructors and Destructors: Virtual or not?
http://www.wideman-one.com/gw/tech/Delphi/ConstDest.htm
* Delphi ActiveX Controls: Unusable in MS Office Document Pages - by
Graham Wideman
Click and paint Problems when single-component ActiveX control
inserted is in Office document pages.
http://www.wideman-one.com/gw/tech/Delphi/dax/index.htm
* Delphi ActiveForm Controls: Clipping bug on scrolled pages ...with
plausible solution... - by Graham Wideman
ActiveForm clipping problem in Office document pages.
http://www.wideman-one.com/gw/tech/Delphi/dax/afxclipbug.htm
* Hardware I/O Port Programming with Delphi and NT - by Graham Wideman
Delphi I/O Port Programming under Windows NT and an I/O Port Map
Manipulator driver (gwiopm.sys).
http://www.wideman-one.com/gw/tech/Delphi/iopm/index.htm
* Precision Timing Under Windows Operating Systems - by Graham Wideman
Measuring Time, and Scheduling Routines under Windows. Checking the
Scheduler granularity. Numerous references.
http://www.wideman-one.com/gw/tech/dataacq/wintiming.htm
* Multitasking discussion - by Graham Wideman
Basics of Processes, Threads, Time Slices and Priority
http://www.wideman-one.com/gw/tech/dataacq/multitasking.htm
* Observing the Timing Behavior of Applications in Windows 95/98/NT
Using LabVIEW - by Graham Wideman
How well can applications that you write in LabVIEW or other languages
perform under Windows OSes? Does LV use Special Magic or simply make
most judicious used of the OS timing services?
http://www.wideman-one.com/gw/tech/dataacq/labview/index.htm
Tutoriais
=========
* .NET Remoting - by Alain "Lino" Tadros
This article explains and demonstrates the .NET Remoting framework and
builds Remotable Objects, Hosting servers and Clients to exercise the
different activation models.
http://community.borland.com/article/0,1410,29563,00.html
* Maximize DataSnap efficiency in Delphi - by Bob Swart
This tutorial is mainly concerned about the data throughput bottleneck
between the DataSnap Server and Client, including ways to prevent it
by limiting the amount of data being sent. But, before you can limit
throughput you have to measure it.
http://builder.com.com/article.jhtml?id=u00220030117swa01.htm
* Tweak App Performance with Index Tuning Wizard - by Eric Roland
Debugging is a critical aspect of any development project. SQL Server
provides the Profiler tool and the Index Tuning Wizard to aid you in
the search for rogue code in your applications.
http://builder.com.com/article.jhtml?id=u00320021220ero01.htm
* .NET Demystifies Encryption - by William Dawson
.NET makes cryptography a little simpler by putting everything into
one SDK. Find out how to encrypt and decrypt a text file with the
System.Security.Cryptography namespace. Code in C# but good tutorial.
http://builder.com.com/article.jhtml?id=u00220030120wdx01.htm
* OLE Drag and Drop In Delphi - by Graham Wideman
Comprehensive tutorial with source code examples.
http://www.wideman-one.com/gw/tech/Delphi/dragdrop/index.htm
Outros Links
============
* Borland Rolls Out Branding Effort - by Scott Van Camp
Borland Software Corp., a company considered dead in the water in the
mid-1990s but now in the midst of a comeback, has launched a $12
million ad campaign to reintroduce the Borland brand.
http://www.technologymarketing.com/mc/news/
article_display.jsp?vnu_content_id=1807206
________________________________________________________________________
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/p0043.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) 2003 por Ernesto De Spirito. Todos os direitos reservados.
________________________________________________________________________
|