[ KiselinaXP @ 01.06.2007. 15:29 ] @
Zanima me kako, kada ucitam podatke iz baze u MSHFlexGrid da mi polja budu obojena, ali prvo polje plava drugo bela i sve tako. Nadam se da ste skontali na sta mislim???
Hvala unapred!
[ zormar @ 01.06.2007. 21:33 ] @
Ovo ti je kod za bojenje opsega, ti prilagodi za ono sto tebi treba
Code:
for i=1 to 5 ' redovi
            for j= 1 to 5 'kolone
               MSHFG1.row=i
               MSHFG1.col=j
               MSFHG1.cellbackcolor=blue
            next j
         next i

pozdrav
[ rgdrajko @ 01.06.2007. 22:37 ] @
Moze i ovako.

Code:

Private Sub Form_Load()
    MSHFlexGrid1.Rows = 10
    MSHFlexGrid1.Cols = 10
    For r = 1 To MSHFlexGrid1.Rows - 1
        For k = 1 To MSHFlexGrid1.Cols - 1
            MSHFlexGrid1.Row = r
            MSHFlexGrid1.Col = k
            MSHFlexGrid1.CellBackColor = QBColor(r)
        Next k
    Next r
End Sub
[ Ero S Ovoga Sveta @ 01.06.2007. 23:58 ] @
Posto je @rgdrajko dao netacan odgovor sad moram ja.
@rgdrajko sta bi bilo sa tim tvojim kodom da grid ima 20 rovova ili vise?

@KiselinaXP ako pod "polje" podrazumijevas Row grida onda mislim da si ovo trazio.
Code:
Private Sub Form_Load()
Dim lRow As Long
Dim lCol As Long

    MSHFlexGrid1.Rows = 50
    MSHFlexGrid1.Cols = 10
    
    For lRow = 1 To MSHFlexGrid1.Rows - 1 Step 2
        For lCol = 0 To MSHFlexGrid1.Cols - 1
            MSHFlexGrid1.Row = lRow
            MSHFlexGrid1.Col = lCol
            MSHFlexGrid1.CellBackColor = &H80000013
        Next lCol
    Next lRow
    
End Sub
[ rgdrajko @ 02.06.2007. 00:57 ] @
@ Ero S Ovoga Sveta
Hvala na ispravci. Ono je bio primer na brzinu. A sta bi bilo sa mojim kodom da grid ima 20 rovova ili vise? Pa ukupan broj redova i kolona definises sa Rows i Cols, valjda znas to i trebalo je samo to promeniti i umesto 10 staviti npr. 50.
Posto ni ti nisi dao potpuno tacan odgovor moram ja. Valjda covek misli od pocetka do kraja da se naizmenicno smenjuju plava i bela polja i postoje dva moguca resenja:

1. Ako pod polja podrazumeva redove onda je resenje(slicno tvome, stim sto je kod tebe prva celija u redu siva a ne plava tj. bela):

Code:

Private Sub Form_Load()
    MSHFlexGrid1.Rows = 50
    MSHFlexGrid1.Cols = 50
    For r = 0 To MSHFlexGrid1.Rows - 1
        For k = 0 To MSHFlexGrid1.Cols - 1
            MSHFlexGrid1.Row = r
            MSHFlexGrid1.Col = k
            If r Mod 2 = 0 Then
                MSHFlexGrid1.CellBackColor = QBColor(9)
                Else
                MSHFlexGrid1.CellBackColor = QBColor(15)
            End If
        Next k
    Next r
End Sub


2. Ako pod polja podrazumeva celije onda je resenje:

Code:

Private Sub Form_Load()
    MSHFlexGrid1.Rows = 50
    MSHFlexGrid1.Cols = 50
    For r = 0 To MSHFlexGrid1.Rows - 1
        For k = 0 To MSHFlexGrid1.Cols - 1
            MSHFlexGrid1.Row = r
            MSHFlexGrid1.Col = k
            If k Mod 2 = 0 Then
                MSHFlexGrid1.CellBackColor = QBColor(9)
                Else
                MSHFlexGrid1.CellBackColor = QBColor(15)
            End If
        Next k
    Next r
End Sub
[ Ero S Ovoga Sveta @ 02.06.2007. 01:47 ] @
@rgdrajko
Citat:
A sta bi bilo sa mojim kodom da grid ima 20 rovova ili vise?

