|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C# - VS2005]Menu riusabile ed eventi buttons
Ciao a tutti
![]() Ho fatto una piccola classe che mi serve per avere sempre a portata di mano un menu da riutilizzare nei miei programmini. Quello che non riesco a capire, è come associare ai button presenti nel menu, i vari eventi come ad esempio il "click". Il codice della classe è questo: Codice:
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Windows.Forms; namespace ReusableCode { partial class ReusableMenu { private ToolStrip generalMenu; private ToolStripMenuItem prepareNew; private ToolStripMenuItem prepareSave; private ToolStripMenuItem prepareUpdate; private ToolStripMenuItem prepareDelete; private ToolStripMenuItem prepareCancel; private ToolStripMenuItem preparePrint; private ToolStripMenuItem prepareExit; private ToolStripSeparator[] sep; public ToolStrip MyMenu() { this.generalMenu = new ToolStrip(); this.prepareNew = new ToolStripMenuItem(); this.prepareSave = new ToolStripMenuItem(); this.prepareUpdate = new ToolStripMenuItem(); this.prepareDelete = new ToolStripMenuItem(); this.prepareCancel = new ToolStripMenuItem(); this.preparePrint = new ToolStripMenuItem(); this.prepareExit = new ToolStripMenuItem(); this.sep = new ToolStripSeparator[6]; this.sep[0] = new ToolStripSeparator(); this.sep[1] = new ToolStripSeparator(); this.sep[2] = new ToolStripSeparator(); this.sep[3] = new ToolStripSeparator(); this.sep[4] = new ToolStripSeparator(); this.sep[5] = new ToolStripSeparator(); this.generalMenu.SuspendLayout(); this.generalMenu.Dock = DockStyle.Top; this.generalMenu.GripStyle = ToolStripGripStyle.Visible; this.generalMenu.Items.AddRange(new ToolStripItem[] { this.prepareNew, this.sep[0], this.prepareSave, this.sep[1], this.prepareUpdate, this.sep[2], this.prepareDelete, this.sep[3], this.prepareCancel, this.sep[4], this.preparePrint, this.sep[5], this.prepareExit }); this.generalMenu.Location = new Point(3, 0); this.generalMenu.Name = "mainMenu"; this.generalMenu.Size = new Size(1000, 25); this.generalMenu.TabIndex = 0; this.prepareNew.DisplayStyle = ToolStripItemDisplayStyle.Text; this.prepareNew.Name = "AddNew"; this.prepareNew.Size = new Size(66, 22); this.prepareNew.Text = "&Nuovo"; this.prepareNew.Font = new Font("Verdana", 9F); this.prepareNew.ForeColor = Color.SteelBlue; this.prepareSave.DisplayStyle = ToolStripItemDisplayStyle.Text; this.prepareSave.Name = "SaveIt"; this.prepareSave.Size = new Size(66, 22); this.prepareSave.Text = "&Salva"; this.prepareSave.Font = new Font("Verdana", 9F); this.prepareSave.ForeColor = Color.SteelBlue; this.prepareUpdate.DisplayStyle = ToolStripItemDisplayStyle.Text; this.prepareUpdate.Name = "Update"; this.prepareUpdate.Size = new Size(66, 22); this.prepareUpdate.Text = "&Modifica"; this.prepareUpdate.Font = new Font("Verdana", 9F); this.prepareUpdate.ForeColor = Color.SteelBlue; this.prepareDelete.DisplayStyle = ToolStripItemDisplayStyle.Text; this.prepareDelete.Name = "Delete"; this.prepareDelete.Size = new Size(66, 22); this.prepareDelete.Text = "&Elimina"; this.prepareDelete.Font = new Font("Verdana", 9F); this.prepareDelete.ForeColor = Color.SteelBlue; this.prepareCancel.DisplayStyle = ToolStripItemDisplayStyle.Text; this.prepareCancel.Name = "Cancel"; this.prepareCancel.Size = new Size(66, 22); this.prepareCancel.Text = "&Annulla"; this.prepareCancel.Font = new Font("Verdana", 9F); this.prepareCancel.ForeColor = Color.SteelBlue; this.preparePrint.DisplayStyle = ToolStripItemDisplayStyle.Text; this.preparePrint.Name = "Print"; this.preparePrint.Size = new Size(66, 22); this.preparePrint.Text = "Stam&pa"; this.preparePrint.Font = new Font("Verdana", 9F); this.preparePrint.ForeColor = Color.SteelBlue; this.prepareExit.DisplayStyle = ToolStripItemDisplayStyle.Text; this.prepareExit.Name = "Exit"; this.prepareExit.Size = new Size(66, 22); this.prepareExit.Text = "Esci"; this.prepareExit.Font = new Font("Verdana", 9F); this.prepareExit.ForeColor = Color.SteelBlue; this.prepareExit.Click += new EventHandler(this.prepareExit_Click); this.generalMenu.ResumeLayout(false); this.generalMenu.PerformLayout(); return generalMenu; } void prepareExit_Click(object sender, EventArgs e) { //come associo ad esempio la chiusura del form dove andrò a mettere il mio menu? } } } Codice:
ReusableMenu rm = new ReusableMenu(); menuContainer.Controls.Add(rm.MyMenu()); Grazie mille ![]() RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2007
Messaggi: 754
|
bottone.Click += new EventHandler(this.prepareExit_Click);
Intendi questo?
__________________
http://www.tevigroup.it/ |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
![]() Il fatto è che non capisco come associargli l'uscita dal o dai form. Cioè, cosa ci dovrebbe andare nel metodo prepareExit_Click ? Al momento, riesco a chiuderlo perchè conosco il nome del form e faccio: Codice:
foreach(Form f in Application.OpenForms) { if(f is FormProva) { f.Close(); break; } } Idee? Grazie. Raoul.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Sep 2007
Messaggi: 754
|
Secondo me dopo aver aggiunto il menu alla form devi settare nella stessa gli eventi che vuoi impostare a i bottoni in modo da avere eventi diverdi a ogni form
__________________
http://www.tevigroup.it/ |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
ma dal form io non ho modo di accedere ai bottoni. Per uno in particolare però l'evento sarebbe uguale per tutti i form, riferendomi proprio al bottone "Exit", che non dovrebbe far altro che chiudermi il form corrente.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Passa l'istanza della WinForm al costruttore della classe e memorizzala in una variabile membro privata.
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Non ci ho capito molto ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Ma la domanda sorge spontanea? Perche' stai cercando di scrivere una classe riusabile? Non puoi semplicemente scrivere una classe che risolve il tuo problema nel programma che stai scrivendo in questo momento?
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
![]() ![]() ehm.. perdonate l'ot... Di solito faccio così. Il fatto è che ultimamente sto lavorando molto su accoppiata interfaccia grafica + database per programmi diversi, e mi ritrovo a dover disegnare praticamente sempre gli stessi menu e gli stessi forms, perciò stavo cercando di risolvere il problema alla radice. Ovvero, avere un paio di forms "generici" ed un menu standard per le operazioni classiche che si fanno su un database. Ciao ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Codice:
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Windows.Forms; namespace ReusableCode { public class ReusableMenu : ToolStrip { private System.Windows.Forms.Form _container; public ReusableMenu(System.Windows.Forms.Form container) { this._container = container; this.SuspendLayout(); this.Dock = DockStyle.Top; this.GripStyle = ToolStripGripStyle.Visible; this.Location = new Point(3, 0); this.Name = "mainMenu"; this.Size = new Size(1000, 25); this.TabIndex = 0; this.AddNewButton("NewMenuItem", "&Nuovo", null); this.AddNewSeparator(); this.AddNewButton("SaveMenuItem", "&Salva", null); this.AddNewSeparator(); this.AddNewButton("UpdateMenuItem", "&Modifica", null); this.AddNewSeparator(); this.AddNewButton("DeleteMenuItem", "&Elimina", null); this.AddNewSeparator(); this.AddNewButton("CancelMenuItem", "&Annulla", null); this.AddNewSeparator(); this.AddNewButton("PrintMenuItem", "Stam&pa", null); this.AddNewSeparator(); this.AddNewButton("ExitMenuItem", "Esci", ExitMenuItem_Click); this.ResumeLayout(false); this.PerformLayout(); } void AddNewButton(string name, string text, EventHandler eventHandler) { ToolStripMenuItem newButton = new ToolStripMenuItem(); newButton.DisplayStyle = ToolStripItemDisplayStyle.Text; newButton.Name = text; newButton.Size = new Size(66, 22); newButton.Text = name; newButton.Font = new Font("Verdana", 9F); newButton.ForeColor = Color.SteelBlue; if(eventHandler != null) newButton.Click += new EventHandler(eventHandler); this.Items.Add(newButton); newButton = null; } void AddNewSeparator() { ToolStripSeparator newSeparator = new ToolStripSeparator(); this.Items.Add(newSeparator); newSeparator = null; } void ExitMenuItem_Click(object sender, EventArgs e) { this.MyContainer.Close(); } System.Windows.Forms.Form MyContainer { get { return this._container; } } } } |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Nella form scriverai
Codice:
menuContainer.Controls.Add(new ReusableMenu(this)); |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Allora prova ad approcciare il discorso cosi' invece: una volta che hai scritto quella classe due volte in maniera simile, prova a tirare fuori una classe comune ai due casi e poi quella diventa una classe di partenza che "proverai" ad usare in futuro. Non partire cercando di scrivere la classe riusabile subito, perche' nove volte su dieci ti ritrovi con una classe troppo generica che ti fa perdere piu' tempo di quanto te ne fa risparmiare.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
![]() Cioè, nel mio percorso di studio verso i linguaggi orientati agli oggetti (in particolare quelli che sto studiando io sono Java e C#... e quest'ultimo mi piace un pelino di più .. ) una delle cose che cercano di passare come "dogma" è quello del riutilizzo del codice. Come devo considerare quindi questa cosa? Grazie ![]() RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
@ReaToMe:
Grazie mille ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Di nulla, alla prossima!!!
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Sep 2007
Messaggi: 754
|
Che ne dici di questa soluzione?
__________________
http://www.tevigroup.it/ |
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Che spero sia uno scherzo...
Contiene due form che non fanno nulla. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Sep 2007
Messaggi: 754
|
Il form CRUDForm definisce la struttura, l'altro la eredita, nell'esempio sono dei bottoni ma nel caso di raoul puo essere un menu nel quale va solo a ridefinire gli eventi
__________________
http://www.tevigroup.it/ |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
![]() Il CoCoMo model (nome stupidissimo per altro) per la stima del costo del software ha calcolato che scrivere codice per essere riusabile costa mediamente il 30% in piu' (in termini di tempo e denaro) e solo il 10% delle volte e' effettivamente riutilizzato. In pratica, scrivendo codice riutilizzabile paghi in termini di tempo e complessita' della soluzione senza ricevere nulla in cambio nella maggior parte dei casi. Inoltre, riutilizzare codice non e' facile e impone una maggiore complessita' anche nel codice cliente. E' molto meglio cercare di "estrarre" codice da riutilizzare da una soluzione gia' funzionante ed estrarre solo il codice gia' diventato semplice, stabile e generico dopo il refactoring.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
...dove codice riusabile è riferito per lo più a sotto-sistemi.
Creare classi riusabili come quella del topic, non è una perdita di tempo. In fondo si tratta essenzialmente di un control custom. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:24.