PDA

Prikaži potpunu verziju : [C#] Program mi vaca "null" kao parametar?


DocNet
20.7.2013, 12:30
Pozdrav svima :ciao:

Pravim neki program za obradu slika i naleteo sam na jedan problemcic, ako vam nije problem da mi pomognete.

Nisam neki ekspert u OOP, pa se sad mucim oko prikaza slike, siguran sam da "path+file" daju sigurnu putanju, proveravao sam preko MessageBox-a, tu putanju hocu da prosledim u Form1 i prikazem sliku prvu u podrazumevanom folderu samog programa, na klik next treba da prebaci na sledecu, na previous proslu, nego se ja mucim oko ucitavanja same slike pri pokretanju, izbaci mi "value is null" gresku, ne kapiram kako moze biti null, kada sam pri inicijalizaciji same forme prvo naveo GetImages klasu, pa tek onda PropFields koja trenutno sadrzi jedan properti, u GetImages kao sto mozete videti dole u kodu implementiram properti Path iz PropFields i dajem mu vrednost putanje, dok u Form1 koristim tu putanju radi prikaza slike.

Ja bih ovo verovatno resio, nego me zanima da mi neko objasni zasto ovako nece? I da li postoji neki pametniji nacin da se ovo uradi, mozda brze itd?

Hvala

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Picture_Viewer_1._0
{
public partial class Form1 : Form
{
private int counter = 0;
private int max = 0;
PropFields pf;
public Form1()
{
InitializeComponent();

GetImages gi = new GetImages();
pf = new PropFields();

pictureBox1.BackColor = Color.Transparent;
pictureBox2.BackColor = Color.Transparent;

this.WindowState = FormWindowState.Maximized;
}

//events
private void pictureBox1_MouseHover(object sender, EventArgs e)
{
this.Cursor = Cursors.Hand;
}

private void pictureBox2_MouseHover(object sender, EventArgs e)
{
this.Cursor = Cursors.Hand;
}

private void pictureBox1_MouseLeave(object sender, EventArgs e)
{
this.Cursor = Cursors.Arrow;
}

private void pictureBox2_MouseLeave(object sender, EventArgs e)
{
this.Cursor = Cursors.Arrow;
}

private void Form1_Load(object sender, EventArgs e)
{
this.BackgroundImage = Image.FromFile(pf.Path);
}

private void pictureBox2_Click(object sender, EventArgs e)
{
if(counter<=0)
counter++;

Invalidate();
}

private void pictureBox1_Click(object sender, EventArgs e)
{
if(counter>=max)
counter--;

Invalidate();
}

}
}




GetImages.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Drawing;

namespace Picture_Viewer_1._0
{
class GetImages
{

public GetImages()
{
GetImage();
}

private List<string> extensions = new List<string>
{
".JPG",
".IMG",
".JPEG",
".PNG",
".BMP",
".ICO",
".GIF",
".JPE",
};

private void GetImage()
{
PropFields pf = new PropFields();
string path = Directory.GetParent(Directory.GetParent(Environmen t.CurrentDirectory).ToString()).ToString()+@"\images\";
DirectoryInfo dir = new DirectoryInfo(path);
string file = dir.GetFiles()[0].ToString();

try
{
foreach (string ext in extensions)
{
if (Path.GetExtension(file.ToUpper()) == ext)
{
pf.Path = path + file;
}

}
}
catch (DirectoryNotFoundException ex)
{
MessageBox.Show(ex.Message);
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message);
}
}
}
}



PropFields.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Picture_Viewer_1._0
{
class PropFields
{
public string Path
{
get;
set;
}
}
}

voodoo_
20.7.2013, 12:48
A šta ako je path "C:\folder" a fajl "fajl.txt", konkatenacija će dati "C:\folderfajl.txt" što nije putanja koja ti treba.
Za takve poslove koristi Path.Combine(folder, fajl);

DocNet
20.7.2013, 13:13
A šta ako je path "C:\folder" a fajl "fajl.txt", konkatenacija će dati "C:\folderfajl.txt" što nije putanja koja ti treba.
Za takve poslove koristi Path.Combine(folder, fajl);

Hvala na odgovoru i savetu, ali to nije resenje problema, nego savet za ubuduce.

water wizard
20.7.2013, 13:25
jel ti vraća null za sliku ili za filepath?

DocNet
20.7.2013, 13:55
jel ti vraća null za sliku ili za filepath?

u Form1.cs

Form1_Load
this.BackgroundImage = Image.FromFile(pf.Path);