Evo sta bi bilo: Posto u QBColor imas, mislim 16 boja, posle 16. reda program bi zakovao.

A sto se tice koda boje koju sam stavio bar je to lako promijeniti.
[ rgdrajko @ 02.06.2007. 11:27 ] @
@ Ero S Ovoga Sveta
Ok. Ono je bio primer na brzinu sa funkcijom QBCOLOR i radi to sto radi i u tom okviru. Uobicajena je praksa pri programiranju na brzinu da se sa bojama radi sa funkcijom QBCOLOR(koja je nasledjena iz Qbasica-a) a inace sa funkcijom RGB koja ima vrednost long i ako umesto funkcije QBCOLOR u moj gornji program ubacis funkciju RGB dobijas ispravan program. Uostalom to ti sve znas i ovo pisem zbog pocetnika. Umesto heksadecimalnih vrednosti boja funkcije RGB za pocetnika je bolje da radi sa funkcijom RGB i tek kada je 100% siguran da je to ta boja onda moze staviti njenu heksadecimalnu vrednost. Uostalom mnogo lakse je promeniti tri parametra red, green, blue od 0 do 255 RGB funkcije nego pamtiti heksadecimalne vrednosti. Uostalom sve ovo se moze procitati kada misom stanete na RGB funkciju i pritisnete F1 taster.
Primer:

Code:

Private Sub Form_Load()
    MSHFlexGrid1.Rows = 50
    MSHFlexGrid1.Cols = 50
    For r = 0 To MSHFlexGrid1.Rows - 1
        For k = 0 To MSHFlexGrid1.Cols - 1
            MSHFlexGrid1.Row = r
            MSHFlexGrid1.Col = k
            If r Mod 2 = 0 Then
                MSHFlexGrid1.CellBackColor = RGB(0, 0, 255)
                Else
                MSHFlexGrid1.CellBackColor = RGB(255, 255, 255)
            End If
        Next k
    Next r
End Sub
[ Ero S Ovoga Sveta @ 02.06.2007. 17:14 ] @
Dok me nisu skinuli sa foruma moram da odgovorim
@rgdrajku:
Lijepo je sto pokusavas pomoci ljudima da rijese problem, ali je problem u tome
sto ti u velikom broju slucajeva dajes pogresna rjesenja iako je prije tebe neko dao ispravno rjesenje,
sto me je i u ovom slucaju natjeralo da se ukljucim u diskusiju.
Evo dokazi zato:
U prvoj poruci koju je postavio @zormar sasvim je lijepo objasnjen princip izmjene boja na gridu
sto se uz malu doradu moglo prilagoditi zahtjevima Osnivaca teme.
Onda ti dajes POGRESNO rjesenje nakon cega sam ja reagovao i postovao svoj code.
U tvom drugom postu ti ponovo postavljas code kokji takodje nije uredu a evo i zasto.
U dvije komplikovane petlje ubacujes komplikovanije rjesenje od onoga koje sam ja postavio,
cime ogromno usporavas izvrsenje zadatka. Probaj da u onaj svoj kod postavis da grid ima
1000 Row-ova ili nedaj Boze vise, pokreni program i reci nam svima sta se desilo, a uradi
to isto i sa primjerom koji sam ja postavio. Desice se to da programu za izvrsenje
tvoga koda sa 1000 Row-ova treba skoro tri puta vise vremena(oko 3 sekunde) nego za moj kod.
A posto se tu radio o sekundama zamisli sta bi bilo da grid ima 10.000 Row-ova ili vise.
(ova gore vremena su relativna u zavisnosti od brzine procesora i ostalih faktora)
I moje rjesenje se sa malim izmjenama jos moze ubrzati i evo kod kako to uraditi.
Code:
Private Sub Form_Load()
Dim lCol As Long
Dim lRow As Long

Const Plava = &HFFF8EA

    With MSHFlexGrid1
        .Rows = 1000
        .Cols = 10

        For lRow = 0 To .Rows - 1 Step 2
            .Row = lRow
            For lCol = 0 To .Cols - 1
                .Col = lCol
                .CellBackColor = Plava
            Next lCol
        Next lRow
    End With
        
End Sub

