Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - MSHFlexgrid
Forum - Visual Basic 6 - MSHFlexgrid

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
magicolotto (Normal User)
Expert


Messaggi: 338
Iscritto: 21/01/2008

Segnala al moderatore
Postato alle 19:03
Sabato, 08/11/2008
ragazzi uso in questa grilia dei numeri prelevati in un archivio access

la griglia è 19 x 10
quindi 190 celle

uso dei contatori per effetture la ricerca nella griglia

pero' il codice che  uso
è molto lento
ci impiega molto ad analizzare la griglia


vorrei sapere se  cè un mdo piu veloce

esempio del codice che uso :


Codice sorgente - presumibilmente Delphi

  1. For row1 = 1 To caricaestraz
  2.              For col1 = 2 To 11
  3.               For row2 = row1 + 1 To caricaestraz
  4.                For col2 = 2 To 11
  5.                 For row3 = row2 + 1 To caricaestraz
  6.                  For col3 = 2 To 11
  7.                   For col4 = col3 + 1 To 11
  8.                    DoEvents
  9.                    For row4 = row3 + 1 To caricaestraz
  10.                     For col5 = 2 To 11
  11.                      For col6 = col5 + 1 To 11
  12.                       ProgressBar1.Value = ProgressBar1.Value + 0.0001
  13.                       If col2 - col1 = col5 - col3 And col4 - col3 = col6 - col5 Then
  14.                        If Abs(row2 - row1) = Abs(row4 - row3) Then  ' And Abs(row3 - row2) = Abs(row5 - row3) Then
  15.                      
  16.                         num(1) = CInt(MSHFlexGrid1.TextMatrix(row1, col1))
  17.                         num(2) = CInt(MSHFlexGrid1.TextMatrix(row2, col2))
  18.                         num(3) = CInt(MSHFlexGrid1.TextMatrix(row3, col3))
  19.                         num(4) = CInt(MSHFlexGrid1.TextMatrix(row3, col4))
  20.                         num(5) = CInt(MSHFlexGrid1.TextMatrix(row4, col5))
  21.                         num(6) = CInt(MSHFlexGrid1.TextMatrix(row4, col6))
  22.                          
  23.                         If (num(1) = num(2)) And (num(3) = num(4)) And (num(5) = num(6)) Then
  24.                                         MSHFlexGrid1.row = row1
  25.                                          MSHFlexGrid1.col = col1
  26.                                             MSHFlexGrid1.CellBackColor = vbRed
  27.                                              MSHFlexGrid1.row = row2
  28.                                                 MSHFlexGrid1.col = col2
  29.                                                   MSHFlexGrid1.CellBackColor = vbRed
  30.                                                    MSHFlexGrid1.row = row3
  31.                                                      MSHFlexGrid1.col = col3
  32.                                                       MSHFlexGrid1.CellBackColor = vbGreen
  33.                                                         MSHFlexGrid1.row = row3
  34.                                                          MSHFlexGrid1.col = col4
  35.                                                           MSHFlexGrid1.CellBackColor = vbGreen
  36.                                                            MSHFlexGrid1.row = row4
  37.                                                             MSHFlexGrid1.col = col5
  38.                                                              MSHFlexGrid1.CellBackColor = vbYellow
  39.                                                               MSHFlexGrid1.row = row4
  40.                                                                MSHFlexGrid1.col = col6
  41.                                                                 MSHFlexGrid1.CellBackColor = vbYellow
  42.                  
  43.                         End If
  44.                        End If
  45.                       End If
  46.                     Next col6
  47.                    Next col5
  48.                   Next row4
  49.                  Next col4
  50.                 Next col3
  51.                Next row3
  52.               Next col2
  53.              Next row2
  54.             Next col1
  55.            Next row1


PM Quote
Avatar
P4p3r0g4 (Member)
Guru


Messaggi: 1319
Iscritto: 29/12/2006

Segnala al moderatore
Postato alle 19:21
Sabato, 08/11/2008
Oh my GOD!
non è possibile una cosa del genere!
ci saranno 12 cicli annidati.
mi meraviglio che funzioni il tuo computer mentre gira il programma!!!
devi decisament sfrondare i cicli. ora ci do un occhiatina.

ok ammetto che non conosco il codice risolutivo a causa della mia aberrazione per i database access, quindi non ho mai neanche studiato le varie procedure di interazione tra questi e il vb.

tuttavia a quanto ho capito è una griglia pieni di dati che vanno confrontati tra loro.
per muoversi su una griglia servono due variabili contatore se lavori con 1 variabile per le righe e 1 per le colonne mentre 1 sola se lavori in resti (lasciamo perdere questo caso e lavoriamo in x e y)

anche mettendo che vuoi confrontare tutte le celle tra di loro ti serviranno al massimo 4 variabili x1,y1 ,x2,y2

for x1 = min to max
for y1= min to max
for x2 = min to max
for y2 = min to max
if cella(x1,y1) = cella(x2,y2) then
...
endif
next
next
next
next

il che sarebbe un calcolo computazionale di 19*10*19*10=36100
che non è piccolissimo ma reggibilissimo da un calcolatore.

