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


Copyright © 2007 AFL Sistemas. All rights reserved.