Ir para conteúdo
Fórum Script Brasil
  • 0

Dbimage - (RESOLVIDO)


Paulo Nobre

Pergunta

Prezados Colaboradores,

Dizem que para colocar uma imagem no DBImage, num banco de dados(é claro),

isto pode ser feito em tempo de execução da seguinte maneira:

Copiar uma figura e em seguida colá-la(ctrl+ V) quando o componente ganhar o

foco. Tentei fazer isto mas não acontece nada, não consigo colar nenhuma

figura seja, bmp ou jpg(que acho que nem pode). Em fim, nada.

Alguém sabe o que está acontecendo?

Está tudo configurado corretamente, eu acho. Já que as outras informações

que chegam da tabela estão corretas. A tabela foi criada como paradox 7 e o

campo fotografia como type G .

Obrigado

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

  • 0

uses ClipBoard;

procedure TForm1.DBImage1KeyPress(Sender: TObject; var Key: Char);

begin

if (Key = #22) and Clipboard.HasFormat(CF_PICTURE) then

begin

DBImage1.Picture.Assign(Clipboard);

DBImage1.Stretch := true;

DBImage1.Refresh;

end;

end;

Obs: O picture será um TBitmap; se quiser modificá-lo p/ Jpeg(menor espaço), também é possível.

Link para o comentário
Compartilhar em outros sites

  • 0

Infelizmente, s3c, a dica não está funcionando.

Mesmo colocando uses clipbrd não funciona.

A propósito #22 corresponde a qual tecla?

obrigado

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

  • 0

Mas, printscreen não vai capturar a imagem da tela?

A propósito, tenho que acionar alguma propriedade do form?

Pergunto isto pois, no VB, para usar o evento keypress,no form existe a propriedade keypress que deve ser colocada como true.

Link para o comentário
Compartilhar em outros sites

  • 0

Print Screen foi só um exemplo para ver se o código funciona.

Qualquer imagem copiada p/ área de transferência, o clipboard fica com o formato CF_PICTURE.

você não queria colar a imagem quando o DBImage ganhasse o foco?

Pois bem, coloque aquele código no evento onKeyPress do DBImage.

Não precisa setar o KeyPreview do Form porque é o DBImage que "verá" a tecla digitada.

Link para o comentário
Compartilhar em outros sites

  • 0

O DBImage está com o foco?

Crie uma imagem pelo paintbrush, depois Edit/Select All/Copy.

Depois clique no DBImage e aperte Ctrl+v.

Se não funcionar, rode pelo Delphi e coloque um breakpoint no begin do evento onKeyPress e veja se ele executa as instruções.

Link para o comentário
Compartilhar em outros sites

  • 0

s3c, fiz de novo,os testes que você falou e ficou o seguinte:

-Criando uma imagem com o paint, selecionando tudo e fazendo CTRL+C FUNCIONA.

-mandando um bpm por ctrl+ c, via explorer, NÃO funciona.

-Abrindo a figura no paint, mandando selecionar tudo, copiando, FUNCIONA.

-fazendo print screen FUNCIONA.

Ou seja, funciona da maneira que não interessa.

Não estou entendendo o que está acontecendo.

O programa é simplíssimo. Coloquei o código como você falou. Só tem uma UNIT

Veja abaixo:

unit UAgenda;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Mask, DBCtrls, Buttons, ExtCtrls, DB, DBTables,clipBrd;

type

TfrmAgenda = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

txtNome: TDBEdit;

txtEndereco: TDBEdit;

txtTelConvencional: TDBEdit;

txtTelCelular: TDBEdit;

txtEmail: TDBEdit;

Label6: TLabel;

txtComentarios: TDBMemo;

cmdSair: TSpeedButton;

DBNavigator1: TDBNavigator;

Table1: TTable;

DataSource1: TDataSource;

DBImage1: TDBImage;

procedure cmdSairClick(Sender: TObject);

procedure DBImage1KeyPress(Sender: TObject; var Key: Char);

{ Private declarations }

public

{ Public declarations }

end;

var

frmAgenda: TfrmAgenda;

implementation

//Uses

//clipbrd;tinha colocado aqui achando que o erro poderia ser este.

{$R *.dfm}

procedure TfrmAgenda.cmdSairClick(Sender: TObject);

begin

Close;

end;

procedure TfrmAgenda.DBImage1KeyPress(Sender: TObject; var Key: Char);

begin

If (key =#22) and clipboard.HasFormat(CF_Picture) Then

begin

DBImage1.Picture.Assign(Clipboard);

DBImage1.Stretch := True;

DBImage1.Refresh;

end;

end;

end.

De qualquer forma muito obrigado

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, isso quer dizer que se o Clipboard está com uma imagem, você consegue colar

no DBImage certo?

O que não funciona é o Ctrl+c via explorer.

Então me diga como você está querendo captar a imagem para colá-la no DBImage.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, neste caso vamos às utilíssimas Apis.

Modifique o evento onKeyPress desse jeito:

var s:String[128];

begin

if Key <> #22 then

Exit;

if Clipboard.HasFormat(CF_HDROP) then

begin

OpenClipboard(Handle);

try

DragQueryFile(GetClipboardData(CF_HDROP), 0, @s, 128);

DBImage1.Picture.LoadFromFile(StrPas(@s));

finally

CloseClipboard;

end;

end

else

if Clipboard.HasFormat(CF_PICTURE) then

DBImage1.Picture.Assign(Clipboard);

DBImage1.Stretch := true;

DBImage1.Refresh;

end;

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigados3c funcionou.

Essas APIs que você fala são as API internas do windows?

por que não e necessário declará-las?

Elas já estão em alguma USES?

Esse @ significa o quê?

Se em algum momento, sem querer abusar, você puder explicar um pouquinho o código, agradeceria.

MUITO OBRIGADO

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, são as Apis do Windows.

Não é necessário declará-las quando já estão declaradas em algum uses, ou seja, em algum .pas

Por exemplo, a Api GetClipboardData é uma função da user32.dll do Windows e já está declarada no Windows.pas; logo quando você coloca Windows na cláusula uses, não precisa declarar a Api.

A Api DragQueryFile está na shell32.dll do Windows e está declarada na ShellApi.pas, por isso você coloca uses ShellApi p/ ter acesso a ela, senão você teria que declará-la implicitamente na sua aplicação.

Quando você marca um arquivo ou pasta e digita Ctrl+c, o clipboard fica no formato CF_HDROP. É por isso que é testado Clipboard.HasFormat(CF_HDROP).

A DragQueryFile retorna o(s) caminho(s) dos arquivos ou pastas copiados para o clipboard. Seus parâmetros são:

1-Handle da estrutura de dados(obtido pela Api GetClipboardData(CF_HDROP).

2-Índice do arquivo ou pasta marcado - 0,1,2... Utilizei 0 presumindo que você tenha dado Ctrl+c somente em um arquivo.

3-Ponteiro do buffer que conterá a informação. Utilizei @s indicando um ponteiro para um buffer de 128 bytes, mas você poderia utilizar um PChar, só que você teria que alocar memória para ele (p := AllocMem(128)) e depois liberá-la (FreeMem(p)

4-Tamanho desse buffer.

Com isto, você obtém o caminho do arquivo de imagem dentro do clipboard; depois o próprio Delphi se encarrega de exibí-la pelo LoadFromFile.

As Apis são recursos p/ você interagir diretamente com o sistema operacional, mas elas tem um preço, se você migrar p/ Linux com o Kylix, pode esquecê-las.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Corposemalma, eu não me aprofundo muito em APis, quando vejo a necessidade de utilizá-las, corro atrás, estudo seus parâmetros e coloco no código.

Assim como o Delphi é uma enciclopédia, as Apis são outra, de modo que artigos sobre Apis são sempre uma coisa muito extensa.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...