Autore Topic: [Risolto]Dove sto sbagliando?  (Letto 1778 volte)

Offline Tiziano60

  • Gambero
  • **
  • Post: 53
    • Mostra profilo
[Risolto]Dove sto sbagliando?
« il: 18 Aprile 2010, 21:59:45 »
Salve a tutti

Ho seguito con attenzione quello che è stato scritto a proposito del gruppo dei controlli e in particolare questo:

Se i tupi button hanno come group, ad esempio, Button allora devi fdare così:

Codice: [Seleziona]
  i = 0
  FOR EACH hcontrol IN ME.Children
    'se il tipo l'oggetto è un Button
    IF Object.Type(hcontrol) = "Button" THEN
      'imposto il background
      hcontrol.background = Color.Red
      INC i
    ENDIF  
  NEXT
Questo esempio, l'ho usato per leggere un database in formato .txt e trasportare i vari campi in altrettante label
Questo è il codice usato

DIM Oggetto AS Object
  DIM K AS Integer
  Campo = 1
   FOR k = campo TO 57 ' i campi sono 57 come le label che contiene il form
  
  FOR EACH Oggetto IN ME.Children
    
    IF Object.Type(Oggetto) = "Label" THEN
      
      Oggetto.text = (db[record, k]) ' Db è di tipo new string [10000,5000]
      INC K
       ENDIF  
  NEXT
  NEXT

Fin qui, tutto bene!..e il codice funziona, ma quando in un altro form, voglio aggiungere dei dati al file, il codice non funziona più
Questo è quello che ho scritto per l'iserimento dei dati

DIM Oggetto AS Object
  DIM K AS Integer
 hFile=OPEN percorso FOR APPEND
 
Campo = 1
   FOR k = campo TO 57 ' i campi sono 57 come le textbox che contiene il form
  
  FOR EACH Oggetto IN ME.Children
    
    IF Object.Type(Oggetto) = "TextBox" THEN ' in questo caso, si tratta di textbox e non di label
      
    PRINT # hfile, Oggetto.text
      INC K
       ENDIF  
  NEXT
  NEXT

Tutto questo, era per evitare di scrivere per 57 volte la stessa istruzione
faccio un esempio:

Dati= textbox1.text & textbox2.text & textbox3.text....avanti così fino a ...& textbox57.text
PRINT #hfile,dati
Dove sto sbagliando?
« Ultima modifica: 21 Aprile 2010, 12:01:58 da Tiziano60 »

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Dove sto sbagliando?
« Risposta #1 il: 18 Aprile 2010, 22:17:26 »
Ma esattamente cosa succede per dire "non funziona più"?
Hai messaggi di errore, comportamenti differenti da quanto voluto, ecc..?

P.S.:
perché incrementi a mano la variabile gestita dal ciclo FOR..NEXT?
« Ultima modifica: 18 Aprile 2010, 22:19:35 da leo72 »
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Tiziano60

  • Gambero
  • **
  • Post: 53
    • Mostra profilo
Re: Dove sto sbagliando?
« Risposta #2 il: 18 Aprile 2010, 22:34:49 »
non c'è un errore vero e prorio
l'errore lo trovo nel file, che al posto del dato che doveva inserire della textbox, scrive il testo di una label che descrive la textbox

per esempio:
ho una label con caption "NOME"...e ho una textbox  dove inserisco "ANTONIO"

invece di inserire "ANTONIO", nel file trovo scritto "NOME"


Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Dove sto sbagliando?
« Risposta #3 il: 18 Aprile 2010, 22:39:00 »
E scommetto che in quella form hai solo 57 label e 57 textbox, vero?
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Tiziano60

  • Gambero
  • **
  • Post: 53
    • Mostra profilo
Re: Dove sto sbagliando?
« Risposta #4 il: 18 Aprile 2010, 22:49:36 »
E scommetto che in quella form hai solo 57 label e 57 textbox, vero?


no

si tratta un progetto che riguarda il gioco del lotto

ci sono 11 label con il nome delle ruote e 55 textbox che riguardano le estrazioni (5  X 11 ruote) + 2 textbox che riguardano la data e il numero del record

In visual basic usavo creare una matrice di controlli

Dim I as integer
for i =0 to 57

PRINT textbox(i).text
 
Sinteticamente, il codice era questo...ma in Gambas, è tutto po' diverso e non sempre riesco a ottenere quello che voglio e molto spesso devo scrivere a cascata o con un codice eternamente lungo..

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Dove sto sbagliando?
« Risposta #5 il: 19 Aprile 2010, 00:27:02 »
Forse è il caso che alleghi i sorgenti con annesso db se possibile....

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Dove sto sbagliando?
« Risposta #6 il: 19 Aprile 2010, 01:29:33 »
bisogna vedere il codice per capirne di più
da quello che scrivi mi sembra di capire che hai copiato del codice da visulbasic che funzionava con gli indici.

qui non ci sono indici ai controlli in alternativa puoi usare last.tag modificando un pò il codice.

Offline Tiziano60

  • Gambero
  • **
  • Post: 53
    • Mostra profilo
Re: Dove sto sbagliando?
« Risposta #7 il: 20 Aprile 2010, 01:02:11 »
Questo è il Db...è in formato .txt
Il Db, è troppo lungo per scriverlo tutto (circa 6800 righe)...vi scrivo soltanto le ultime 3 righe

Codice: [Seleziona]
16/03/2010 189 85 79 65 56 40 29 2 6 88 71 10 27 57 29 65 33 43 1 15 82 37 51 36 34 33 75 4 81 36 56 53 82 83 14 70 41 88 77 75 26 19 89 32 16 57 73 81 74 30 89 53 86 9 60 4
18/03/2010 190 16 48 41 74 87 72 51 17 60 45 4 20 44 2 62 23 1 48 20 55 77 22 48 38 80 68 78 38 58 67 59 66 46 13 45 59 28 38 53 22 37 18 1 38 51 56 32 30 70 2 8 13 62 69 27
20/03/2010 191 46 65 34 29 24 64 84 26 20 38 80 50 45 42 58 70 50 11 39 16 9 82 18 24 75 38 80 74 39 79 59 31 84 35 67 56 15 5 68 45 3 39 6 18 25 41 35 12 30 70 47 85 16 36 52

Questo è il codice che uso per leggere il Db e trasportare ogni campo in una label

Codice: [Seleziona]
PUBLIC Db AS NEW String[10000, 5000]
PUBLIC Record AS Integer
PUBLIC Campo AS Integer

PUBLIC SUB Form_Open()
ME.center
Leggi
textlabel13.Caption = label2.caption
textlabel12.Caption = "Ultima estrazione inserita N°"
textlabel14.Caption = "del"
textlabel15.Caption = label1.Caption
IF label2.Caption = textlabel13.Caption THEN
   Avanti.Enabled = FALSE
   ENDIF
END
PUBLIC SUB Leggi()
DIM i, x, z AS Integer

DIM percorso, sLine AS String
DIM hFile AS File
campo = 0
record = 0

percorso = User.Home & "/KdeLotto/DataB/Archivio.txt"

  hFile = OPEN percorso FOR INPUT

WHILE NOT Eof(hFile)
  LINE INPUT #hFile, sLine
 x = Len(sLine)     'mette in x il numero di caratteri della stringa in esame
 record = record + 1 'aumenta di uno il contatore dei record
 campo = 1 'parte dal primo campo
 z = 0 ' serve da promemoria per spazi separatori di campo
 
 FOR i = 1 TO x 'imposta il ciclo per prelevare i caratteri uno alla volta
 
  IF Mid(sLine, i, 1) <> " " THEN 'controllo se il carattere non è uno spazio
     IF z = 1 THEN ' se è uno spazio allora
         z = 0
        campo = campo + 1 'incremento il contatore dei campi
     ENDIF
 db[record, campo] = db[record, campo] & Mid(sLine, i, 1) ' salvo nel vettore  il carattere prelevato con Mid
 ELSE ' se il carattere è uno spazio invece...
 z = 1 'z mi ricorda che ho trovato un separatore di campo
 
 ENDIF
 NEXT
 WEND 
    Esegui

END

PUBLIC SUB Esci_Click()
 ME.close

END
PUBLIC SUB Esegui()


