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