Ako neko ima neko brze i bolje rjesenje bilo bi korisno da ga da.
A moj savjet je da se ova izmjena boja uopste ne radi ako nije nuzna ili ako se ne zna moguci
broj Row-ova Grida.
[ zormar @ 02.06.2007. 18:32 ] @
Da iskoristim priliku kad je ova tema vec otvorena.
Zasto ova petlja ne radi?
Prijavljuje Run-Time error 13 : Type mismatch - u prvom redu gde je definisana petlja.
Code:
Do While Not .TextMatrix(i, j) = 1
   For j = 1 To MSHFlexGrid1.Cols - 1  
        For i = 1 To MSHFlexGrid1.Rows - 1
            If .TextMatrix(i, j) = "" Then   
               .Row = i
               .Col = j
               .CellBackColor = vbGreen
           ElseIf .TextMatrix(i, j) = 1 Then   
               .Row = i
               .Col = j
               .CellBackColor = vbRed
           End If
        Next
   Next
Loop

U Gridu su upisane jedinice u svakoj koloni na razlicitim mestima.
Trebalo bi obojiti zeleno sva polja u svakoj koloni, dok na nenaidje na jedinicu, to polje se boji u crveno.
[ goranvuc @ 02.06.2007. 19:07 ] @
Ne treba ti Do...While petlja (osim ako ne zelis da izadjes cim naidjes na prvu jedinicu), a brojaci (i, j) treba da idu od 0, a ne od 1 (osim ako imas Fixed rows ili columns, gde onda treba da se oni preskoce):
Code:

    With MSHFlexGrid1

        For j = 0 To .Cols - 1  
            For i = 0 To .Rows - 1

                If .TextMatrix(i, j) = "" Then   
                   .Row = i
                   .Col = j
                   .CellBackColor = vbGreen
                ElseIf .TextMatrix(i, j) = "1" Then   
                   .Row = i
                   .Col = j
                   .CellBackColor = vbRed
                End If

            Next
        Next

    End With
[ rgdrajko @ 02.06.2007. 19:10 ] @
Posto ne znam sta tacno zelis evo ispravke na brzinu, a ti posle ispravi sta jos treba. Do While petlja bi trebala biti unutar "For i" petlje da bi se izvrsavala.

Code:

Private Sub Form_Load()
     MSHFlexGrid1.Rows = 20
     MSHFlexGrid1.Cols = 20
    
     For j = 1 To MSHFlexGrid1.Cols - 1
            For i = 1 To MSHFlexGrid1.Rows - 1
                If MSHFlexGrid1.TextMatrix(i, j) = "" Then
                   MSHFlexGrid1.Row = i
                   MSHFlexGrid1.Col = j
                   MSHFlexGrid1.CellBackColor = vbGreen
                   Else
                        If MSHFlexGrid1.TextMatrix(i, j) = 1 Then
                            MSHFlexGrid1.Row = i
                            MSHFlexGrid1.Col = j
                            MSHFlexGrid1.CellBackColor = vbRed
                        End If
                End If
            Next i
       Next j
End Sub
[ zormar @ 02.06.2007. 19:18 ] @
Gorane, upravo je potrebno da izadje iz petlje cim naidje na prvu jedinicu u svakoj koloni.
[ goranvuc @ 02.06.2007. 19:20 ] @
Pa onda ce ti ostale celije (one kroz koje nije prosla petlja) ostati u beloj boji, tj. boji koja je bila pre poziva petlje, da li tako hoces?
[ zormar @ 02.06.2007. 19:22 ] @
Da, tako treba.
[ goranvuc @ 02.06.2007. 19:26 ] @
Pa dobro, svakako ti ta Do...While petlja nije potrebna i nema smisla, evo ti resenje:
Code:

Private Sub ObojiGrid()
   
   With MSHFlexGrid1
        
      For j = 0 To .Cols - 1
         For i = 0 To .Rows - 1

            If .TextMatrix(i, j) = "" Then
                
               .Row = i
               .Col = j
               .CellBackColor = vbGreen
                   
            ElseIf .TextMatrix(i, j) = "1" Then
                
               .Row = i
               .Col = j
               .CellBackColor = vbRed
               
               Exit Sub 'izlaz iz procedure
                   
            End If

         Next
      Next

    End With
    
End Sub
[ goranvuc @ 02.06.2007. 19:29 ] @
Sad sam video da hoces prekid punjenja redova po koloni kad naidje na "1", evo ti malo u skladu sa tim:
Code:

