ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[RESOLVIDO]TImage Piscando

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
swbk
Novato
Novato


Registrado: Terça-Feira, 6 de Janeiro de 2015
Mensagens: 27

MensagemEnviada: Ter Jan 06, 2015 3:34 pm    Assunto: [RESOLVIDO]TImage Piscando Responder com Citação

No meu projeto o form principal é fsMDIForm, e nele possuo um TImage AllClient contendo o logo do sistema, acima tenho uma barra de favoritos que é criada dinamicamente e que quando chega a quantidade limite cria um dropdown listando a quantidade que excedeu.

O problema é quando clico nesse dropdown a imagem do fundo da uma piscada, já pesquisei e encontrei as soluções de Doublebuffer, setar para true a propriedade IncrementalDisplay do componente mas ambos sem sucesso.

Alguma outra solução para resolver este problema?

Abaixo imagem do dropdown, lembrando que o mesmo é gerado dinamicamente porém de forma automática quando chega no tamanho limite da barra de favoritos.

https://uploaddeimag.../teste-jpg--271[/b]


Editado pela última vez por swbk em Qua Jan 07, 2015 3:03 pm, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Jan 06, 2015 5:10 pm    Assunto: Responder com Citação

Doublebuffer em true é no componente onde estar o timage assim se o timagem estar no form é o Doublebuffer do form que deve estar como true, se o timage estiver em um panel é o Doublebuffer do panel que deve estar em true
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
swbk
Novato
Novato


Registrado: Terça-Feira, 6 de Janeiro de 2015
Mensagens: 27

MensagemEnviada: Ter Jan 06, 2015 5:15 pm    Assunto: Responder com Citação

strak2012 escreveu:
Doublebuffer em true é no componente onde estar o timage assim se o timagem estar no form é o Doublebuffer do form que deve estar como true, se o timage estiver em um panel é o Doublebuffer do panel que deve estar em true


Já fiz dos dois jeitos e mesmo assim nada.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Jan 06, 2015 5:51 pm    Assunto: Responder com Citação

manda um print do form com o timage selecionado assim como tb do Sctructure para eu analizar
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
swbk
Novato
Novato


Registrado: Terça-Feira, 6 de Janeiro de 2015
Mensagens: 27

MensagemEnviada: Qua Jan 07, 2015 10:27 am    Assunto: Responder com Citação

Resolvi o problema, porém tratei de uma forma diferente.

Ao invés de utilizar o componente TImage ou MDIImage utilizei o componente TMDIWallpaper, removi o TImage e nesse componente você linka a imagem e quando iniciado a aplicação a imagem carrega automaticamente.

Um revés deste componente é que só pode ser linkado um Bitmap, e o tamanho de um arquivo bmp é alto e pode causar problemas de desempenho, para sanar isso reescrevi o código do componente trocando as instancias de TBitmap para TJPEGIMage e ajustando onde necessário.

O tópico pode ser marcado como resolvido, qualquer dúvida quanto a implementação do JPG neste componente só avisar.

Abraço.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qua Jan 07, 2015 2:43 pm    Assunto: Responder com Citação

posta o codigo, se nao for mto longo, ou entao coloca em um compartilhador de arquivos pro pessoal baixar.

coloca no topico sobre projetos open source
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
swbk
Novato
Novato


Registrado: Terça-Feira, 6 de Janeiro de 2015
Mensagens: 27

MensagemEnviada: Qua Jan 07, 2015 3:02 pm    Assunto: Responder com Citação

Segue os métodos e propriedades alteradas do formulário:

Propriedades
Citação:
private
FClientInstance: Pointer;
FDefClientProc: TFarProc;
FPicture: TJPEGImage;
FMode: TWallpaperMode;
procedure ClientInvalidate;
procedure ClientWndProc(var Message: TMessage);
function GetClient: TForm;
function GetClientHandle: hWnd;
procedure SetPicture(Value: TJPEGImage);
procedure SetMode(Value: TWallpaperMode);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ConnectToClient;
property Client: TForm read GetClient;
property ClientHandle: hWnd read GetClientHandle;
published
property Picture: TJPEGImage read FPicture write SetPicture;
property Mode: TWallpaperMode read FMode write SetMode;
end;

Métodos
Citação:
constructor TMDIWallpaper.Create(AOwner: TComponent);
var
i: Integer;
begin
if not (AOwner is TForm) then
Error('not (TMDIWallpaper.Owner is TForm)!')
else if TForm(AOwner).FormStyle <> fsMDIForm then
Error('This is no MDI frame window!')
else with AOwner do for i := 0 to ComponentCount-1 do if Components[i] is TMDIWallpaper then
Error('Only one instance of TMDIWallpaper allowed');
inherited Create(AOwner);
FPicture := TJPEGImage.Create;
TForm(Owner).HandleNeeded;
ConnectToClient;
end;

Citação:
destructor TMDIWallpaper.Destroy;
begin
if Assigned(Owner) and not (csDesigning in ComponentState) then
begin
if Client.HandleAllocated then
begin
// Falls jemand Anderer es wagt, in dreister Mißachtung der
// Maximen objektorientierter Programmierung ebenfalls in
// den Innereien des Clients herumzupfuschen (WIR dürfen das),
// ist hier Gelegenheit, das ans Licht zu bringen:
if SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FDefClientProc)) <Longint> 0 then
if Picture.Height > 0 then
with Client.Canvas do
begin
Handle := TWMEraseBkGnd(Message).DC;
Windows.GetClientRect(ClientHandle, R);
W := R.Right-R.Left;
H := R.Bottom-R.Top;
case FMode of
wpTile: TileBitmap(Picture, Client.Canvas, W, H);
wpCenter:
begin
X := (W - Picture.Width) div 2;
Y := (H - Picture.Height) div 2;
FillRect(Rect(0, 0, W, Y));
FillRect(Rect(0, Y, X, Y+Picture.Height));
FillRect(Rect(X+Picture.Width, Y, W, Y+Picture.Height));
FillRect(Rect(0, Y+Picture.Height, W, H));
Draw(X, Y, Picture);
end;
wpTopLeft:
begin
FillRect(Rect(Picture.Width, 0, W, Picture.Height));
FillRect(Rect(0, Picture.Height, W, H));
Draw(0, 0, Picture);
end;
end;
Handle := 0;
Result := 1;
Exit;
end;
Default;
end;


Citação:
procedure TMDIWallpaper.SetPicture(Value: TJPEGImage);
begin
FPicture.Assign(Value);
ClientInvalidate;
end;


OBS: Onde está em negrito originalmente era a referência do objeto bitmap
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB