PROBLEMA COM SHELLEXECUTE
Olá Pessoal!
Estou com um problema há três dias que não consigo resolver. Minha tabela possui uma coluna (Blob) onde armazeno pequenos arquivos de "pdf". Desta forma eu dou um "shellexecute" e ele abre o anexo. Até aqui perfeito! Entretanto, quando eu fecho o anexo (pdf) e volto pra tela do meu sistema, todos os dados da minha grid somem. Alguma coisa acontece com o ponteiro que eu não consigo saber o que é? Já aconteceu isso com alguém?
Por favor me ajudem!
Rafael
Estou com um problema há três dias que não consigo resolver. Minha tabela possui uma coluna (Blob) onde armazeno pequenos arquivos de "pdf". Desta forma eu dou um "shellexecute" e ele abre o anexo. Até aqui perfeito! Entretanto, quando eu fecho o anexo (pdf) e volto pra tela do meu sistema, todos os dados da minha grid somem. Alguma coisa acontece com o ponteiro que eu não consigo saber o que é? Já aconteceu isso com alguém?
Por favor me ajudem!
Rafael
Rafael Ribeiro
Curtidas 0
Respostas
Eriley Barbosa
05/08/2010
Onde está abrindo a tabela que preenche a grid, passe o cóigo que está utilizando para abrir os arquivos, pois, está acontecendo de sua tabela estar sendo fechada.
Atenciosamente
Eriley
GOSTEI 0
Rafael Ribeiro
05/08/2010
ERILEY, BOM DIA!
PARA INCLUSIVE NÃO PERDER O PONTEIRO, EU CLONEI O CLIENTDATASET E O CÓDIGO FICOU O SEGUINTE:
[CODE]
procedure TFrmAvisoProcesso.btn1Click(Sender: TObject);
var Retorno: Integer;
Param: PChar;
DefDir: PChar;
CdsClone: TclientDataSet;
begin
CdsClone:= TclientDataSet.Create(nil);
try
CdsClone.CloneCursor(DM.CDSAVISOPROC, false, false);
// Executa alguma operação no clone
Nome_Arquivo := CdsClone.FieldByName('FILENAME').asString;
try
//cria uma pasta temporária para abrir arquivo gravado na base de dados.
ForceDirectories('C:\temp\');
//salva e abre arquivo
TBlobField(CdsClone.FieldByName('ANEXO')).SaveToFile(
'C:\temp\' + Nome_Arquivo);
//abre arquivo requisitado - usa função ShellExecute, da API do Windows (unit ShellAPI)
Param:= nil;
DefDir:= nil;
//FrmAvisoProcesso.WindowState := wsMinimized;
Retorno := ShellExecute(Handle,'open',
PChar('C:\temp\' + Nome_Arquivo),
'','',SW_SHOWNORMAL);
if Retorno <= 32 then
ShowMessage('ShellExecute: Erro ao abrir arquivo ' +
'C:\temp\' + Nome_Arquivo);
except
ShowMessage('Esta Idéia Não Possui Anexo!');
end;
finally
CdsClone.Free
end;
end;
[CODE]
GRATO!!!
PARA INCLUSIVE NÃO PERDER O PONTEIRO, EU CLONEI O CLIENTDATASET E O CÓDIGO FICOU O SEGUINTE:
[CODE]
procedure TFrmAvisoProcesso.btn1Click(Sender: TObject);
var Retorno: Integer;
Param: PChar;
DefDir: PChar;
CdsClone: TclientDataSet;
begin
CdsClone:= TclientDataSet.Create(nil);
try
CdsClone.CloneCursor(DM.CDSAVISOPROC, false, false);
// Executa alguma operação no clone
Nome_Arquivo := CdsClone.FieldByName('FILENAME').asString;
try
//cria uma pasta temporária para abrir arquivo gravado na base de dados.
ForceDirectories('C:\temp\');
//salva e abre arquivo
TBlobField(CdsClone.FieldByName('ANEXO')).SaveToFile(
'C:\temp\' + Nome_Arquivo);
//abre arquivo requisitado - usa função ShellExecute, da API do Windows (unit ShellAPI)
Param:= nil;
DefDir:= nil;
//FrmAvisoProcesso.WindowState := wsMinimized;
Retorno := ShellExecute(Handle,'open',
PChar('C:\temp\' + Nome_Arquivo),
'','',SW_SHOWNORMAL);
if Retorno <= 32 then
ShowMessage('ShellExecute: Erro ao abrir arquivo ' +
'C:\temp\' + Nome_Arquivo);
except
ShowMessage('Esta Idéia Não Possui Anexo!');
end;
finally
CdsClone.Free
end;
end;
[CODE]
GRATO!!!
GOSTEI 0
Eriley Barbosa
05/08/2010
Pois é no clone você ta dando Free:
finally
CdsClone.Free; Ai este Dataset não está aberto mais. Tem que ver se quando você faz isso: CdsClone.CloneCursor(DM.CDSAVISOPROC, false, false);
Não ta fechando o DM.CDSAVISOPROC, se este dataset não estiver fazendo nenhuma pesquisa, bastaria você reabrilo novamente, aqui: finally
CdsClone.Free; if not (DM.CDSAVISOPROC.Active) then DM.CDSAVISOPROC.Open;
end;
Mas o bom é que você pudesse coloca este código no onActivate do form: if not (DM.CDSAVISOPROC.Active) then DM.CDSAVISOPROC.Open; Atenciosamente Eriley
CdsClone.Free; Ai este Dataset não está aberto mais. Tem que ver se quando você faz isso: CdsClone.CloneCursor(DM.CDSAVISOPROC, false, false);
Não ta fechando o DM.CDSAVISOPROC, se este dataset não estiver fazendo nenhuma pesquisa, bastaria você reabrilo novamente, aqui: finally
CdsClone.Free; if not (DM.CDSAVISOPROC.Active) then DM.CDSAVISOPROC.Open;
end;
Mas o bom é que você pudesse coloca este código no onActivate do form: if not (DM.CDSAVISOPROC.Active) then DM.CDSAVISOPROC.Open; Atenciosamente Eriley
GOSTEI 0
Rafael Ribeiro
05/08/2010
ERILEY, BOM DIA!
O CDSCLONE FOI MINHA ÚLTIMA TENTATIVA. MESMO SEM USÁ-LO, O PROBLEMA OCORRE MESMO SEM USAR O CLONE. CARAMBA JÁ ESTÁ ME DANDO DESESPERO.
O CDSCLONE FOI MINHA ÚLTIMA TENTATIVA. MESMO SEM USÁ-LO, O PROBLEMA OCORRE MESMO SEM USAR O CLONE. CARAMBA JÁ ESTÁ ME DANDO DESESPERO.
GOSTEI 0
Eriley Barbosa
05/08/2010
Que tal tentar utilizar os BookMark, veja um exemplo no link abaixo:
https://www.devmedia.com.br/articles/post-3260-Dicas-BookMarks-no-Delphi.html
Atenciosamente
Eriley
GOSTEI 0
Emerson Nascimento
05/08/2010
será que você não está desligando a comunicação entre o dataset e o dataware (disablecontrols) e esquecendo de religá-la?
publique seu código original.
publique seu código original.
GOSTEI 0