Private Sub ObojiGrid()
   
   With MSHFlexGrid1

      For j = 0 To .Cols - 1
         For i = 0 To .Rows - 1

            If .TextMatrix(i, j) = "" Then
                
               .Row = i
               .Col = j
               .CellBackColor = vbGreen
                   
            ElseIf .TextMatrix(i, j) = "1" Then
                
               .Row = i
               .Col = j
               .CellBackColor = vbRed
               
               Exit For 'izlaz iz punjenja redova po koloni
                   
            End If

         Next
      Next

    End With
    
End Sub
[ zormar @ 02.06.2007. 19:38 ] @
Ovo funkcionise samo za prvu kolonu, a potrebno je za sve kolone u Gridu. Mislim da je zbog toga potrebna petlja.
[ goranvuc @ 02.06.2007. 19:39 ] @
Dobio si ispravku, pogledaj Petlja je suvisna!
[ zormar @ 02.06.2007. 19:42 ] @
Gorane, ovo sad je u redu. Sve radi kako treba.
Hvala
[ Marko_L @ 02.06.2007. 19:47 ] @
Ajde pročitajte pažljivo pitanje pre nego što napišete odgovor. U prvom postu je jasno naglašeno da se podaci učitavaju iz baze, tako da je broj redova i kolona već definisan i ne treba ga ponovo definisati. Drugo, nije pametno ovakve stvari stavljati u Load event forme, jer prvo, ne znamo tačno kada će Grid biti povezan sa bazom, a drugo kada dođe do refresha prikaza, boje će se izgubiti. Bolje je napraviti proceduru koja radi bojenje i onda je pozvati kad god je potrebno. Dakle, isto kao ovo poslednje Erino rešenje, samo bez ponovnog definisanja redova i kolona
Code:
Dim i As Long
Dim j As Long
With MSHFlexGrid1
   For i = 1 To .Rows - 1 Step 2
   .Row = i
      For j = 1 To .Cols - 1
      .Col = j
      .CellBackColor = RGB(0, 0, 200)
      Next j
   Next i
End With


