MUDANDO A FONTE DO LISTVIEW

MARIOANDRADE 30/01/2014 16:49:18
#433976
Meus amigos, sei que existem dezenas de códigos para essa função, porém nenhuma delas serviu, todas tem um pequeno erro de compilação e por aí vai, esse é o meu código:

[txt-color=#0000f0]Private Sub txtLNome_Change()

Dim item As ListItem
ListAlterar.ListItems.Clear
ConnectDB
rs.Open [Ô]Select * from tblCad where NOME like [ô][Ô] & txtLNome.Text & [Ô]%[ô][Ô], db, 3, 3
Do Until (rs.EOF)
Set item = ListAlterar.ListItems.Add(, , rs!cod)
item.SubItems(1) = [Ô][Ô] & rs!Nome
item.SubItems(2) = [Ô][Ô] & rs!CELULAR
item.SubItems(3) = [Ô][Ô] & rs!TELEFONE
item.SubItems(4) = [Ô][Ô] & rs!SIT [txt-color=#007100] [ô]Quero alterar a cor baseado nesse critério[/txt-color]
rs.MoveNext
Loop
Set rs = Nothing
db.Close: Set db = Nothing

End Sub
[/txt-color]

Eu que apenas que , se o campo[txt-color=#0000f0] rsSit = [Ô]S[Ô][/txt-color] que essa linha
fique Verde, se for [Ô]N[Ô] fique branca, [Ô]O[Ô] laranja e se for = [Ô]C[Ô] que a linha fique vermelha.


Sei que isso é algo simples mas não estou conseguindo.


MARCELO.TREZE 30/01/2014 17:23:55
#433982
tenta

Private Sub txtLNome_Change()

Dim item As ListItem
ListAlterar.ListItems.Clear
ConnectDB
rs.Open [Ô]Select * from tblCad where NOME like [ô][Ô] & txtLNome.Text & [Ô]%[ô][Ô], db, 3, 3
Do Until (rs.EOF)
Set item = .ListItems.Add(, , rs!cod)
item.SubItems(1) = [Ô][Ô] & rs!Nome
item.SubItems(2) = [Ô][Ô] & rs!CELULAR
item.SubItems(3) = [Ô][Ô] & rs!TELEFONE
item.SubItems(4) = [Ô][Ô] & rs!SIT [txt-color=#007100] [ô]Quero alterar a cor baseado nesse critério
ListAlterar.ListItems(1).ListSubItems(1).ForeColor = IIf(rs!SIT = [Ô]S[Ô], vbGreen, IIF(rs!SIT = [Ô]N[Ô], vbWhite, IIF(rs!SIT = [Ô]O[Ô], vbOrange,IIF(rs!SIT = [Ô]C[Ô],vbRed, vbBlack)))))
rs.MoveNext
Loop
Set rs = Nothing
db.Close:
Set db = Nothing

End Sub


testa ai num tenho certeza mas acho que vai funcionar
MARIOANDRADE 30/01/2014 19:58:29
#433985
Citação:

:
tenta

Private Sub txtLNome_Change()

Dim item As ListItem
ListAlterar.ListItems.Clear
ConnectDB
rs.Open [Ô]Select * from tblCad where NOME like [ô][Ô] & txtLNome.Text & [Ô]%[ô][Ô], db, 3, 3
Do Until (rs.EOF)
Set item = .ListItems.Add(, , rs!cod)
item.SubItems(1) = [Ô][Ô] & rs!Nome
item.SubItems(2) = [Ô][Ô] & rs!CELULAR
item.SubItems(3) = [Ô][Ô] & rs!TELEFONE
item.SubItems(4) = [Ô][Ô] & rs!SIT [txt-color=#007100] [ô]Quero alterar a cor baseado nesse critério
ListAlterar.ListItems(1).ListSubItems(1).ForeColor = IIf(rs!SIT = [Ô]S[Ô], vbGreen, IIF(rs!SIT = [Ô]N[Ô], vbWhite, IIF(rs!SIT = [Ô]O[Ô], vbOrange,IIF(rs!SIT = [Ô]C[Ô],vbRed, vbBlack)))))
rs.MoveNext
Loop
Set rs = Nothing
db.Close:
Set db = Nothing

End Sub


testa ai num tenho certeza mas acho que vai funcionar




Marcelo, deu esse erro e esse

MARCELO.TREZE 30/01/2014 20:55:14
#433986
bom vamos lá colega faz o seguinte cola esta função publica no seu form

Public Sub ColorListviewRow(LV As ListView, RowNbr As Long, RowColor As OLE_COLOR)


Dim itmX As ListItem
Dim lvSI As ListSubItem
Dim intIndex As Integer

On Error GoTo ErrorRoutine

Set itmX = LV.ListItems(RowNbr)
itmX.ForeColor = RowColor
For intIndex = 1 To LV.ColumnHeaders.Count - 1
Set lvSI = itmX.ListSubItems(intIndex)
lvSI.ForeColor = RowColor
Next

Set itmX = Nothing
Set lvSI = Nothing

Exit Sub

ErrorRoutine:

MsgBox Err.Description

End Sub


agora altere o seu código

Dim item As ListItem
ListAlterar.ListItems.Clear
ConnectDB
rs.Open [Ô]Select * from tblCad where NOME like [ô][Ô] & txtLNome.Text & [Ô]%[ô][Ô], db, 3, 3
Do Until (rs.EOF)
Set item = .ListItems.Add(, , rs!cod)
item.SubItems(1) = [Ô][Ô] & rs!Nome
item.SubItems(2) = [Ô][Ô] & rs!CELULAR
item.SubItems(3) = [Ô][Ô] & rs!TELEFONE
item.SubItems(4) = [Ô][Ô] & rs!SIT [txt-color=#007100] [ô]Quero alterar a cor baseado nesse critério
rs.MoveNext
Loop
Set rs = Nothing
db.Close:
Set db = Nothing

With ListAlterar.ListItems
Dim coluna As String
For f = 1 To .Count - 1
coluna = ListAlterar.ListItems(f).ListSubItems(4).Text
Select Case coluna
Case [Ô]S[Ô]
ColorListviewRow ListAlterar, .Item(f).Index, vbGreen
Case [Ô]N[Ô]
ColorListviewRow ListAlterar, .Item(f).Index, vbWhite
Case [Ô]O[Ô]
ColorListviewRow ListAlterar, .Item(f).Index, &H80FF&
Case [Ô]C[Ô]
ColorListviewRow ListAlterar, .Item(f).Index, vbRed
End Select
Next f
End With

End Sub



veja agora se funciona
MARIOANDRADE 30/01/2014 21:43:18
#433988
Marcelo, funcionou melhor que a encomenda, valeu mesmo, a muito tempo que procuro por isso,
só acrescentei um

[txt-color=#0000f0]Dim f as Integer[/txt-color]

antes do
[txt-color=#0000f0]For f = 1 To .Count [/txt-color][txt-color=#007100][ô]- 1 Aqui eu comentei este [Ô]-1[Ô] pois não estava alterando o último item[/txt-color]

Agora teria algum comando para ordenar por cores ao clicar em um item, tipo como ele ordena por ordem alfabética ele agruparia por cores
daí eu colocaria uma CheckBox para o usario escolher por ordem alfabética ou por cores o de ordem alfabética eu ja tenho.


Marcelo desde já obrigado pela sua força , se você não souber como agrupar por cores eu encerro este tópico e crio outro.


MARCELO.TREZE 30/01/2014 22:02:03
#433990
Resposta escolhida
Só uma pergunta se a cor é pela letra, então a ordem das cores não seria a mesma que as ordens alfabéticas?

porém se precisar mesmo posta o código que tem para ordenar por ordem alfabética pra ver se conseguimos altera-lo para cores
MARIOANDRADE 30/01/2014 22:44:44
#433992
Caramba Marcelo, dei uma de jumento agora, realmente se é pela letra então ele ordena as cores tb dã....mas aproveitando a oportunidade vou te apresentar o código que uso que só ordena os campos em texto, quando clico num campo com numeros ou datas ele mistura tudo:

[txt-color=#0000f0]
Private Sub ListAlterar_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

With ListAlterar
If (.Sorted) And (ColumnHeader.SubItemIndex = .SortKey) Then
If .SortOrder = lvwAscending Then
.SortOrder = lvwDescending
Else
.SortOrder = lvwAscending
End If
Else
.Sorted = True
.SortKey = ColumnHeader.SubItemIndex
.SortOrder = lvwAscending
End If
.Refresh
End With

If Not ListAlterar.SelectedItem Is Nothing Then
ListAlterar.SelectedItem.EnsureVisible
End If

End Sub [/txt-color]


Só preciso de um código que ordene tudo, quanto as cores ja ta resolvido.
MARCELO.TREZE 31/01/2014 05:26:21
#434001
colega mas é possível ordenar pelo que vc quiser sem embaralhar

Usaremos o [Ô]Tag[Ô] de cada ColumHeader para armazenar
qual tipo de dados a coluna recebe:
= N para Números
= D para Datas
= T para Textos

como Fazer isso?
é simples no load do form, ou como no seu caso no change do textbox quando preenche o listview basta acrescentar as seguintes linha:

Do Until (rs.EOF)
Set item = .ListItems.Add(, , rs!cod)
item.SubItems(1) = [Ô][Ô] & rs!Nome
item.SubItems(2) = [Ô][Ô] & rs!CELULAR
item.SubItems(3) = [Ô][Ô] & rs!TELEFONE
item.SubItems(4) = [Ô][Ô] & rs!SIT
rs.MoveNext
Loop

ListAlterar.ColumnHeaders(1).Tag = [Ô]T[Ô] [ô] coluna 1 onde esta o nome é por texto
ListAlterar.ColumnHeaders(2).Tag = [Ô]N[Ô]
ListAlterar.ColumnHeaders(3).Tag = [Ô]N[Ô] [ô] coluna 2 e 3 serão numeros



Não coloquei o D para campo data porque no casa não existe este campo data, mas se vc tiver em outro listview e so acrescentar na coluna a letra especifica.

acima coloquei apenas um trecho do código pois teremos outros mais.

bom feito isso acima agora você deverá colar em um MÓDULO o seguinte código:

Private Declare Function SendMessage Lib [Ô]user32[Ô] Alias [Ô]SendMessageA[Ô] (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function LockWindowUpdate Lib [Ô]user32[Ô] (ByVal hwndLock As Long) As Long

Public Sub SortListView(ListView As ListView, ByVal Index As Integer, _
ByVal DataType As ListDataType, ByVal Ascending As Boolean)

On Error Resume Next
Dim i As Integer
Dim l As Long
Dim strFormat As String
Dim lngCursor As Long
lngCursor = ListView.MousePointer
ListView.MousePointer = vbHourglass
LockWindowUpdate ListView.hwnd

Dim blnRestoreFromTag As Boolean

Select Case DataType
Case ldtString
blnRestoreFromTag = False

Case ldtNumber
strFormat = String$(20, [Ô]0[Ô]) & [Ô].[Ô] & String$(10, [Ô]0[Ô])
With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), strFormat)
Else
.Text = [Ô]&[Ô] & InvNumber(Format(0 - CDbl(.Text), strFormat))
End If
Else
.Text = [Ô][Ô]
End If
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), strFormat)
Else
.Text = [Ô]&[Ô] & InvNumber(Format(0 - CDbl(.Text), strFormat))
End If
Else
.Text = [Ô][Ô]
End If
End With
Next l
End If
End With

blnRestoreFromTag = True

Case ldtDateTime
strFormat = [Ô]YYYYMMDDHhNnSs[Ô]

Dim dte As Date

With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
.Tag = .Text & Chr$(0) & .Tag
dte = CDate(.Text)
.Text = Format$(dte, strFormat)
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
.Tag = .Text & Chr$(0) & .Tag
dte = CDate(.Text)
.Text = Format$(dte, strFormat)
End With
Next l
End If
End With

blnRestoreFromTag = True

End Select

ListView.SortOrder = IIf(Ascending, lvwAscending, lvwDescending)
ListView.SortKey = Index - 1
ListView.Sorted = True

If blnRestoreFromTag Then

With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
i = InStr(.Tag, Chr$(0))
.Text = Left$(.Tag, i - 1)
.Tag = Mid$(.Tag, i + 1)
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
i = InStr(.Tag, Chr$(0))
.Text = Left$(.Tag, i - 1)
.Tag = Mid$(.Tag, i + 1)
End With
Next l
End If
End With
End If

LockWindowUpdate 0&

ListView.MousePointer = lngCursor

End Sub



e por fim você vai alterar a codificação que vc tem para ordernar para esta

Dim OrdAsc as boolean [ô]serve para poder classificar como ascendente/descendente

Private Sub ListAlterar_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

If ColumnHeader.Tag = [Ô]N[Ô] Then [ô]
SortListView ListAlterar, ColumnHeader.Index, ldtNumber, OrdAsc
ElseIf ColumnHeader.Tag = [Ô]T[Ô] Then
SortListView ListAlterar, ColumnHeader.Index, ldtString, OrdAsc
Else
SortListView ListAlterar, ColumnHeader.Index, ldtDateTime, True
End If
OrdAsc = Not OrdAsc
End Sub



pronto agora vc ira ordernar porque desejar, data, numeros textos

Boa sorte



MARIOANDRADE 01/02/2014 20:22:06
#434057
Marcelo,

ta dando esse erro, qual objeto devo acrescentar?

OMAR2011 01/02/2014 22:39:46
#434065
M4R10 eu achei um código postado em um fórum, onde muda a cor no listview.
Testei e foi de uma forma surpreendente.
Código pequeno e fácil de entender.
Caso queira posso colocar aqui.
Valeu.
MARIOANDRADE 02/02/2014 12:25:44
#434079
Citação:

:
M4R10 eu achei um código postado em um fórum, onde muda a cor no listview.
Testei e foi de uma forma surpreendente.
Código pequeno e fácil de entender.
Caso queira posso colocar aqui.
Valeu.



Omar,

obrigado pela atenção, a cor do listview já foi resolvido mas aproveitei a ajuda do Marcelo e perguntei se tinha um código para ordenar o listview porque o que tenho só organiza as colunas com texto, então ele me passou este código que está na tela , ao inseri-lo deu o erro que postei acima, preciso apenas saber qual referencia devo acrescentar para que o código funcione.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas