Solução para os erros do BDE relacionados a memória ($210D, $2500, $2501)

Posted by Adalberto on August 17th, 2009
Abaixo uso dois erros comuns em aplicações BDE, principalmente em SOs mais novos como Windows Vista e 2008 Server.
Erro: Conflito de compartilhamento de memória (Shared memory conflict – $210D)
Problema: O BDE está tentando usar um endereco de memoria que já está em uso pelo SO ou outra aplicação.
Solução:
1) Fechar todas aplicações BDE;
2) Executar o Administrador do BDE (Adm BDE) pelo “Painel de Controle” ou procurar o arquivo BDEADMIN.EXE (Adm BDE), este arquivo, normalmente, fica em algum diretório em “\Arquivos de Programas\Borland…”.
3) Ao carregar Adm BDE clique na aba “Configuration”;
4) Há um item na árvore, no lado esquerdo da tela do Adm BDE, chamado “Configuration”. Se não estiver expandido, expanda-o;
5) Depois, expanda “System”. Abaixo do “System”, selecione “INIT”.
6) Na janela ao lado direito, procure o parâmetro chamado “SHAREDMEMLOCATION”. Mude o valor para “5BDE”.
7) Depois, clique na palavra “Object” na barra de menu da janela principal e selecione “Apply”.
8) Responda “OK” para a confirmação de “Save all edits…” (Salvar todas alterações).
Erro: Memória insuficiente para esta operação (Insufficient memory for this operation – $2501)
Problema: Sua aplicação (ou outra aplicação BDE) consumiu a memória reservada para o BDE.
Solução:
1. Fechar todas aplicações BDE;
2. Executar o Administrador do BDE (Adm BDE) pelo “Painel de Controle” ou procurar o arquivo BDEADMIN.EXE (Adm BDE), este arquivo, normalmente, fica em algum diretório em “\Arquivos de Programas\Borland…”.
3. Execute o Adm BDE e clique na aba “Configuration”.
4. Há um item na árvore, no lado esquerdo da tela do Adm BDE, chamado “Configuration”. Se não estiver expandido, expanda-o;
5. Depois, expanda “System”. Abaixo do “System”, selecione “INIT”.
6. Na janela ao lado direito, procure o parametro chamado “SHAREDMEMSIZE”. Mude o valor para 4096.
7. Depois, clique na palavra “Object” na barra de menu da janela principal e selecione “Apply”.
8. Responda “OK” para a confirmação de “Save all edits…” (Salvar todas alterações).
Agora você pode tentar iniciar a aplicação novamente. Se ainda tiver problemas para rodar a aplicação e você estiver rodando ela em Windows NT, 2000 ou superior, abaixo tem algumas instruções sobre, mas desta vez deixe a propriedade “SHAREDMEMSIZE” com 4096, e altere a propriedade “SHAREDMEMLOCATION” para “0×5BDE”.
Então aplique as alterações antes e tente rodar novamente sua aplicação. Se o mesmo erro permanecer  tente alterar a propriedade “SHAREDMEMSIZE” para 8192. Se o erro persistir, você pode tentar informar “0×6BDE” para a propriedade “SHAREDMEMLOCATION”. Se ainda assim o erro persistir, você pode tentar outro valor para a propriedade “SHAREDMEMLOCATION”, conforme o intervalo exposto abaixo.
Outros valores podem ajudar a resolver este problema, são eles: 1000, 7000, and 7F00. Se nenhum desses valores resolverem, você pode tentar 2000, 3000, 4000, etc. ou qualquer valor dentro dos intervalos especificados para cada sistema operacional:
Windows 95/98: SHAREDMEMLOCATION = 9000 to FFFF
Windows NT/2000/2003/Vista/2008: SHAREDMEMLOCATION = 1000 to 7F00

Em experiência reportadas por outros usuários foi necessário remover ou desabilitar o driver da placa de som no Windows NT/2000/2003/Vista/2008 para resolver o problema, mas nomalmente somente “realocando” o pool de memória usado pelo BDE na propriedade SHAREDMEMLOCATION já é

o suficiente.

Fala ai pessoALL!

Abaixo uso dois erros comuns em aplicações BDE, principalmente em SOs mais novos como Windows Vista e 2008 Server, para exemplificar a parametrização de memória do BDE.

Read the rest of this entry »

Dica: Limpar Edit no Delphi em execução

Posted by Daniel Buona on April 9th, 2009

Uma coisa que sempre vejo os programadores quebrando a cabeça é para “limpar” os campos em tela na execução.

Com o código abaixo conseguiremos manipular os valores dos edits no form.

Mãos a massa.

No form que vocês querem efetuar a limpeza dos edits, insira um Button e implemente o seguinte código no click:

