Matrice di punti

mercoledì 07 gennaio 2009 - 08.53

jack275 Profilo | Junior Member

Ciao a tutti, io devo realizzare un programma che crei icone di grandezza max 64x64
devo quindi far visualizzare una "tabella" e quando un quadrato di questa tabella viene premuto deve colorarsi
di nero.
una volta che l'operatore ha finito di "disegnare" l'icona, questa deve essere salvata in un file.txt
con una combinazione di 1 e 0 (ad esempio 0 spento = non colorato e 1 acceso = colorato).
come posso fare???
ps magari senza andare a gestire 644 oggetti singoli

Teech Profilo | Expert

Più che gestire N oggetti singoli puoi gestire una collection di oggetti omogenei.
Ogni "casella" è un oggetto che come proprietà avrà il valore (il boolean per capire se accesa o spenta -potrebbe anche essere un Color se vuoi fare oggeti colorati-), la posizione (in quale riga/colonna si trova) e altre proprietà che desideri.

Per semplicità creerei una collection che rappresenta una riga (o colonna, come preferisci) della tabella (tanto le posizioni sono 64 al massimo) e una collection di righe per gestire la tabella stessa senza dover memorizzare in una proprietà la posizione.

Per salvare il tutto su un file puoi mettere il metodo di salvataggio sulla collection di righe.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

jack275 Profilo | Junior Member

ok....scusa la domanda, ma come si chiama l'oggetto?
un'altra cosa, ma e' possibile utilizzare per esempio una stringa per sostituire il nome di un oggetto?
es:
invece di scrivere
button1.text = "ciao";
scrivo:
string nome = "button1";
nome.(.....).text = "ciao";
utilizzando cosi' la stringa come "contenitore di nomi"
???

Teech Profilo | Expert

>ok....scusa la domanda, ma come si chiama l'oggetto?
L'oggetto te lo devi creare (è una classe), così come le collection (è una classe anche questa che gestisce un insieme di tue classi).

>un'altra cosa, ma e' possibile utilizzare per esempio una stringa per sostituire il nome di un oggetto?
>utilizzando cosi' la stringa come "contenitore di nomi"
il contenitore è la collection ma invece che contenere stringhe (sarebbe un semplice array di stringhe) contiene oggetti complessi.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

jack275 Profilo | Junior Member

Giusto...
ho capito la cosa della collection, xo' un'altra cosa che mi interessava era sapere se e' possibile utilizzare una stringa o un int come identificatore,
cosi' invece che fare uno switch case per poi svolgere altre funzioni, io assegnavo alla stringa il nome dell'oggetto e poi facevo tutto, cosi' riducevo un po' le righe del codice rendendolo cosi' un po' piu' comodo da scrivere

Teech Profilo | Expert

Scusami ma non ti seguo... Perchè ridurre tutto a stringhe quando puoi avere comodamente oggetti complessi? Non capisco cosa vuoi ottenere esattamente...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

jack275 Profilo | Junior Member

Ok, provo a spiegarmi meglio..
tu praticamente mi hai consigliato di creare una classe che mi gestisce tutti questi oggetti,
quindi io dalla form vado a richiamare questa classe passandogli l'oggetto da colorare ecc.. giusto?
a questo punto io volevo sapere una cosa, per passare alla classe il nome l'oggetto premuto, e' possibile farlo tramite una stringa?
cosi' nella classe invece di andare a creare uno swicth case di 256 soluzioni (nel caso della risoluzione 16*16) io non faccio altro che utilizzare la stringa come se fosse l'oggetto premuto...non so se sono stato molto chiaro..

Teech Profilo | Expert

Per risponderti mi serve sapere una cosa: quando dici che un utente può premere su una tabella, cosa intendi per "Tabella"? Che oggetto useresti per questa tabella? Se us un DataGridView, puoi semplicemente passare come DataSource la tua collection e quando premi su una cella premi direttamente sul "tuo oggetto".

Popoli il controllo con:
DataGridView.DataSource=TuaCollection

Quando premi una cella per cambiare colore puoi fare (in pseudo codice):
CType(Cella.DataBoundItem, TuoOggetto).Valore=value

Quindi, quale oggetto usi per gestire la "tabella"?
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

jack275 Profilo | Junior Member

Io devo fare un programma che permetta di creare delle icone grafiche le quali devono essere salvate in un file .txt
per fare queste icone devo fare 16*16 quadrati che alla pressione ciascun quadrato si deve colorare.
fai conto che gli 0 siano i quadra bianchi e gli 1 siano i quadrati colorati.
11111111
10000001
10000001
11111111
questa e' l'immagine di un quadrato salvata in un file .txt
devo fare un programmino di questo tipo.

