Oppure

Loading
20/06/20 5:27
selemaco
Salve a tutti.
Ho la necessità di creare in VB.net o C# un UserControl personalizzato che abbia una proprietà chiamata Text di tipo NON string.

Es.

Public Class MyControl

   Private pText As MyTextClass 
   Public Shadows Property Text As MyTextClass
       Get
          Return pText
       End Get
       Set(ByVal Value As MyTextClass)
          pText = value
       End Set
  End Property
End Class

Public Class MyTextClass
    Public Shared Widening Operator CType(ByVal value As String) As MyTextClass
        Return New MyTextClass(value)
    End Operator

    Public Shared Widening Operator CType(ByVal value As MyTextClass) As String
       Return value.Text
    End Operator

    Private _text As String = ""
    Public Property MyText As String
        Get
            Return _text
        End Get
        Set(value As String)
            _text = value
        End Set
    End Property

    Private _Forecolor As System.Drawing.Color = Nothing
    Public Property Forecolor() As System.Drawing.Color
        Get
            Return _Forecolor
        End Get
        Set(value As System.Drawing.Color)
            _Forecolor = value
        End Set
    End Property
End Class


Il controllo funzionerebbe bene se non al momento della creazione a designtime.
Quando viene aggiunto al form, ricevo questo errore :
"Un oggetto di tipo 'System.String' non può essere convertito nel tipo 'MyTextClass'"

Se cambio il nome della proprietà (ex. TextEx) tutto funziona alla perfezione

Ultima modifica effettuata da Thejuster 03/07/20 10:18
aaa
20/06/20 9:14
nessuno
Che vuol dire "non string"? Di che tipo deve essere?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
20/06/20 10:41
selemaco
Ciao. Innanzitutto grazie per l'interessamento.

Deve essere di tipo MyTextClass, ovvero una custom class che a sua volta ha diverse proprietà.

Private pText As MyTextClass

Public Shadows Property Text As MyTextClass
       Get
          Return pText
       End Get
       Set(ByVal Value As MyTextClass)
          pText = value
       End Set
End Property
Ultima modifica effettuata da Thejuster 03/07/20 10:18
aaa
20/06/20 11:38
Carlo
Non puoi usare la proprietà Text, perché Text è usato dal linguaggio e si creano delle ambiguità.
Non ricevi errori perche hai dichiarato Text come Shadows:
Public Shadows Property Text As MyTextClass


Se togli Shadow vedrai che ti viene sconsigliato di usare Text

Se Textex non ti piace usa Testo.

Se proprio vuoi usare Text, aggiungi l'UserControl da codice, invece che da progettazione, vedrai che funzionerà.

Dim UC_Text As New MyControl
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.Controls.Add(UC_Text)
End Sub


Se dovrai usarne più di uno dovrai dichiarare una lista di MyControl
Ultima modifica effettuata da Carlo 20/06/20 12:46
in programmazione tutto è permesso
20/06/20 11:53
selemaco
Hai confermato ciò che supponevo..

Grazie 1000
aaa
21/06/20 19:54
Carlo
Per risolvere il problema del conflitto dei nomi, devi inserire un namespace, che renda la tua proprietà Text, legata ad un namespace diverso da quello "standard" System.Text

Namespace Controlli

    Public Class MyControl

        Private pText As MyTextClass
        Public Property Text As MyTextClass
            Get
                Return pText
            End Get
            Set(ByVal Value As MyTextClass)
                pText = value
            End Set
        End Property

    End Class

End Namespace 
Ultima modifica effettuata da Carlo 25/06/20 9:07
in programmazione tutto è permesso
02/07/20 9:25
Thejuster
Non è detto carlo.

C'è la possibilità di vare un override di una proprietà e sfruttarla a proprio piacimento.

io programmo in C# quindi vi faccio l'esempio in C#.


class MioControllo : Control
{

private string tx;

public ovveride string Text
{
     get { return tx; }
     set 
     {
        tx = value;
        //Altre operazioni
      }

}


}



Al blocco set puoi impostare ulteriori funzionamenti come settare ad un'altra variabile il valore stesso contenuto in value


ma se si tratta di disegnare semplicemente del testo con un ombra una sola proprietà Text và piu che bene.
Devi solo modificare il paint e spostare di qualche pixel il testo superiore rispetto a quello inferiore di qualche pixel.

Ad esempio questa è una mia skin fatta in c# e GDI puoi vedere un piccolo esempio.

i.ibb.co/DbfzxJX/…
mire.forumfree.it/ - Mire Engine
C# UI Designer
02/07/20 20:01
Carlo
Con override non ho provato, proverò, grazie Thejuster.
selemaco aveva messo Shadow, e funziona, il problema sorge solo se si vuole inserire l'usercontrol da progettazione.
Ultima modifica effettuata da Carlo 02/07/20 20:14
in programmazione tutto è permesso