Jump to content
sapuser

Colocar primeira linha da ListView intermitente

Recommended Posts

sapuser

Boas,

gostaria de saber se é possivel quando uma listview faz o carregamento dos dados a primeira linha ficar intermitente ( a piscar).

e já agora como se formata a cor da letra e font para cada coluna?

desde já muito obrigado,

Jorge Miguel

Share this post


Link to post
Share on other sites
sapuser

em relação á cor da font já consegui o código.

mas para colocar em destaque a primeira linha da listview ainda não consegui.

o que querias dizer com meter uma animação a mudar de cores. como faço isso?

obrigado

Share this post


Link to post
Share on other sites
Muryllo

E complementando o que o amigo He B Te My disse, podes fazer isso com o timer usando os ticks e um sistema do tipo flip-flop de 1 bit de memória (Apenas para transição de 2 cores). Usei muito isso no meu simulador de engine antivirus, ele coloria em branco e verde na tela do MS-DOS assim :

Verde, Branco, Verde, Branco ...

Edited by Muryllo

Share this post


Link to post
Share on other sites
sapuser

sem querer ser muito chato, poderiam deixar um exemplo de como se faz isso numa listview.

a ideia era por exemplo numa listview ele colocar a piscar a linha que tenha o maior valor.... numa lista de vendas por exemplo.

desde já muito obrigado

Share this post


Link to post
Share on other sites
Muryllo

Creio que esta seja a solução para o teu caso:

Public Class Listview_Animation
'
'++++++++++++++++++++++++++++++++++++++++ TICK DO TIMER +++++++++++++++++++++++++++++++++++++++++++++
'
Protected WithEvents LDR_Timer As New Timer
Protected WithEvents LDR_Component As ListView
Protected LDR_Colors As Color()
'
Protected Flip As UInt64 = 0
Protected Flop As UInt64 = 0
'
Protected Sub LDR_Timer_Tick(sender As Object, e As EventArgs) Handles LDR_Timer.Tick
	Try
		If LDR_Component.Items.Count > 0 = True Then
			If Flip > Flop Then
				Flop += 1
				LDR_Component.Items(0).ForeColor = LDR_Colors(0)
			Else
				Flip += 1
				LDR_Component.Items(0).ForeColor = LDR_Colors(1)
			End If
		Else
			Loading_Effect(LDR_Component, LDR_Colors, False)
		End If
	Catch NTSTATUS As Exception
		Loading_Effect(LDR_Component, LDR_Colors, False)
	End Try
End Sub
'
'+++++++++++++++++++++++++++++++++++++ CARREGADOR DO EVENTO +++++++++++++++++++++++++++++++++++++++++
'
Public Function Loading_Effect(ByVal Component As ListView, ByVal Color As Color(), ByVal Status As Boolean) As Boolean
	Try
		If Color.Length = 2 Then
			If Status = True Then
				LDR_Component = Component
				LDR_Colors = Color
				LDR_Timer.Interval = 200
				LDR_Timer.Start()
				Return True
			Else
				LDR_Timer.Stop()
				LDR_Component.Items(0).ForeColor = Color(1)
				LDR_Component = Nothing
				LDR_Colors = Nothing
				Flip = 0
				Flop = 0
				Return True
			End If
		Else
			Return False
		End If
	Catch NTSTATUS As Exception
		Return False
	End Try
End Function
'
End Class

Adapta ao teu problema de "Maior valor".

É um Flip Flop, não faça CTRL C CTRL V do código mas sim analise isso, ficou bem bolado embora eu não goste de usar Timers.

EDIT :

Código completo com o exemplo :

Public Class Listview_Animation
'
'++++++++++++++++++++++++++++++++++++++++ TICK DO TIMER +++++++++++++++++++++++++++++++++++++++++++++
'
Protected WithEvents LDR_Timer As New Timer
Protected WithEvents LDR_Component As ListView
Protected LDR_Colors As Color()
'
Protected Flip As UInt64 = 0
Protected Flop As UInt64 = 0
'
Protected Sub LDR_Timer_Tick(sender As Object, e As EventArgs) Handles LDR_Timer.Tick
	Try
		If LDR_Component.Items.Count > 0 = True Then
			If Flip > Flop Then
				Flop += 1
				LDR_Component.Items(0).ForeColor = LDR_Colors(0)
			Else
				Flip += 1
				LDR_Component.Items(0).ForeColor = LDR_Colors(1)
			End If
		Else
			Loading_Effect(LDR_Component, LDR_Colors, False)
		End If
	Catch NTSTATUS As Exception
		Loading_Effect(LDR_Component, LDR_Colors, False)
	End Try
