Da Classe a Control (VB2005)

lunedì 02 febbraio 2009 - 16.58

dando Profilo | Newbie

Ciao a tutti, ho un preblama su cui sto sbattendo la testa da giorni.
Ho creato una classe a cui bisgna passare una picturebox. Questa classe ha poi delle sub per assegnare delle serie di punti, delle rette ecc e per il disegno di grafici in scala, traslazioni, zoom e quant'altro.ho poi collegato le funzioni per le traslazioni e zoom con gli eventi della picturebox in maniera tale ad esempio che con il mouswheel attiva la funzione zoom della classe. E fin qui tutto bene.
Quello che non riesco a fare è implementare un control derivato da una picturebox che gestisce in automatico gli eventi.
A volte mi da problemi direttamente con l'inizializzazione del controllo, a volte non mi carica il controllo e il piu delle volte mi da dei valori predefiniti che non riesco a modificare. Riporto le prime righe:

Public Class Grafico

Inherits System.Windows.Forms.PictureBox

Dim m_txi, m_tyi, m_sxi, m_syi As Double
Dim m_tx, m_ty, m_sx, m_sy As Double

'dimensioni del disegno figlie delle dimesnioni della picturebox
Dim m_B As Integer = Me.Width
Dim m_H As Integer = Me.Height

Dim m_img As Bitmap = New Bitmap(m_B, m_H)
Dim g As Graphics = Graphics.FromImage(m_img)


Il problema e che ad esempio me.widht=100 e me.height=50 sempre in automatico
Insomma non riesco ad inizializzarlo.
Il problema con la classe non si poneva perche nella sub new della classe gli passavo la picturebox e in automatico ricavavo altezza, larghezza, creavo l'oggetto graphics e la bitmap. Qualcuno mi saprebbe dare una mano. Ah... particolare. Uso vb express 2005 che mi pare di aver capito che è un po limitato nella creazione degli usercontrols
Ciao

Andrea


Jeremy Profilo | Guru

Io il tuo problema non l'ho capito proprio bene bene bene....
Riguardo a questo:
>mi pare di aver capito che è un po limitato nella creazione degli usercontrols
non è assolutamente vero che le versioni express sono limitate nella creazione degli user controls....se mai, sono limitati nella presenza di modelli già predefiniti!!!

Comunque se spieghi un pò meglio il tuo problema....tento di aiutarti.

Facci sapere...
Ciao

dando Profilo | Newbie

Ok, la strada che ho cercato di seguire comunque non utilizzava gli usercontrol (ma per la legge di murphy la strada che ho preso è di sicuro quella sbagliata ). Non credo possa essere utile spiegare cosa deve fare questo controllo ma cerca di spiegare meglio il problema
Il controllo è una picturebox modificata con delle funzioni, delle sub e delle sottoclassi che ho aggiunto io.
Per funzionare pero ha bisogno di dichiarare a livello di classe delle variabili ovvero la larghezza e l'altezza della picturebox.
se io dichiaro a livello di classe m_w e m_h (cioe la larghezza e l'altezza) per poi usarle per le funzioni che ho scritto non riesco pero ad assegnare loro
gli effetivi valori. Se assegno i valori direttamente nella dichiarazione a livello di classe ovvero

dim m_w as integer= me.width

questo non mi assegna l'effettiva larghezza della picurebox ma 100... Perche 100??? non so ma è cosi.
non riesco ad assegnare le dmensioni del controllo al volo. D'altra parte non posso metterle fisse perche se nel designer del form stirassi
le dimensioni della picturebox in modo da variarne altezza e larghezza, dovrei assegnare alle due variabili m_w e m_h le nuove dimensioni del controllo.
Non so se mi sono spiegato ma se vuoi ti posto tutto il codice cosi puoi debuggarlo e capire cosa intendo.


Jeremy Profilo | Guru

Quando tu scrivi dim m_w as integer= me.width, se questa dichiarazione è scritta all'interno del tuo controllo, ME è riferito al tuo controllo...non al form.
Quindi 100 sarà la dimensione predefinita del tuo controllo

Se ho capito bene il tuo problema ti basterebbe creare un overloads del costruttore all'interno della tua classe tramite il quale passi i valori delle dimensioni

Public sub new(byval height as integer,byval width as integer) tuocontrollo.Height=height tuocontrollo.width=width end sub

In questo modo non credo tu possa però trascinare il tuo controllo sul form....ma soltanto crearlo a runtime.

Altrimenti dovresti valutare,a livello di classe, la proprietà (se non sbaglio) Container nel caso di componenti e Parent nel caso di controlli per recuperare chi contiene il tuo controllo e quindi ottenere le dimensioni.

Facci sapere...

dando Profilo | Newbie

"Se ho capito bene il tuo problema ti basterebbe creare un overloads del costruttore all'interno della tua classe tramite il quale passi i valori delle dimensioni"

Piu o meno è cosi. Il problema è che la classe l'ho gia creata e funziona perfettamente. E come dicevi tu ho creato un overloads dove gli passo direttamente la picturebox da cui ricavo larghezza ed altezza

"In questo modo non credo tu possa però trascinare il tuo controllo sul form....ma soltanto crearlo a runtime."

E proprio questo il problema. Che un controllo non ha una sub new e non so quando andare a intercettare le larghezze e lunghezze

Al momento sto provando a gestire l'evento HandleCreated interno al controllo stesso e sembra ottenere i giusti valori

Sub Creato(ByVal sender As Object, ByVal e As EventArgs) Handles Me.HandleCreated
m_B = Me.Width
m_H = Me.Height
End Sub

Ora seguo questa strada. Se dovessi avere problemi mi faccio risentire. Altrimenti grazie mille!

dando Profilo | Newbie

Ok. Credo di aver risolto come dicevo con l'evento HandleCreated che mi funziona per l'inizializzazione del controllo
Forse un po grezzo ma tutto sommato efficace.
Se può interessare allego la libreria del controllo. (qui sopra a destra della data)
Grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5