Dakle na sliku.

greska:
Value cannot be null.
Parameter name: path

Andross
20.7.2013, 14:35
U formi si samo kreirao novi PropField zvani pf ali mu nisi dodelio nikakvu putanju te je pf.Path == null kada se Load pozove. Ti zapravo kolko vidim mislis da je pf globalna varijabla a ona to u stvari nije - pf koji menjas u GetImages klasi je razlicita promenljiva od pf u klasi Form.

DocNet
20.7.2013, 14:50
U formi si samo kreirao novi PropField zvani pf ali mu nisi dodelio nikakvu putanju te je pf.Path == null kada se Load pozove. Ti zapravo kolko vidim mislis da je pf globalna varijabla a ona to u stvari nije - pf koji menjas u GetImages klasi je razlicita promenljiva od pf u klasi Form.

Hvala, resio sam tako sto sam stavio da Path pripada klasi, tj da je static, tako da sad koristim isti properti :)

DocNet
20.7.2013, 15:40
Jos samo nesto,

Da li je pametno ovako koristiti listanje slika?


private void pictureBox2_Click(object sender, EventArgs e)
{
if (counter <= max)
{
counter++;
}
else
{
counter = -1;
counter++;
}
gi.GetImage(counter);
RenderImage();

//Invalidate();
}

private void pictureBox1_Click(object sender, EventArgs e)
{
if (counter <= max && counter>0) //5
{
counter--;
}
else
{
counter = max+1;
counter--;
}
gi.GetImage(counter);
RenderImage();

//Invalidate();
}


Primetio sam da mi se forma malo refresuje pri promeni slike, sve radi ok, samo se recimo ove strelice osvezavaju, ne bih da kopiram ceo kod, jer je skoro isti, samo sam ubacio jednu metodu za iscrtavanje slike, primeticete gore u kodu, da sam u konstruktor forme ubacio da ove strelice budu transparent, odnosno da nemaju pozadinu, sad svaki put one se refreshuju, ne znam zasto Invalidate ne odradi posao?
Ovde sam ga bacio u koment, jer ne obavlja posao...

Todors
21.7.2013, 0:27
Ja jedino što ja ovde vidim da metoda getImage() ne radi ništa tj. da radi u prazno. Niti vraća neku vrednost niti setuje vrednost. Ne znam šta si hteo da postigneš ovako?

Drugo imaš kolekciju imageList. Bolje bi ti bilo da nju koristiš. Ubacuj sve slike u imageList kolekciju i prikazuj selektovanu sliku u pictureBox na formi. Imaš mnogo načina to da implementiraš. Ja ću ti samo pokazati kako da šetaš, napred i nazad, po kolekciji.


//btn next event
var currentImageIndex = imageList.IndexOf(pictureBox.Image);
if(currentImageIndex < imageList.Count())
pictureBox.Image = imageList[++currentImageIndex];

//btn back event
var currentImageIndex = imageList.IndexOf(pictureBox.Image);
if(currentImageIndex > 0)
pictureBox.Image = imageList[--currentImageIndex];

DocNet
21.7.2013, 11:12
Ja jedino što ja ovde vidim da metoda getImage() ne radi ništa tj. da radi u prazno. Niti vraća neku vrednost niti setuje vrednost. Ne znam šta si hteo da postigneš ovako?

Drugo imaš kolekciju imageList. Bolje bi ti bilo da nju koristiš. Ubacuj sve slike u imageList kolekciju i prikazuj selektovanu sliku u pictureBox na formi. Imaš mnogo načina to da implementiraš. Ja ću ti samo pokazati kako da šetaš, napred i nazad, po kolekciji.


//btn next event
var currentImageIndex = imageList.IndexOf(pictureBox.Image);
if(currentImageIndex < imageList.Count())
pictureBox.Image = imageList[++currentImageIndex];

//btn back event
var currentImageIndex = imageList.IndexOf(pictureBox.Image);
if(currentImageIndex > 0)
pictureBox.Image = imageList[--currentImageIndex];


GetImage je glavna metoda, konkretno meni sluzi za prenos varijable counter, koja na click eventu next ili previous slike, povecava, odnosno smanjuje vrednost countera, on to onda prenosi u GetImage(counter) i tu listam sa dir.GetFiles()[counter].ToString();.

Probacu sa ImageList, nisam nikad to koristio, ali pokusacu.
Verujem da je pametnije, jer ovako zapetljavam program, samim tim ga i usporavam...