Oppure

Loading
15/09/21 12:24
Michele79
Buongiorno a tutti, sto traducendo un programma che crea un disegno tecnico su una picture box da VB6 a VB.NET:
le stesse routine di disegno vengono applicate su due form differenti ma, mentre su un form il programma disegna correttamente, nell'altro form da errore "loggetto è correntemente utilizzato altrove).
Io dichiaro ne form:

Public PicDrawing As Graphics
...
PicDrawing = PicDrawingPB.CreateGraphics
PicDrawing.PageUnit = GraphicsUnit.Millimeter
...
poi passo come parametro alle varie routine che creano il disegno la variabile PicDrawing.
Non riesco a capire perché in un form funziona e nell'altro no.

Grazie per l'aiuto

P.S. Ho sempre programmato in VB6 e da 2 anni a questa parte sto traducendo i programmi in VB.NET da autodidatta.
15/09/21 18:35
Carlo
le picturebox sui due form hanno lo stesso nome ma le identifichi distintamente?

Dal codice non si capisce se PicDrawingPB.CreateGraphics è all'interno di routine distinte contenute nei forms...

Un progetto con due forms contenenti una picturebox ciascuna dove disegni una riga, e ci mostri che non ci riesci, si può debuggare. :rofl:

Per esempio se crei un progetto con due forms che contengono una picturebox ciasuno di nome PicDrawingPB

Public Class Form1
    Public PicDrawing As Bitmap
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Disegnare su una bitmap in ram è molto più veloce che disegnare su una picturebox esposta
        ' creo una bitmap delle stesse dimensioni della picturebox
        PicDrawing = New Bitmap(PicDrawingPB.ClientSize.Width, PicDrawingPB.ClientSize.Height)
        ' uso la bitmap come layer grafico
        Dim g As Graphics = Graphics.FromImage(PicDrawing)
        ' imposto l'unità di misura
        g.PageUnit = GraphicsUnit.Millimeter
        ' disegno una riga arancione sulla bitmap in ram
        g.DrawLine(Pens.Orange, 5, 5, 20, 20)
        ' trasferisco la bitmap nel background della picturebox sul form1
        Me.PicDrawingPB.BackgroundImage = PicDrawing
        ' rendo la picturebox sul form2, delle stesse dimensioni della bitmap
        Form2.PicDrawingPB.Size = PicDrawing.Size
        ' trasferisco la bitmap nel background della picturebox sul form2
        Form2.PicDrawingPB.BackgroundImage = PicDrawing
        ' Mostro il form2 che contiene la seconda picturebox
        Form2.Show()
        ' libero la ram
        g.Dispose()
    End Sub
End Class


Ultima modifica effettuata da Carlo 15/09/21 20:21
in programmazione tutto è permesso
16/09/21 7:55
Michele79
Grazie Carlo, utilizzerò sicuramente il disegno su bitmap, ma il problema non cambia.
Cerco di descrivere la cosa in poche parole anche se è un po' complessa (per questo motivo mi viene difficile inserire tutte le righe di codice :)):

- Sia Form1 che Form2 lanciano una routine per il disegno in pianta (mtdPianta) di una struttura che risiede in un modulo passando come parametro l'oggetto graphics.
- mtdPianta lancia delle routine per disegnare i singoli elementi della pianta (mtdElemento1, mtdElemento2, ...)
- mtdElemento1 apre un DB access dove sono salvati tutti i punti e i comandi per disegnare gli elementi, li traduce e li passa a delle routine base per disegnare:
ad esempio
MLinea(ByRef Destinazione As Graphics, X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, prmpenna As Pen)
disegna una linea (drawline) su destinazione dalle coordinate X1,Y1 alle coordinate X2,Y2 utilizzando la pen prmpenna.

Form1 è all'inizio del progetto e serve a fare vedere la pianta mentre si scelgono le varie caratteristiche della struttura mentre Form2 è alla fine ed è il risultato finale con la possibilità di stampa della piantina.

Su Form2 il disegno in pianta viene disegnato e si vede correttamente mentre su Form1 no e da errore "l'oggetto e correntemente utilizzato altrove" su Destinazione e quindi non disegna nulla.
16/09/21 18:22
Carlo
MLinea(ByRef Destinazione As Graphics...

l'oggetto grafico Destinazione, passato ByRef, fa si che l'oggetto passato sia a tutti gli effetti lo stesso dell'oggetto ricevuto, non lo puoi richiamare più volte per eseguire operazioni su oggetti distinti.
Prova ByVal, ma dubito che sia sufficiente.

Quando richiami MLinea per operare su un nuovo oggetto grafico, prima dovresti distruggere quello vecchio, ma senza codice sottomano è tutto da verificare.
Ultima modifica effettuata da Carlo 16/09/21 18:24
in programmazione tutto è permesso
17/09/21 8:08
Thejuster
Se è solo questione di coordinate, ti basta inviare un semplice array al form2 o una struttura in una funzione per disegnare.

Esistono decine di modi per fare questo.

Creare un immagine, ed inviarla al form2.
Ricavare bytes dall'immagine ed inviarla sotto forma di stream al form2.
array, una struttura o lista, ecc. ecc.
Ultima modifica effettuata da Thejuster 17/09/21 8:11
mire.forumfree.it/ - Mire Engine
C# UI Designer