DIM Oggetto AS Object
  DIM K AS Integer
  Campo = 1
   FOR k = campo TO 57 ' i campi sono 57 come le label che contiene il form
   
  FOR EACH Oggetto IN ME.Children
   
    IF Object.Type(Oggetto) = "Label" THEN
     
      Oggetto.text = (db[record, k])
      INC K
     
     
    ENDIF   
  NEXT
  NEXT

END


PUBLIC SUB Indietro_Click()  ' il pulsante mi servre per scorrere indietro di 1 riga alla volta

  DIM Oggetto AS Object
  DIM K AS Integer
  Avanti.Enabled = TRUE
  Campo = 1
  record = record - 1
   FOR k = campo TO 57
   'i = record
  FOR EACH Oggetto IN ME.Children
    'se il tipo l'oggetto è una Label
    IF Object.Type(Oggetto) = "Label" THEN
      'imposto il text
      Oggetto.text = (db[record, k])
      INC K
ENDIF
NEXT
NEXT
END

PUBLIC SUB Avanti_Click() ' scorre in avanti tra i record
DIM Oggetto AS Object
  DIM K AS Integer
 
  IF label2.Caption = textlabel13.Caption THEN
   Avanti.Enabled = FALSE
   
   ELSE
 
  Campo = 1
  record = record + 1
   
   FOR k = campo TO 57
   'i = record
   
  FOR EACH Oggetto IN ME.Children
    'se il tipo l'oggetto è una Label
   
   
    IF Object.Type(Oggetto) = "Label" THEN
      'imposto il text
      Oggetto.text = (db[record, k])
 
   
 INC K
  END IF   
  NEXT
 NEXT
 END IF

END

Il form è formato da 11 textlabel con i nome delle ruote e da 57 label per visualizzare i vari campi

Fin qui, tutto bene!

adesso, con un'altro form più o meno uguale all'altro (al posto delle 57 label, ci sono 57 textbox) vorrei aggiungere altre righe, ma putroppo, con i codice che ho postato all'inizio, non riesco

L'unico sistema che conosco in gambas, sarebbe quello di scrivere:

PRINT #Hfile, textbox1.text & "" & textbox2.text & "" &....ecc..ecc.. fino ad arrivare alla ultima textbox

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Dove sto sbagliando?
« Risposta #8 il: 20 Aprile 2010, 13:25:41 »
io al posto tuo avrei utilizzato una tableview invece di tante label...

cmq per il tuo problema potresti fare una cosa del genere:

Codice: [Seleziona]

PUBLIC SUB Button1_Click()

  DIM Oggetto AS Object
  DIM i AS Integer
  DIM s AS String
  DIM data AS String
  DIM string AS String
  
  i = 1
  
  stringa = data & " "
   FOR EACH Oggetto IN ME.Children
  
  
      IF Oggetto.name = "TextBox" & i THEN
          
          stringa = stringa & oggetto.text & " "
      ENDIF
      INC i
    NEXT
    
    stringa1 = File.Load(percorso e nome file di testo)' carico il file dove sono presenti altre estrazioni
    
    stringa1 = stringa1 & "\n" & stringa 'aggiungo le estrazioni odierne
    
    file.Save(percorso e nome file, stringa1)' salvo il file
    
END

ps:visto che siamo su gambas io preferisco utilizzare   texlabel.text piuttosto che textlabel.caption

Offline Tiziano60

  • Gambero
  • **
  • Post: 53
    • Mostra profilo
Re: [Risolto]Dove sto sbagliando?
« Risposta #9 il: 21 Aprile 2010, 12:21:36 »
Problema risolto!!

..dire che avevo la soluzione sotto al naso e non me n'ero accorto...bastava scrivere TextBox" & i per creare una sorta di indice

Senza mettere le mani le codice del mio progetto, ho voluto crearne un'altro da tenere come esempio (non si sa mai!  :D)
 ...è un normalissimo form con dentro 4 TextBox e un pulsate

Questo è il codice

Codice: [Seleziona]
PUBLIC Percorso AS String
PUBLIC hFILE AS FILE

PUBLIC SUB Form_Open()
  Percorso = User.Home & "/EsempioScrittura/MioFile.txt"
  hfile = OPEN Percorso FOR APPEND
ME.center
END