procedure TForm1.Button1Click(Sender: TObject);
  procedure LimparEdits(AControl: TComponent);
  var
     vLoop: Integer;
  begin
     for vLoop := 0 to AControl.ComponentCount-1 do // ComponentCount retorna a qtde de componentes que o
     begin                                          // o parent é o AControl, ou seja, somente os componentes que
        { Se for um componente do tipo TEdit, }     // estão ligados a ele
        { então iremos limpar o conteúdo, caso }
        { contrário, iremos rechamar a procedure }
        { pois o AControl pode ser um painel e temos }
        { que limpar inclusive os edits do painel }
        if AControl.Components[vLoop].ClassType = TEdit then
           TEdit(AControl.Components[vLoop]).Clear // Aqui utilizamos o Cast para obter as propriedades e métodos do edit }
        else
           LimparEdits(AControl.Components[vLoop]);

     end;
  end;

begin

  LimparEdits(Self); // O processo irá iniciar limpando os edits que estão diretamente
                     // docados no form
end;

Dica: Atribuir valores a input do WebBrowser

Posted by Daniel Buona on April 7th, 2009

Pessoal, boa noite!
Na dica de hoje iremos aprender como jogar valores para “inputs” dentro de um WebBrowser.

Imagine a seguinte situação (real): seu cliente solicita que seja efetuada a consulta de um determinado CNPJ no SINTEGRA de São Paulo, para um CNPJ conhecido pelo sistema? A principio você criaria uma novo form com o componente WebBrowser acessando a página solicitada:

WebBrowser.Navigate(’http://pfeserv1.fazenda.sp.gov.br/sintegrapfe/sintegra.html’)

Agora, como atribuir o CNPJ e Insc.Estadual nos devidos campos?
Com esse código você fará isso facilmente.
No evento onDocumentComplete do WebBrowser você implemente:

var
	FormItem: Variant;
	Field: Variant;
	FieldName: String;
	I,J: Integer;
begin
	if WebBrowser.OleObject.Document.all.tags(’FORM’).Length = 0 then
		Exit;

	for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
	begin
		FormItem := WebBrowser.OleObject.Document.forms.Item(I);
		try
			for j := 0 to FormItem.Length - 1 do
			begin
				//Identifica o campo e seu nome no formulário
				Field := FormItem.Item(j);
				FieldName := Field.Name;

				if FieldName = ‘cnpj’ then // nome do input para o campo CNPJ
					Field.Value := edtCNPJ.Text;
				if FieldName = ‘ie’ then // nome do input para o campo Inscr.Estadual
					Field.Value := edtIE.Text;
			end
		except
			ShowMessage(’Não foi possível identificar os campos para atribuir os valores de CNPJ e IE’);
		end;
	end;
end

Uma observação, para a atribuição no campo, você precisará identificar o ID do input na página.

Abraços e até a próxima

Desvendando “Class Helpers”

Posted by Daniel Buona on April 6th, 2009

Um Class Helper é um tipo que – quando associada à outra classe – introduz métodos adicionais e propriedades que podem ser utilizadas em no contexto da classe associada (ou seus descendentes).

Essa nova característica da linguagem e do compilador Delphi (2006, 2007 e 2009) é poder estender novas funcionalidades em classes já existentes, podendo assim adicionar novos métodos e propriedades sem ter que criar uma nova classe herdando.

Um exemplo que já diz tudo

Imagino que vocês são como eu, preferem a prática do que a teoria, portanto, mãos a obra =D
Nesse exemplo iremos extender uma nova funcionalidade para a classe TStringList, onde ela poderá aceitar valores inteiros no método ADD.

Uma forma de utilização seria

Abraços, e até a próxima

MapiSendMail no Windows Mail (Vista e 2008)

Posted by Adalberto on February 16th, 2009

Bom diALL!

Você possui aplicações que enviavam normalmente e-mails utilizando o MapiSendMail e agora na plataforma Vista não enviam mais?

Fique calmo meu caro, a solucao é mais simples do que o esperado.

Na plataforma Vista não vem uma chave de registro denominada “Windows Messaging Subsystem”, esta chave define alguns valores para a utilização do envio de e-mail pelo arquivo MAPI32.DLL.

Nesta chave estão as configurações de acesso a DLL citada bem como as configurações de aplicações que gerenciam e-mails que podem ser utilizadas pelo MapiSendMail.

Para facilitar as coisas este link é para o arquivo REG com a criação da chave acima e configurações necessárias:  http://www.aflsistemas.com.br/downloads/WindowsMessagingSubsystem.reg *.

* Para fins didáticos o arquivo já está configurado para utilização do Thunderbird, o conteúdo do arquivo pode ser alterado para “Microsoft Outlook”, caso necessário, através de um editor de texto simples (notepad, p.e.).

Feito isso, seu problema de “Ocorreu erro no procedimento de envio de e-mail”, estará solucionado! Desde que seja realmente só isso… rs… :)

Abraços e até a próxima…

Beto Lima


Copyright © 2007 AFL Sistemas. All rights reserved.