 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
swbk Novato

Registrado: Terça-Feira, 6 de Janeiro de 2015 Mensagens: 27
|
Enviada: Ter Jan 06, 2015 3:34 pm Assunto: [RESOLVIDO]TImage Piscando |
|
|
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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Jan 06, 2015 5:10 pm Assunto: |
|
|
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 |
|
 |
swbk Novato

Registrado: Terça-Feira, 6 de Janeiro de 2015 Mensagens: 27
|
Enviada: Ter Jan 06, 2015 5:15 pm Assunto: |
|
|
| 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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Jan 06, 2015 5:51 pm Assunto: |
|
|
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 |
|
 |
swbk Novato

Registrado: Terça-Feira, 6 de Janeiro de 2015 Mensagens: 27
|
Enviada: Qua Jan 07, 2015 10:27 am Assunto: |
|
|
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 |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9100 Localização: Sinop-MT
|
Enviada: Qua Jan 07, 2015 2:43 pm Assunto: |
|
|
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 |
|
 |
swbk Novato

Registrado: Terça-Feira, 6 de Janeiro de 2015 Mensagens: 27
|
Enviada: Qua Jan 07, 2015 3:02 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|