Ultima modifica effettuata da P4p3r0g4 il 08/11/2008 alle 19:37
PM Quote
Avatar
magicolotto (Normal User)
Expert


Messaggi: 338
Iscritto: 21/01/2008

Segnala al moderatore
Postato alle 19:35
Sabato, 08/11/2008
ok grazie....


io ho cercato di mettere  le condizioni di ricerca nei punti + appripriati

gira + veloce...  ma  è sempre  lento


grazie infinite

cmq  il pc non siblocca x  fortuna

PM Quote
Avatar
P4p3r0g4 (Member)
Guru


Messaggi: 1319
Iscritto: 29/12/2006

Segnala al moderatore
Postato alle 19:59
Sabato, 08/11/2008
Aggiornato il post sopra. dimmi se ho capito bene.

PM Quote
Avatar
magicolotto (Normal User)
Expert


Messaggi: 338
Iscritto: 21/01/2008

Segnala al moderatore
Postato alle 20:25
Sabato, 08/11/2008
si hai capito ...

solo che  il confronto che devo fare  è tra  3 coppie di numeri

esempio

01-02   prima coppia
03-04 seconda coppia
05-06  terza coppia

queste tre coppie dinumeri
devono avere una particolare caratteristica

cioè essere uguali a due a due

o meglio ancora

non deve essere un numero che  non sia uguale agli altri
quindi un numero solo diverso


capito che  intendo?


PM Quote
Avatar
P4p3r0g4 (Member)
Guru


Messaggi: 1319
Iscritto: 29/12/2006

Segnala al moderatore
Postato alle 15:00
Lunedì, 10/11/2008
ehm.. no.
non capisco.
a parte che un numero che non non e` uguale agli altri vuole dire che e` uguale agli altri

A = {a | Ogni b app  B{} | not (not (a = b)) } => A = B

spiegati meglio

PM Quote
Avatar
magicolotto (Normal User)
Expert


Messaggi: 338
Iscritto: 21/01/2008

Segnala al moderatore
Postato alle 16:45
Lunedì, 10/11/2008
esempio corretto :
26-28
30-26
28-30
in questo esempio
abbiamo 3 coppie
dove ogni numero risulta due volte

esempio sbagliato :
26-28
30-26
28-29
in questo caso la condizione esclude questa formazione di tre oppie xchè i numeri non sono a due a due
cio ci  sono solo due coppie valide
26-26
28-28

oppure esempio ancora valido

26-28
26-28
26-28
tutti numeri uguali


non so se sono stato esauriente...

PM Quote
Avatar
P4p3r0g4 (Member)
Guru


Messaggi: 1319
Iscritto: 29/12/2006

Segnala al moderatore
Postato alle 16:22
Martedì, 11/11/2008
ti propongo questi processi.
a) indicizzare le coppie, quindi creare un vettore di oggetti collection contenenti gli indici del valore.
es
ind(3) sara` la collection che contiene gli indici(le coordinate) di tutti i punti contenenti il valore 3

il tempo di calcolo di questo processo e` lineare.
semplicemente
ind(val).add (indice)

a questo punto fai un ciclo per i valori(intesi come indice di ind(val)).
se il .count della collection e` uguale a 0 o a 1 allora quell'indice non avra` coppie associate, se e` maggiore di uno controlla che negli altri indici contenuti nella collection ci siano valori che si richiamano

es
ind(4) contine 65 49 93

allora se ind(val(65)) ind(val(49)) e ind(val(93)) contengono elementi in comune allora le coppie formate dai valori dell'elemento comune e le coppie i cui indici hanno dato un risulrtato positivo sono uguali due a due.

PM Quote
Avatar
GrG (Member)
Guru^2


Messaggi: 3430
Iscritto: 21/08/2007

Segnala al moderatore
Postato alle 22:29
Martedì, 11/11/2008
Ecco un esempio (nn è il massimo perchè l'ho ftt sul momento quindi ci sn dei difettucci...):
(Inserire in un form una textbox con le 3 coppie come esempio)
Codice sorgente - presumibilmente VB.NET

  1. Dim coppie() As String, conto As Integer, risultato As String, verifica() As String
  2. Private Sub Command1_Click()
  3. Text1.Text = Replace(Text1.Text, vbCrLf, "-")
  4. coppie = Split(Text1.Text, "-")
  5. Dim x As Integer, y As Integer
  6. conto = 0
  7. For x = 0 To UBound(coppie) - 1
  8.  For y = 0 To UBound(coppie) - 1
  9.   If coppie(x) = coppie(y) Then
  10.   conto = conto + 1
  11.   End If
  12.  Next y
  13.   If conto > 0 Then
  14.   risultato = risultato & conto & "-"
  15.   conto = 0
  16.   End If
  17. Next x
  18. verifica = Split(risultato, "-")
  19. If (verifica(0) <> verifica(1)) Or (verifica(0) <> verifica(2)) Or (verifica(1) <> verifica(2)) Then: Exit Sub
  20. MsgBox "coppia valida"
  21. End Sub



Poi te lo devi un pò aggiustare e adattare alle tue esigenze...

Spero di aver capito ciò che intendi...

:ot: Paperoga quanti anni fai?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo