Autore Topic: Aggiungere pagine ad un Tabstrip via codice  (Letto 9380 volte)

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #15 il: 13 Febbraio 2008, 13:00:39 »
Citazione
Se la form dov'è la TabStrip si chiama FMain, perché
scrivi FormTabStrip?
Deve essere:


PUBLIC SUB Button1_Click()
'Collegamento alla Macro insertTab del Form main
 FMain.InsertTab()
END


e assicurati nelle proprietà del progetto che i controlli delle form
siano PUBLIC. ciao.


Hai ragione adesso funziona.
Grazie e ciao.

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #16 il: 01 Aprile 2008, 22:00:56 »
Ciao a tutti, avrei bisogno di un aiutino, allora lavorando con le tabstrip mi ritrovo in questa situazione(probabilmente è una cosa semplice ma data la mia inesperienza e minima conoscenza, sto imparando, mi risulta come una cosa difficile) allora ho un form, nel quale ho un tasto e una textbox e una tabstrip con una sola pagina, ora al click del tasto mi aumenta di una pagina ma non ho capito come posso rinominarla, io scrivi cosi:
Codice: [Seleziona]
TabStrip1.Count = TabStrip1.Count +1
TabStrip.Text = TextBox3.Text

Ma, non va. chi mi aiuta?
Se volessi poi nominare una pagina che già esiste come dovrei fare?
E, un'ultima cosa, se volessi eliminare una pagina magari non l'ultima come faccio a farlo in base al testo della linguetta?
Ciao e grazie.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #17 il: 02 Aprile 2008, 09:50:14 »
Purtroppo la TabStrip è un'oggetto un pò ostico, e può presentare parecchi problemi se viene usato in modo dinamico.

Fai conto che sia un insieme di pannelli distinti, e uniti da una logica comune.

Per modificare una pagina (sempre che sia presente), devi prima posizionarti sulla medesima e modificarne le proprietà. Tieni presente che le proprietà che vedi, sono quelle della pagina corrente, per cui devi fare attenzione se per esempio, non sia presente alcuna pagina. La cosa provoca errore e ti và in crash il programma.

Come ti hanno suggerito nei precedenti post, la proprietà comune Count, ti permette di definire dinamicamente il numero di tab (o pagine) presenti, ma tieni presente che devi controllare sempre la Index per vedere dove sei realmente, e poter agire di conseguenza.

NOTA IMPORTANTE: Gli oggetti che crei dinamicamente in una tab, non vengono eliminati automaticamente quando elimini la tab che li contiene; purtroppo esiste un problema a livello di libreria che non ti permette neppure di eliminare gli oggetti manualmente, per cui rimane tutto appeso. L'unica soluzione che ho trovato è quella di riassegnare la parent di questi oggetti ad un'altro oggetto contenitore (magari nascosto), e poi cancellare la tab. Se non è chiara, spiegherò la nota più avanti.

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #18 il: 02 Aprile 2008, 21:56:51 »
Grazie, però non ho ben capito una cosa, ritrovandomi sulla "linguetta" alla quale modificare il nome che tipo di codice dovrei inserire?
non ho ben capito il discorso dell'eliminazione delle pagine e dei vari oggetti in essa contenuti.
Grazie mille. Ciao.

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #19 il: 02 Aprile 2008, 22:59:09 »
Citazione

md9327 ha scritto:
NOTA IMPORTANTE: Gli oggetti che crei dinamicamente in una tab, non vengono eliminati automaticamente quando elimini la tab che li contiene; purtroppo esiste un problema a livello di libreria che non ti permette neppure di eliminare gli oggetti manualmente, per cui rimane tutto appeso. L'unica soluzione che ho trovato è quella di riassegnare la parent di questi oggetti ad un'altro oggetto contenitore (magari nascosto), e poi cancellare la tab. Se non è chiara, spiegherò la nota più avanti.


Scusa md9327 se intervengo sulla tua risposta, però riguardo il discorso della eliminazione manuale non mi torna qualcosa, nel senso:
se ho una TabStrip con 3 "pagine" (Tab0,Tab1,Tab2) ed ognuna contiene degli oggetti è vero che non posso eliminare una o più Tab diciamo "brutalmente", però con il seguente metodo è possibile, per esempio voglio eliminare Tab2, cancello tutti gli oggetti al suo interno e riporto indietro di una posizione la proprietà Count, nel caso volessi eliminare la Tab centrale (Tab1) eseguo la stessa procedura descritta prima, ma prima di riportare indietro Count clikko con il tasto dx del mouse sulla Tab e dal menu Sposta Tab seleziono ultimo poi elimino la Tab1.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #20 il: 03 Aprile 2008, 14:32:16 »
Per rispondere a Lux:

usa le due istruzioni che avevi scritto tu stesso.


Per rispondere a Tornu:

il problema di fondo è che in gambas non è presente ancora una vera logica di eliminazione degli oggetti, se non per alcuni casi.
Nel caso delle tab, anche se tu cancelli gli oggetti, la tab stessa mantiene i riferimenti in memoria a tali oggetti, per cui, quando si tenza la cancellazione della tab, ti abortisce a causa di riferimenti attivi.
Questa cosa, purtroppo, l'ho scoperta parecchio tempo addietro e, finora, non mi sembra che sia stata corretta.
Come hai descritto tu stesso, la logica sembra abbastanza normale: elimini gli oggetti, poi la tab, e poi ti punti sulla prima tab buona (tanto per non creare problemi, ovviamente). Questa cosa non funziona, almeno sinora, per la TabBox.

- Per alcuni oggetti esiste il medoto Delete(), per altri no;
- Se associ un'oggetto ad un Container, oltre ad avere la variabile che punta all'oggetto, lo ha anche il Container e, cancellare una variabile in Gambas (es. messa pure a NULL), non azzera anche gli altri puntamenti o elimina l'oggetto fisicamente in memoria, ma solo la variabile intesa come nome. Stesso problema anche per la variabile che ha effettivamente allocato la memoria per la creazione dell'oggetto.

In gambas tocca fare attenzione a queste cose, specialmente all'uso che si fà delle variabili (sia locali che pubbliche), perchè altrimenti si incorre in problemi come questi, oppure anche a errori di "circular reference" (che forse qualcuno ha potuto constatare in qualche messaggio di warning).

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #21 il: 03 Aprile 2008, 19:31:27 »
Allora, il codice che inserisco
Codice: [Seleziona]
TabStrip1.count = TabStrip1.Count +1
TabStrip1.Caption = TextBox3.Text

Funziona a metà, cioè, mi inserisce la nuova pagina ma non la chiama col testo inserito nel textbox. La lascia vuota
Il testo del textbox lo usa per rinominare la pagina selezionata(che è l'unica esistente, dato che il mio programma ha per defautl una sola linguetta e poi dovrebbe dare la possibilità di inserirne delle nuove.
quindi credo d'aver capito che per rinominare la linguetta appena creata devo prima selezionarla e vorrei farlo in automatico ma non  ho capito come.
Ciao.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #22 il: 03 Aprile 2008, 19:43:47 »
Codice: [Seleziona]
TabStrip1.count = TabStrip1.Count + 1
TabStrip1.Index = TabStrip1.count - 1
TabStrip1.Caption = textbox3.text



in questo modo a me funziona benissimo  :-)

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #23 il: 03 Aprile 2008, 23:25:09 »
Ok, ci sono riuscito!
Ho inserito anche un codice al contrario in modo da eliminare un pagina con un  determinato nome che però non sia necessariamente l'ultima,
Codice: [Seleziona]
 TabStrip1.Count = TabStrip1.Count - 1  
TabStrip1.Index = Tabstrip1.Count - 1
 Tabstrip1.Caption = Textbox3.Text

e funziona.
Grazie.
PS: non ho capito però la questione sugli oggetti contenuti in una pagina....

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #24 il: 04 Aprile 2008, 11:22:39 »
E' probabile che quanto ho scritto, non sia più un problema, ma all'epoca dell'uscita della 2.0.0 avevo rifatto delle prove e il problema con i tab dinamici c'era ancora.

Quello che volevo dire, in poche parole, è che la creazione dinamica di oggetti all'interno di una TabBox, e in particolare in corrispondenza con la creazione di nuove tab, ha dei problemi in cancellazione quando la tab viene poi rimossa.