End Sub
'
'+++++++++++++++++++++++++++++++++++++ CARREGADOR DO EVENTO +++++++++++++++++++++++++++++++++++++++++
'
Public Function Loading_Effect(ByVal Component As ListView, ByVal Color As Color(), ByVal Status As Boolean) As Boolean
	Try
		If Color.Length = 2 Then
			If Status = True Then
				LDR_Component = Component
				LDR_Colors = Color
				LDR_Timer.Interval = 200
				LDR_Timer.Start()
				Return True
			Else
				LDR_Timer.Stop()
				LDR_Component.Items(0).ForeColor = Color(1)
				LDR_Component = Nothing
				LDR_Colors = Nothing
				Flip = 0
				Flop = 0
				Return True
			End If
		Else
			Return False
		End If
	Catch NTSTATUS As Exception
		Return False
	End Try
End Function
'
End Class
'
Public Class Form1
'
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
	Dim Animation As New Listview_Animation
	ListView1.Items.Add("Portugal a Programar")
	If Animation.Loading_Effect(ListView1, {Color.Aqua, Color.Black}, True) = True Then
		MsgBox("Animação bem sucedida", MsgBoxStyle.Information, "Animação")
	Else
		MsgBox("Animação mal sucedida", MsgBoxStyle.Critical, "Animação")
	End If
End Sub
'
End Class

A função Loading_Effect usa os parâmetros Listview, {Cor_Do_Efeito, Cor_Padrão}, Ativar ou Desativar.

Abraços.

Edited by Muryllo

Share this post


Link to post
Share on other sites
He B TeMy

Esse código não faz sentido nenhum... estas a por try catch só porque sim, e a variável "NTSTATUS" como se isso existisse em .net, wtf.

Estás a aceder á listview pelo indice (0) sem verificar se existe items, secalhar é por isso que tás a pôr o try catch á toa em vez de verificares se a listview têm items... lol.

E depois tás a igualar a variável da listview a Nothing... como é que a vais aceder depois?

Share this post


Link to post
Share on other sites
Muryllo

NTSTATUS é um vicio meu, se o nome fosse Teste daria no mesmo.

O Try Catch é justamente por isso se não existir indice 0 ele caça a exceção. Ele tem de adaptar ao problema dele pois a base é essa. Qual o problema em igualar a Listview a Nothing ? Eu uso a função para controlar o evento e não a variável diretamente.

EDIT:

E não importa se não houver índice 0, uma hora vai aparecer e a animação funcionará da mesma.

Edited by Muryllo

Share this post


Link to post
Share on other sites
He B TeMy

Se igualares a listview a nothing, ele não vai conseguir aceder á listview com o teu código, porque igualas-te a nada...

Não importa se não houver indice 0? Claro que importa, tás a aceder ao indice de um array, se o array não tiver o indice '0' vai-te dar erro.

Podias pelo menos verificar se o array têm, com... if listview.items.count > 0 then ... era mais fácil sem espetar aí 2 try-catchs só porque sim... mas pronto, dá uma ideia sim, só falei porque ele provavelmente vai copiar isso...

Share this post


Link to post
Share on other sites
Muryllo

É, tens razão é de intuito educacional então é melhor corrigir, mas saiba que a função depois vai igualar a mesma variável a listview novamente. Se isso gera erro então é novo pra mim pois nas versões antigas funcionava, vou editar o código.

Share this post


Link to post
Share on other sites
He B TeMy

Ah vi mal, o teu código tá certo... tens um parametro de listview que estás a receber na função... pensava que tavas a alterar directamente, ups.

Share this post


Link to post
Share on other sites
ribeiro55

Não é preciso tanto, se o intuito é apenas um on/off (boolean)

Podes servir-te do Tag da ListViewItem para guardar esse estado.

Algo tão simples como:

	Private WithEvents TMR As New Timer
Private TargetListView As ListView

Private Sub TMR_Tick(sender As Object, e As EventArgs) Handles TMR.Tick
	If TargetListView Is Nothing OrElse TargetListView.Items.Count = 0 Then Exit Sub
	Dim lvi As ListViewItem = TargetListView.Items(0)
	If lvi.Tag Is Nothing Then lvi.Tag = False
	Dim lit As Boolean = DirectCast(lvi.Tag, Boolean)
	lvi.Tag = Not lit
	TargetListView.Items(0).BackColor = IIf(lit, Color.Red, Color.Transparent)
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
	TargetListView = ListView1
	TMR.Interval = 500
	TMR.Start()
End Sub

Fará com que o primeiro item pisque a vermelho.

Se precisas de fazer piscar uma determinada linha, as alterações a este código são mínimas.

Só estoira se já usares o Tag para outra coisa qualquer. Nesse caso conselho estender a classe da ListView para criar métodos que permitam o que queres com facilidade, e com o timer encapsulado no controlo.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.