Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 21

Discussione: Richiamare una classe

  1. #11
    Nella DLL:
    codice:
     
    Option Explicit On
    
    Imports System
    Imports System.IO
    Imports System.Web
    Imports System.Web.UI.Page
    Imports System.Web.UI.HtmlControls
    Imports System.Drawing
    Imports System.Drawing.Imaging
    
    NameSpace Gold
        Public Class Upload
    
            Inherits System.Web.UI.Page
            'accetta solo immagini max 100 kb
            Public const MaxLength=102400
            Public const FileType="image/*"
    
            Private _Name As String
    
            Public Property FinalFile() As String
               Get
                  Return _Name
               End Get
               Set(Value As String)
                  _Name  = Value
               End Set
            End Property
    
            Protected lbl As System.Web.UI.WebControls.label
            Protected WithEvents cmdOK As System.Web.UI.WebControls.Button
            Protected Files As System.Web.UI.HtmlControls.HtmlInputFile
    
            Sub Page_Load(sender as Object, e as EventArgs)
                Files.Accept=FileType
            End Sub
    
            Public Sub cmdOK_Click(sender as Object, e as EventArgs) Handles cmdOK.Click
    
             ' AZIONI PER QUESTO EVENTO 
             ' ECC. ECC. ECC.

    NELLA PAGINA ASPX:
    codice:
    <%@ Page Language="VB" %>
    
    <script runat="server">
    
        Sub Page_Load()
            Dim NuovaClasse As New Gold.Upload
        End Sub
    
    </script>
    <html>
    <head>
    </head>
    <body>
        <form runat="server">
            
    
    
            </p>
            
    
    
                <input id="Files" type="file" size="40" runat="Server" />
            </p>
            
    
    
            </p>
            
    
    
                <asp:Button id="cmdOK" Text="OK" runat="server" />
            </p>
            <asp:Label id="lbl" runat="server" font-bold="true"></asp:Label>
        </form>
    </body>
    </html>
    PERO' QUANDO CLICCO SUL BOTTONE cmdOK OTTENGO L' ERRORE: Impossibile fare riferimento ad un oggetto non impostato su istanza di oggetto

  2. #12
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Nel codice che hai postato, non c'è alcun evento collegato alla pressione del pulsante. In compenso, crei dinamicamente un'istanza della classe che deriva da Page e che fa riferimento al controllo Files...che però non può esistere poichè non vi è alcun file .aspx che contiene tale controllo server che erediti direttamente da quella classe.

    Se vuoi mappare i controlli lato server con i campi della classe, devi fare in modo che la pagina .aspx erediti dalla classe che hai creato attraverso la clausola Inherits della direttiva @Page.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #13
    Originariamente inviato da alka
    Nel codice che hai postato, non c'è alcun evento collegato alla pressione del pulsante. In compenso, crei dinamicamente un'istanza della classe che deriva da Page e che fa riferimento al controllo Files...che però non può esistere poichè non vi è alcun file .aspx che contiene tale controllo server che erediti direttamente da quella classe.

    Se vuoi mappare i controlli lato server con i campi della classe, devi fare in modo che la pagina .aspx erediti dalla classe che hai creato attraverso la clausola Inherits della direttiva @Page.
    L' evento collegato alla pressione del pulsante si scatena con l' Handles cmdOK.Click del metodo Public Sub cmdOK_Click no??

    Poi non ho capito bene quello che hai detto sul controllo Files...
    quindi come posso risolvere il problema senza che la pagina .aspx erediti direttamente nella direttiva @PAGE attraverso la clausola Inherits la classe che ho creato??

    Grazie

  4. #14
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Originariamente inviato da singsong
    L' evento collegato alla pressione del pulsante si scatena con l' Handles cmdOK.Click del metodo Public Sub cmdOK_Click no??
    La risposta è no: mancando un legame diretto tra la pagina .aspx e la classe che hai descritto, l'evento Click non viene mai generato.

    Originariamente inviato da singsong
    Poi non ho capito bene quello che hai detto sul controllo Files...
    Quando crei un'istanza della tua classe Upload, probabilmente viene generato l'evento Load codificato nella classe, ma il campo Files non è assegnato al controllo che hai nella pagina .aspx poichè non c'è alcun legame di ereditarietà tra queste due pagine...sono due classi completamente slegate, se non per il fatto che nella pagina .aspx (che eredita da Page, e non da Upload) tenti di creare un'istanza di Upload.

    Se la tua classe Upload è collegata ad una pagina .aspx, allora il framework crea automaticamente un'istanza dei controlli server e ne assegna i riferimenti ai campi della classe (quindi Files verrebbe inizializzato)...in caso contrario, questo non avviene.

    Originariamente inviato da singsong
    quindi come posso risolvere il problema senza che la pagina .aspx erediti direttamente nella direttiva @PAGE attraverso la clausola Inherits la classe che ho creato??
    Fai derivare la tua pagina .aspx da un'altra classe in cui sono dichiarati i controlli utilizzati (Files e altri); quando il pulsante viene premuto, nell'evento Click crei un'istanza di Upload; dovresti modificare la classe Upload affinchè si occupi solo dell'operazione astratta di upload di un file (è questo il tuo scopo?) senza fare riferimento a controlli visuali presenti nella pagina.

    Comunque, non riesco a capire il motivo per cui la tua pagina .aspx non debba ereditare dalla classe Upload, dato che in quest'ultima sono dichiarati tutti i controlli server che vengono creati nel file .aspx.
    :master:

    Forse capendo questo è possibile arrivare ad una soluzione sensata.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #15
    Quindi, se ho capito bene, istanziando la mia classe nella pagina.aspx gli oggeti visuali della pagina (tipo pulsanti) non vengono inizializzati.

    Tu hai detto:
    Se la tua classe Upload è collegata ad una pagina .aspx, allora il framework crea automaticamente un'istanza dei controlli server e ne assegna i riferimenti ai campi della classe (quindi Files verrebbe inizializzato)...in caso contrario, questo non avviene
    Come faccio a creare questo collegamento?

  6. #16
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Originariamente inviato da singsong
    Quindi, se ho capito bene, istanziando la mia classe nella pagina.aspx gli oggeti visuali della pagina (tipo pulsanti) non vengono inizializzati.
    Esattamente. Vengono creati i controlli (tipo pulsanti) lato server, ma i campi della classe che crei nel codice non vengono ovviamente inizializzati poichè non hanno nulla a che vedere.

    Originariamente inviato da singsong
    Come faccio a creare questo collegamento?
    Il collegamento si ottiene attraverso l'ereditarietà.

    Se la tua pagina .aspx (che viene poi rappresentata nel framework da una classe, creata al volo) eredita dalla classe Upload che hai definito, i controlli server trovati nella pagina .aspx vengono creati (come sempre) ma esistendo nella classe base (Upload) campi con lo stesso nome dei controlli (i quali vengono ereditati dalla classe generata automaticamente), il framework associa tali campi ai controlli creati dinamicamente affinchè il codice della classe Upload, ereditato dalla classe corrispondente alla pagina .aspx creata al volo, possa essere eseguito.

    Per esplicitare il fatto che la classe corrispondente alla pagina .aspx che hai creato eredita dalla classe Upload, devi aggiungere la clausola Inherits alla direttiva @Page.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #17
    Ultima cosa:

    Quindi non è sbagliato o poco elegante se, ereditando nella direttiva @page (come avevo detto all' inizio)
    codice:
    <%@ Page Language="VB" Inherits="NameSpace.NomeClasse" %>
    richiamo i metodi e le proprietà direttamente
    Metodo1(Argomento)
    Proprietà1 = "Ciao"

    invece che specificando l' istanza della classe prima
    IstanzaOggetto.Metodo1(Argomento)
    ???

    A questo punto non ha senso neanche creare una istanza del mio oggetto se viene direttamente ereditato... giusto??

    Grazie mille

  8. #18
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Originariamente inviato da singsong
    A questo punto non ha senso neanche creare una istanza del mio oggetto se viene direttamente ereditato... giusto??
    Esattamente. Non ha alcun senso creare un'istanza della classe Upload: è la classe da cui deriva la classe corrispondente alla tua pagina, quindi - creando un'istanza di quest'ultima - vengono eseguite tutte le operazioni necessarie per inizializzare i membri di Upload (poichè è la classe base della tua pagina).

    Ereditando dalla classe Upload, ne acquisisci tutti i metodi non privati che si aggiungono all'interfaccia della tua classe e che puoi richiamare direttamente senza sfruttare alcun riferimento...oppure, se vuoi proprio essere specifico, dovresti usare la parola chiave this (C#) o Me (in VB.NET) che identifica l'istanza corrente della classe:
    codice:
    Me.Metodo(parametri)
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #19
    Bene ... ora ho le idee più chiare ma...

    prima hai parlato a proposito di modificare la classe Upload affinchè si occupi solo dell'operazione astratta di upload. E quindi poi istanziare l' oggetto nella pagina .aspx senza ereditare nella direttiva @page.
    Ma così facendo... se dovessi dare un responso dell' operazione con messaggio, per esempio, in un label? Come si fa se dalla classe non posso fare riferimento agli oggetti?

    Secondo te... perchè in due libri famosissimi su ASP.NET (700 - 800 pagine ciascuno)... non ci sono esempi che mostrano l' eredità nella direttiva @page così come sto facendo io? Semmai alla clausola Inherits è sempre affiancata la clausola Codebehind = "file.vb". Oppure si trova solo la direttiva @page e il codice dela pagina. Poi nella pagina .aspx viene istanziata la classe e richiamati imetodi così:

    IstanzaOggetto.Metodo1(Argomento)

    Tutte queste domande perchè vorrei capire qual'è la soluzione più corretta.
    Abbiamo finito.

    Grazie per la pazienza.

  10. #20
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Originariamente inviato da singsong
    prima hai parlato a proposito di modificare la classe Upload affinchè si occupi solo dell'operazione astratta di upload. E quindi poi istanziare l' oggetto nella pagina .aspx senza ereditare nella direttiva @page.
    Stavo solo cercando di interpretare i tuoi scopi (senza riuscirci).

    Mi riferivo alla separazione dell'upload vero e proprio dal codice della pagina.

    Spiegando meglio: se tu dovessi riutilizzare in un'altra pagina le stesse identiche funzionalità di upload di un file, ad esempio, cosa faresti? copia e incolla del codice? non è un'operazione inutile?

    Ti basterebbe creare una classe generica in grado di gestire le operazioni di upload di cui hai bisogno attraverso dei metodi; in definitiva, una classe che si occupi solo della logica e non della presentazione.

    Tale classe potrebbe tornarti utile in più pagine nelle quali ne crei un'istanza per poter gestire funzionalità di upload; in base al responso dei metodi per la classe che si occupa di gestire l'upload, ciascuna pagina avrà l'incarico di visualizzare all'interno dei propri controlli (etichette, caselle di testo, ecc.) l'esito.

    Originariamente inviato da singsong
    Ma così facendo... se dovessi dare un responso dell' operazione con messaggio, per esempio, in un label? Come si fa se dalla classe non posso fare riferimento agli oggetti?
    Citando quando detto prima, la classe che gestisce l'upload dovrebbe occuparsi solo di ricevere nomi di file, dati binari e quanto serve per effettuare l'upload del file e restituire un responso attraverso un valore di ritorno nei metodi di cui la classe è costituita.

    Ciascuna classe relativa alle pagine in cui vorrai usare l'upload avranno i propri controlli e creeranno un'istanza della classe per l'upload; quando premi il pulsante, il codice della pagina crea, ad esempio, un'istanza della classe di upload e ne richiama i metodi per eseguire quell'operazione; al termine del processo, viene restituito un responso che la pagina provvede a visualizzare nel modo che crede più opportuno.

    Concludendo, si tratta di creare delle classi in cui la logica necessaria ad eseguire una determinata operazione (upload, nel nostro caso) è separata dalla classe che corrisponde alla pagina Web (ma potrebbe trattarsi di un Web Service o di qualsiasi altra cosa) incaricata di prelevare graficamente i dati sorgente per l'operazione e mostrarne l'esito come più indicato nel contesto di riferimento.

    Originariamente inviato da singsong
    Secondo te... perchè in due libri famosissimi su ASP.NET (700 - 800 pagine ciascuno)... non ci sono esempi che mostrano l' eredità nella direttiva @page così come sto facendo io? Semmai alla clausola Inherits è sempre affiancata la clausola Codebehind = "file.vb". Oppure si trova solo la direttiva @page e il codice dela pagina.
    Il codice della pagina .aspx può essere incorporato nel file aspx della pagina, oppure inserito in un file esterno (code behind) per essere precompilato in una libreria (DLL) oppure compilato "al volo" da ASP .NET (aggiungendo la clausola Src alla direttiva @Page); la direttiva CodeBehind viene usata da alcuni IDE come Visual Studio per evitare la compilazione al volo della pagina ma mantenendo il nome del file sorgente associato alla pagina per richiamarlo direttamente quando necessario.

    Nessuno di questi metodi è giusto o sbagliato: dipende dal contesto di utilizzo e dal tool di produzione, quindi non credo si possa imputare al libro alcuna imprecisione, anzi le differenze di ciascuna soluzione dovrebbero essere ben spiegate e dettagliate (se mancano, allora sì che si tratta di una grave negligenza).

    Forse non hai ancora letto il libro per intero e stai "bruciando alcune tappe" affrontando problemi che devono ancora essere spiegati a fondo?

    Originariamente inviato da singsong
    Poi nella pagina .aspx viene istanziata la classe e richiamati imetodi così:
    IstanzaOggetto.Metodo1(Argomento)
    Non vedo l'utilità di questa operazione...non è che hai fatto confusione tu a riguardo?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.