La causa di ciò è causata dal fatto che la cancellazione della tab non elimina anche i suoi figli, almeno per quanto riguarda gli oggetti creati dinamicamente. Anche eliminandoli manualmente (es. con Delete() o var=NULL), questi rimangono referenziati all'interno della tab contenitrice e, se si prova ad eliminarla, il programma và in crash.

NOTA: Quando si creano oggetti all'interno di un contenitore (come ad esempio una TabBox), per poter gestire gli eventi dei singoli oggetti, è necessario agganciarli al contenitore stesso; per questa operazione viene usato un metodo di Object:

Codice: [Seleziona]
Attach(, , )


in questo modo tutti gli eventi dei nuovi oggetti verranno catturati dal suo contenitore, e si può quindi gestire dinamicamente il giochetto.
Quando l'oggetto dinamico non serve più, è necessario fare l'operazione contraria, con un'altro metodo statico di Object:

Codice: [Seleziona]
Detach()


fatto ciò, l'oggetto si può eliminare, agendo in due modi:

Codice: [Seleziona]

.Delete()
= NULL


La cosa è abbastanza normale, e ha anche una logica seguita nella maggior parte di altri linguaggi; ma il problema invece è che, per motivi non meglio identificati, il riferimento all'oggetto cancellato viene mantenuto dagli oggetti cui ha fatto parte, rendendo problematica una eventuale eliminazione di questi ultimi.

Spero di aver girato meglio il discorso; se poi qualcuno ha avuto diversa esperienza, o ha trovato qualche trucco per risolvere, ben venga.

Bye

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #25 il: 04 Aprile 2008, 14:44:29 »
Codice: [Seleziona]
Ok, ci sono riuscito!
Ho inserito anche un codice al contrario in modo da eliminare un pagina con un determinato nome che però non sia necessariamente l'ultima,

[code]TabStrip1.Count = TabStrip1.Count - 1  
[code]TabStrip1.Index = Tabstrip1.Count - 1

 Tabstrip1.Caption = Textbox3.Text[/code]

e funziona.[/code]

Purtroppo devo rimangiarmi le parole il codice non elimina la pagina indicata dal textbox ma solamente la penultima, come si nota dal codice
Codice: [Seleziona]
TabStrip1.Index = Tabstrip1.Count - 1
che se ho ben capito mi sposta sulla penultima linguetta
soluzioni?

Se ho ben capito il problema dei tab dinamici e degli oggetti in esso inseriti si ha se questi vengono inseriti solo a livello di codice ma se invece li inserisco io  prima (quindi senza il codice) questo problema non dovrei averlo?

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #26 il: 04 Aprile 2008, 17:16:07 »
Bè, dato che disegni staticamente gli oggetti, e se non devi toglierli e crearli dinamicamente, allora funziona tutto.

Ti ricordo che gli indici dei tab, partono da 0 (zero), fino a TabBox.Count - 1, per cui se elimini una tab, devi capire dove poi devi posizionarti, tenendo presente che il contatore ovviamente si decrementa.

La cosa che devi assolutamente controllare, è se per caso non esistano più tab, nel qual caso che fai ? Credo che a questo punto ti tocca nascondere la TabBox (Visible=FALSE), e magari ritornare a visualizzarla alla successiva creazione di una tab.

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #27 il: 05 Aprile 2008, 23:40:07 »
No, non va come vorrei....disiamo che io ho creato 5 linguette e volessi eliminare la terza, come mi ritrovo ora dovrei selezionare quella accanto (la quarta) per eliminare appunto la 3... altrimenti?

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #28 il: 07 Aprile 2008, 13:37:39 »
Se tu elimini la 3, la quarta diventa terza, la quinta quarta, e così via...
Quindi la terza te la trovi sempre, solo che non è la stessa di prima.

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Aggiungere pagine ad un Tabstrip via codice
« Risposta #29 il: 08 Aprile 2008, 17:29:58 »
mmmm...non l'ho capita... io ho 5 linguette nominate in questo modo:
luigi, antonio, marco, andrea, ugo
diciamo che voglio eliminare marco, tu mi dici che lo elimino?
io mi ritrovo in questo modo:
luigi, antonio, marco, andrea
??????
Sto impazzendo....