Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326

    [delphi] duplicazione form

    ciao a tutti,

    mi sapete dire come posso fare x duplicarmi una form con tutto il suo contenuto, la sua unit?

    Partendo da una FrmFornitori e una UntFornitori...vorrei ottenere una nuova FrmClienti con UntClienti....dove in UntClienti e' scritto lo stesso codice che sta in UntFornitori solo che le varie procedure si chiamano non piu FrmFornitori.BtnOkclik ma FrmClienti.BtnOkClick.

    esiste un sistema per farlo rapidamente?

    grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    No, non esiste un metodo veloce per duplicare.

    Anzi, sconsiglio di farlo il meno possibile, sfruttando i principi della programmazione ad oggetti, creando una form generica che contenga l'interfaccia utente, i controlli e le funzionalità (codice) che si adattano a tutte le finestre dati presenti nel programma.

    L'idea è quella di evitare di duplicare il più possibile il codice, riutilizzandolo.

    Puoi creare discedenti di form e frame scegliendo la voce di menu [File|New Item...] e selezionando la pagina che porta il nome del progetto; basta evidenziare una delle form o dei frame del progetto, accertarsi che "inherited" sia selezionato e premere Ok.

    Per fare una prova tecnica, tanto per capire il meccanismo, crea una form vuota e inserisci al suo interno diversi controlli Edit.
    Crea un discendente di questa form: noterai che Delphi ti crea una form apparentemente nuova ma che contiene i controlli di quella base, poichè ne eredita le caratteristiche.

    A questo punto, puoi modificare le proprietà dei controlli sia del form per differenziare la "form specifica" dalla "form di base".

    Questo potrebbe consentirti, ad esempio, di predisporre una form con una griglia, un IBDataSet e i controlli visuali (pulsanti, caselle di testo, ecc.) che sono normalmente presenti all'interno di una form di dati. Per differenziare i dati visualizzati, ti basta creare discedenti della form base e, per questi, ridefinire ad esempio le query SQL di selezione, aggiornamento, cancellazione e inserimento del componente IBDataSet.

    Comprendo che non sia facile, soprattutto all'inizio, ma a mio parere è una delle caratteristiche più interessanti di Delphi e uno degli utilizzi più fruttuosi nell'ambito dello sviluppo di applicazioni Windows per il riutilizzo del codice e dell'interfaccia, riducendo anche il numero di bug (che con il "copia e incolla" vengono decuplicati).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    ho fatto in questa maniera, viene copiato la parte visiva della form,..ma non il codice associato ai vari eventi.

    forse ho capito male....il codice non viene copiato?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Il codice NON deve essere copiato.

    Spiego meglio con un esempio pratico, anche se in modo discorsivo.

    Supponi di creare una form di base che al suo interno contenga una IBTable (per semplicità), un controllo DBGrid e un controllo DBNavigator, più l'essenziale DataSource.

    Inoltre, immagina di aggiungere un paio di pulsanti per aprire e chiudere la tabella, scrivendo il codice appropriato che richiami i metodi Open e Close del componente TTable.

    Questa "base" potrebbe andare benissimo per qualsiasi dato che devi sfogliare sottoforma di griglia.

    Se devi usare la stessa interfaccia per diverse tabelle, perchè copiare e incollare i componenti, i controlli e il codice di gestione degli eventi?

    Ti basta configurare la form di base affinchè sia in grado di agire su una tabella specifica; successivamente, crea un discendente di questa form nel modo che ti ho indicato precedentemente e prova a sostituire il nome della tabella nel discendente.

    Usando un progetto di prova contenente la form base e due discendenti per i quali sono state attribuite due tabelle differenti al TTable, prova a creare (in modo rapido, puramente esemplificativo) un'istanza del primo discendente e del secondo, oppure puoi metterli in AutoCreate e visualizzarli.

    Noterai che senza scrivere una riga di codice, salvo che per la finestra di base, le due form funzioneranno egregiamente ciascuna basandosi sulla tabella ad essa assegnata.

    Il principio si basa sull'introduzione nella form di base di un componente e del codice che consente di aprire, chiudere, aggiornare la tabella, sempre parlando per esempi; creare un discendente significa ereditare tutte le caratteristiche della form di origine, infatti ritrovi all'interno della tua form gli stessi controlli e componenti della form di base, ma senza la necessità di ridichiararli poichè fanno parte della form discendente per principio.

    Il codice introdotto nella form di base funziona allo stesso modo anche nel discendente, ma hai la possibilità di modificare le proprietà del discendente affinchè la tua classe di form si comporti in modo più specifico.

    Il concetto è più facile da comprendere che da spiegare.

    Un esempio ancora più banale: supponi di aver bisogno di un numero elevato di form nel tuo programma per le quali vuoi costruire una barra per un titolo usando un pannello colorato, magari con un gradiente, posizionato nella parte alta. Metterlo in tutte le form può risultare tedioso, mentre ti basterebbe definire la tua form di base posizionando il pannello su di essa e, successivamente, ereditare da questa form per avere subito un modello già pronto che abbia il pannello presente nella parte alta.
    Ti basterebbe semplicemente cambiare il titolo nel pannello, ma per il resto non devi scrivere ne progettare nulla: è già tutto pronto.

    L'esempio è chiaramente banale, ma se pensato in modo astratto e per problematiche più complesse, può rendere drammaticamente rapido lo sviluppo di un'applicazione, ridurre drasticamente il codice necessario a realizzarla e organizzarlo meglio per renderlo più mantenibile limitando il numero di bug, spesso dovuti al copia e incolla di codice errato che devi correggere allo stesso modo in tutta l'applicazione.

    Se trovo qualche tutorial apprezzabile riguardo questo argomento, te lo segnalo.

    Ciao!
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.