@zomar
Prijavljuje ti grešku zato što je TextMatrix String Tipa, a ti radiš sa numeričkom vrednošću. To možeš da izbegneš na dva načina, prvi je da staviš 1 pod navodnike, a drugi da tražiš brojčanu vrednost TextMatrix-a sa cLng ili Val, recimo Val(.TextMatrix(i, j) Mada, bez obzira na to, tvoj kod neće raditi kako treba, jer nisi dobro postavio uslov, odnosno definišeš uslov za petlju sa određenom ćelijom od koje počinješ, a sledeći put proveravaš uslov sa poslednjom ćelijom (poslednji red i poslednja kolona), jer si odmah po prvom izvršavanju Do... Loop petlje i i j "bacio" na maksimalnu vrednost. Takođe, nisi dobro objasnio šta želiš da postigneš. Ako hoćeš da sva polja koja sadrže 1 obojiš u crveno, a sva ostala u zeleno, ne treba ti ta Do... Loop petlja uopšte, možeš jednostavno ovako
Code:
Dim i As Long
Dim j As Long
With MSHFlexGrid1
   For j = 1 To MSHFlexGrid1.Cols - 1
        For i = 1 To MSHFlexGrid1.Rows - 1
            If .TextMatrix(i, j) = "1" Then
               .Row = i
               .Col = j
               .CellBackColor = vbRed
           Else
               .Row = i
               .Col = j
               .CellBackColor = vbGreen
           End If
        Next i
   Next j
End With

a ako ti je cilj da bojiš kolonu zelenom sve dok ne naiđe na 1, a onda pređe na sledeću onda jednostavno napusti petlju čim nađeš 1. Ovako
Code:
Dim i As Long
Dim j As Long
Dim provera As Boolean
With MSHFlexGrid1
   For j = 1 To MSHFlexGrid1.Cols - 1
        For i = 1 To MSHFlexGrid1.Rows - 1
            If .TextMatrix(i, j) = "1" Then
               .Row = i
               .Col = j
               .CellBackColor = vbRed
                Exit For
           Else
               .Row = i
               .Col = j
               .CellBackColor = vbGreen
           End If
        Next i
   Next j
End With

Ako hoćeš nešto treće, onda objasni šta.
[ goranvuc @ 02.06.2007. 19:50 ] @
Nema na cemu, nadam se da si shvatio zasto je Do...While petlja bila suvisna. Ako koristis For...Next petlju, a postoji neki uslov pod kojim treba da se prekine sa izvrsenjem te petlje (ovde je to bio da u celiji pise "1"), koristi se Exit For cime se prekida sa izvrsenjem petlje.

Takodje sam primetio da imas problem sa With...End With konstrukcijom koju je Ero prvi postavio ovde, a ti si onda kopiranjem koda dobio gresku koju nisi razumeo, pa da ti samo ukratko objasnim: Sa With...End With blokom naredbi ti kazes VB-u da se u tom bloku sve sto pocinje sa "." odnosi na objekat koji je naveden u With delu (u ovom primeru to je MSHFlexGrid1) cime se skracuje pisanje koda, olaksava citljivost i grupise sukcesivna promena vrednosti vise svojstava ako se odnose na isti objekat.

Pozdrav!
[ Marko_L @ 02.06.2007. 19:58 ] @
Izvinjavam se ako je moj post napravio pometnju, trebao je da bude postavljen pre nekih sat vremena, ali sam morao nešto da završim na drugoj strani, a zaboravio sam da kliknem na postavi odgovor, i kad sam postavio, video sam da je u međuvremenu dosta toga napisano, pa i rešenje problema.
[ zormar @ 02.06.2007. 20:19 ] @
Marko, hvala ti na objasnjenju za petlju.
Goran mi je vec pokazao gde treba staviti prekid.
pozdrav
[ zormar @ 04.06.2007. 20:27 ] @
Na koji nacin da saberem Green polja po kolonama?
Kad se popuni prva kolona da se u Labelu upise zbir, i tako redom.
Code:
With  MSHFlexGrid1
   For i = 1 to .Rows - 1
     For j = 1 To .Cols - 1       
        If .TextMatrix(i, j) = "" Then
             .Row = i
             .Col = j
             .CellBackColor = vbGreen 

        ElseIf .TextMatrix(i, j) = "1" Then 
             .Row = i
             .Col = j
             .CellBackColor = vbRed
   Exit For 
        End If
      Next
   Next
End With


[ Marko_L @ 05.06.2007. 21:51 ] @
Koliko ja vidim u tvom kodu, samo će se prazna polja bojiti u zeleno, što znači da će zbir uvek biti 0 (nula). Ako te interesuje broj praznih polja, onda samo dodaj neki counter u delu gde bojiš u zeleno. Ili još bolje napravi neku funkciju koja će da ih prebrojava... nešto ovako
Code:
Private Function CountGreenCells(col_number As Long) As Long
MSHFlexGrid1.Col = col_number
Dim i As Long
Dim Brojac As Long
Brojac = 0
   For i = 1 To .Rows - 1
      MSHFlexGrid1.Row = i
      If MSHFlexGrid1.CellBackColor = vbGreen Then Brojac = Brojac + 1
   Next i
CountGreenCells = Brojac
End Function

i onda je samo pozivaš tamo gde ti treba... recimo ako ti treba ti broj zelenih u drugoj koloni i hoćeš da smestiš dobijenu vrednost u Label1 klikom na button
Code:
Private Sub Command1_Click()
Label1.Caption = CountGreenCells(2)
End Sub
[ zormar @ 06.06.2007. 10:48 ] @
@Marko_L, zahvaljujem ti na odgovoru. To je ono sto mi je trebalo.
[ KiselinaXP @ 09.06.2007. 07:18 ] @
Ja se izvinjavam sto nisam odgovorio na vase poruke, posto sam bio zauzet odbranom maturskog rada.
Puno vam hvala sto ste mi pomogli da resim ovaj problem.
Uzeo sam metodu koju je napiso Marko_L.
Pozdrav svima, i jos jedanput HVALA VAM PUNO!
[ KiselinaXP @ 28.03.2008. 10:21 ] @
Pozdrav svima!
Nisam hteo otvarati novu temu posto je u sklopu ove.
Imam problem, tj. ne znam kako da izvedem: imam MSHFlexGrid i popunjavam je iz baze podataka, e sada imam problem kada npr. markiram 5 redova samo da mi iz tih redova sabere kolone pod brojem 8.
Hvala unapred!
[ KiselinaXP @ 04.04.2008. 08:54 ] @
Pozdrav svima!
Ja se stvarno izvinjavam, ali mi stvarno treba da resim ovaj problem, ako nisam bio jasan u svom pitanju recite mi molim vas.