PUBLIC SUB Salva_Click()
  DIM Oggetto AS Object
  DIM i AS Integer
  DIM Stringa AS String
 
  FOR EACH Oggetto IN ME.Children
  FOR i = 1 TO 4

      IF Oggetto.name = "TextBox" & i THEN
 
          Stringa = Stringa & Oggetto.Text & " "

       ENDIF

    NEXT
 
  NEXT
   PRINT #hfile, stringa ' aggiungo il contenuto delle 4 Textbox
    CLOSE #file
END

Grazie a tutti

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: [Risolto]Dove sto sbagliando?
« Risposta #10 il: 21 Aprile 2010, 14:56:41 »
Allora potrebbe funzionare anche con un più semplice
Codice: [Seleziona]
IF Instr(Oggetto.Name,"TexBox") THEN
?
Visita il mio sito personale: http://www.leonardomiliani.com

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: [Risolto]Dove sto sbagliando?
« Risposta #11 il: 21 Aprile 2010, 22:57:29 »
Problema risolto!!

..dire che avevo la soluzione sotto al naso e non me n'ero accorto...bastava scrivere TextBox" & i per creare una sorta di indice

Senza mettere le mani le codice del mio progetto, ho voluto crearne un'altro da tenere come esempio (non si sa mai!  :D)
 ...è un normalissimo form con dentro 4 TextBox e un pulsate

Questo è il codice

Codice: [Seleziona]
PUBLIC Percorso AS String
PUBLIC hFILE AS FILE

PUBLIC SUB Form_Open()
  Percorso = User.Home & "/EsempioScrittura/MioFile.txt"
  hfile = OPEN Percorso FOR APPEND
ME.center
END

PUBLIC SUB Salva_Click()
  DIM Oggetto AS Object
  DIM i AS Integer
  DIM Stringa AS String
 
  FOR EACH Oggetto IN ME.Children
  FOR i = 1 TO 4

      IF Oggetto.name = "TextBox" & i THEN
 
          Stringa = Stringa & Oggetto.Text & " "

       ENDIF

    NEXT
 
  NEXT
   PRINT #hfile, stringa ' aggiungo il contenuto delle 4 Textbox
    CLOSE #file
END

Grazie a tutti


aspita...
questa non la sapevo. addirittura si possono usare gli indici.
gambas mi stupisce sempre di più. mi sa che il gamberetto è poco pubblicizzato.

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: [Risolto]Dove sto sbagliando?
« Risposta #12 il: 22 Aprile 2010, 00:37:33 »
Non corriamo...diciamo che il metodo usato non sfrutta gli indici così come fanno altri linguaggi tipo visual basic.....gli indici richiamerebbero la textbox semplicemente con

Codice: [Seleziona]
textbox[i].text

mentre il metodo qui illustrato è una "pezza" al metodo degli indici....
« Ultima modifica: 22 Aprile 2010, 01:51:18 da Ceskho »

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: [Risolto]Dove sto sbagliando?
« Risposta #13 il: 22 Aprile 2010, 00:40:49 »
Non corriamo...diciamo che il metodo usato non sfrutta gli indici così come fanno altri linguaggi tipo visual basic.....gli indici richiamerebbero la textbox semplicemente con

textbox.text

mentre il metodo qui illustrato è una "pezza" al metodo degli indici....
vero qui non si possono mettere gli indici, ma sfruttando il n° delle tex come indice si possono utilizzare nei cicli, se poi ci aggiungiamo last.tag la cosa diventa molto interessante e più performante di visuabasic

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: [Risolto]Dove sto sbagliando?
« Risposta #14 il: 22 Aprile 2010, 00:45:25 »
Non corriamo...diciamo che il metodo usato non sfrutta gli indici così come fanno altri linguaggi tipo visual basic.....gli indici richiamerebbero la textbox semplicemente con

textbox.text

mentre il metodo qui illustrato è una "pezza" al metodo degli indici....
vero qui non si possono mettere gli indici, ma sfruttando il n° delle tex come indice si possono utilizzare nei cicli, se poi ci aggiungiamo last.tag la cosa diventa molto interessante e più performante di visuabasic

Che sia più performante non so dirlo...bisognerebbe vedere cosa c'è dietro l'uso degli indici di VB...