Teech Profilo | Expert

Si questo l'ho capito, ma come fai ogni singolo quadrato? Che tipo di componente usi per ogni singolo quadrato? In base al componente che usi ci sono diverse possibilità di creare un Binding fra l'oggetto (classe) e il componente visualizzato.
Invece che creare delle matrici di stringhe puoi creare delle matrici di oggetti ed effettuare il Binding ai componenti.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

jack275 Profilo | Junior Member

io x adesso ci ho messo dei button....
poi non so qual'e' la soluzione migliore, ho aperto questo thread proprio per questo...
cmq...allora io x adesso ci ho messo dei bottoni, tu cosa mi consigli di fare? cmq grazie per l'aiuto!

Teech Profilo | Expert

Allora, ti faccio una sintesi di come opererei io:
- Creerei un'interfaccia per ogni unità del disegno (Interface ILed per dargli un nome) contenente la proprietà Valore (di tipo Boolean)
- Creerei una classe per la gestione dell'unità (Classe Led per dargli un nome) che implementa l'interfaccia ILed
- Creerei una classe per ogni riga del disegno (Classe RigaDisegno per dargli un nome) che eredita da una classe Collection (tipo la CollectionBase o altro). Ogni elemento della collection sarà un Led
- Creerei una classe per il disegno (Classe Disegno per dargli un nome) che eredita da una classe Collection. Ogni elemento della collection sarà un RigaDisegno
- Creerei un componente personalizzato che eredita da Button (ButtonLed) ed implementa l'interfaccia ILed

Nella classe Disegno implementerei un metodo che mi restituisca una matrice di componenti ButtonLed e li inserirei dinamicamente nel form.
Sempre nella classe Disegno implementerei i metodi per la scrittura e lettura da file di testo.

Questa può essere una delle mille tracce possibili...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ciao


Io (ma prendila per quello che è: un'opinione personale) non affiderei la grafica ad un gruppo di bottoni, creerei un controllo apposta per il disegno. Quanto alla classe per gestire l'icona vera e propria, farei qualcosa di abbastanza semplice: un array bidimensionale di bool, o ancora meglio una matrice di BitArray.

Nel complesso ho sviluppato una cosa di questo genere:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Il codice si può di certo migliorare, comunque tutto quello che devi fare per usarlo è aggiungere un IconControl al tuo Form (anche dal Designer), e quindi creare un oggeto YourIcon e assegnarlo alla proprietà BackedIcon del controllo. Poi per salvare l'oggetto puoi usare il suo metodo Save, e per visualizzarlo come stringa il metodo ToString().

Spero che possa essere una buona idea per iniziare, ciao!

Luca

jack275 Profilo | Junior Member

Grazie per l'aiuto ragazzi!
Non e' che mi potreste mandare un qualche esempio tipo project??
mi faresti un favorone!
xke' ho iniziato a usare il c# da poco e mi smarrisco ancora con la terminologia poiche' non la conosco...e poi purtroppo non conosco nessuno a cui posso chiedere...
ti lascio l'e-mail ok?
driver2752002@yahoo.it

aiedail92 Profilo | Expert

Ciao

Allego a questo messaggio il progetto, spero che possa servirti come incipit per il tuo lavoro

P.S.: Te l'ho mandato anche al tuo indirizzo E-Mail

Luca

jack275 Profilo | Junior Member

scusa se rx solo ora! ma ho avuto dei problemi....cmq non riesco ad aprire il file sln e di conseguenza il programma che hai fatto....ci potresti dare un'occhiata? grazie ankora

aiedail92 Profilo | Expert

Ciao,

Non riesci ad aprire il .sln perché usi una versione di Visual Studio meno recente della mia... Comunque ti basta creare un nuovo progetto WinForm e rimuovere da esso i file Program.cs e Form1.cs, quindi aggiungi i file IconViewer.cs, MainForm.cs, MyIcon.cs e Program.cs che trovi nell'archivio.

In alternativa puoi usare questo tool per convertire la soluzione da VS 2008 a VS 2005 (non l'ho provato di persona):

http://mises.com/blogs/misestech/VisualStudioProjectDowngrade.zip

Luca

jack275 Profilo | Junior Member

OK grazie, sono riuscito ad aprirlo...
ho provato a convertirlo anche con il programma e funziona xo' non si riesce ad aprire dal file .sln.
Ora ci daro' un'occhiata, nel frattempo grazie mille!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5