Boletim Pascal #43
Os exemplos do código fonte desta edição estão disponíveis para download.
![]() |
![]() |
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.sedlan.com/dbgrid_footer.php * 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://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium ________________________________________________________________________ 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-7 and 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://groups.yahoo.com/group/components/ Assinatura: http://groups.yahoo.com/group/components/join components-subscribe@yahoogroups.com * Desenvolvedores de Software (inglês): Esse é um fórum para discussões sobre o desenvolvimento de software e para a troca de experiências de trabalho em ambientes profissionais e comerciais. Esse não é um fórum sobre programação; os assuntos abordados são mais gerais e independentes de linguagem de programação. http://groups.yahoo.com/group/software-developers/ Assinatura: http://groups.yahoo.com/group/software-developers/join software-developers-subscribe@yahoogroups.com ________________________________________________________________________ 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 6.1 - 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.ceberus.com/lmd/products/lmdtool6/index.php3 * 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/dragdrop.exe * 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/cs/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.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/delphi/links/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 São alguns segundos para você que REALMENTE significam muito para nós. Não esqueça que também precisamos de artigos para os boletins e que existe um prêmio para um dos autores em cada número (em inglês). Todos os artigos serão considerados mas nós estamos particularmente interessados em artigos sobre Kylix já que existe pouco material disponível online. * Envie seu artigo em inglês para pascal-newsletter-owner@yahoogroups.com * Envie seu artigo em português para boletim-pascal-owner@yahoogrupos.com.br ________________________________________________________________________ Se você não recebeu o código fonte completo dos exemplos neste número, você pode obtê-los em http://www.latiumsoftware.com/br/pascal/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. ________________________________________________________________________ |
Os exemplos do código fonte desta edição estão disponíveis para download.
![]() |
Erros? Omissões? Comentários? Por favor contate-nos!






