webForumDet fria alternativet

Problem med recentlista-skriva till registret

.NET

9 svar · 286 visningar · startad av saw

Medlem sedan mars 20011 880 inlägg
Frågan#1

Så här ser classen ut:

public void saveMenu(string fFilNamn)
{
try
{
FileInfo finfo = new FileInfo(fFilNamn);
RegistryKey key = Registry.CurrentUser;
key = key.OpenSubKey("Software\\SAW\\Music_Translater_2\\FilLista\\",true); 
if(key != null)
{
myArray = new ArrayList();	
String[] filename = key.GetValueNames(); 
IEnumerator iEnum = filename.GetEnumerator();
while(iEnum.MoveNext())
{
String val = (String)iEnum.Current;
String data = (String)key.GetValue(val);
myArray.Add(data); 						
}
key.Close(); 
}
RegistryKey regKey = Registry.LocalMachine.OpenSubKey("Software\\Music_Translater_2", true);
if(regKey != null)
{	
try
{
regKey.DeleteSubKey("FilLista",true);
regKey.Flush();
regKey.Close();
}
catch(Exception fel)
{
MessageBox.Show(fel.Message,"Fel i deleta FilLista");
} 
}
AddRecent(fFilNamn);
key = Registry.CurrentUser;
key = key.OpenSubKey("Software\\SAW\\Music_Translater_2\\FilLista\\",true);
if(myArray.Count < 1)
{
myArray.Sort( 1, 3, null );				
} 
for(int i = 0; i <   myArray.Count;++i)
{					
finfo = new FileInfo(myArray[i].ToString());
key.SetValue(finfo.Name,myArray[i].ToString());	//här är problemet
Info.Text="Recent file OK!";
   		
}			
}
catch(Exception fel)
{
MessageBox.Show(fel.Message,"Fel i skriva till registret");
} 
}

Error som jag får:

Objectreferensen har inte angetts till en instans av ett objekt

Vad är det som jag missar?

Medlem sedan mars 20023 561 inlägg
#2

På vilken referens får du felet?

Medlem sedan mars 20011 880 inlägg
#3

Jag hadde markerat det:
key.SetValue(finfo.Name,myArray*.ToString()); //här är problemet

Jag har också hitta felet, nycklen fanns inte så jag gjorde en if-sats om nycklen fanns, annars så creatade jag den.*

Medlem sedan mars 20007 896 inlägg
#4

for(int i = 0; i < myArray.Count;++i)

Det ska vara:

for(int i = 0; i <   myArray.Count; i++ )

Annars börjar din loop på 1 och slutar på myArray.Count, alltså ett index som inte finns. ( Din array är ju bara myArray.Count-1 lång )

Medlem sedan mars 20011 880 inlägg
#5

Tack, den biten hadde jag missat.
Jag har ytterligare frågor om min recentlista.
Som ni ser, så sparar jag i registret så här:

key.SetValue(finfo.Name,myArray[i].ToString());

I klartext så blir det då så här:

Under namn(värde):
Help_Me.rtf
...och under data
E:\Music_Translater 2.0\Music_Translater 2.0\bin\Debug\Sparat\Help_Me.rtf

Detta läggs sedan upp i menyn:

RegistryKey regKey = Registry.CurrentUser.OpenSubKey("Software\\SAW\\Music_Translater_2\\FilLista");	
if (regKey == null)
{
return;
}  			
MenuItem mnu = new MenuItem();				
String[] filename = regKey.GetValueNames(); 
IEnumerator iEnum = filename.GetEnumerator();
// Iterate through all items 
while(iEnum.MoveNext())
{
String val = (String)iEnum.Current;
String data = (String)regKey.GetValue(val);
MenuItem mi = AddMenuItem(data);
AddRecent(data);
mnu.MenuItems.Add(mi);
}
		
menuItemRecentProjects.MergeMenu(mnu);
regKey.Close();					
		
menuItemRecentProjects.Text="Recent list";

Fråga 1:
Hur skall jag göra för att bara hämmta hem värdet i stället för
data och lägga upp i menyn?

Fråga 2:
När man sedan klickar i recentmenyn ...

private void menuItemDynamicMenu_Click(object sender, System.EventArgs e)
{
MenuItem mi = (MenuItem)sender;
//lite kod
richTextBoxEx.LoadFile(mi.Text);

..så hämtas filen så här, men om man lyckas med att enbart få in enbart filnamnet, hur skall man få in sökvägen?
Eller finns det Tag som man kan jobba med? :q

Medlem sedan maj 20021 466 inlägg
#6

SPiN skrev:

for(int i = 0; i < myArray.Count;++i)

Det ska vara:

for(int i = 0; i <   myArray.Count; i++ )

Annars börjar din loop på 1 och slutar på myArray.Count, alltså ett index som inte finns. ( Din array är ju bara myArray.Count-1 lång )

Jag är ledsen att behöva säga det, men du har fel.

Skillnaden mellan i++ och ++i är att i++ returnerar i medan ++i returnerar i+1.

Eftersom returvärdet inte används här spelar det ingen roll vad man använder.

// Fungerar bra
int[] arr = new int[3] {1, 2, 3};
for(int i = 0; i < arr.Length; ++i)
Console.WriteLine(arr*);

int i;
i = 2;
int r = i++; // r = 2, i = 3
i = 2;
int r2 = ++i; // r2 = 3, i = 3*

Medlem sedan maj 20021 466 inlägg
#7

Saw: Det finns en Tag i MenuItem-klassen. RTM.

Du kan också skapa en ny klass som ärver från MenuItem om du vill lägga till fler variabler.

Vad gäller den här raden:
key.SetValue(finfo.Name,myArray*.ToString());

Har du kontrollerat att ingen variabel är null? T.ex. finfo.*

Medlem sedan mars 20011 880 inlägg
#8

Marcus E, problemet var att det inte fanns någon nyckel i registret.
Lösningen var att kolla om nycklen fanns, annars så skapa en.
Den biten är klar, men jag skulle vara väldigt tacksam om du kunde utvekla det med Tag, jag förstod inte det riktigt.

Medlem sedan mars 20007 896 inlägg
#9

Marcus E skrev:

Jag är ledsen att behöva säga det, men du har fel.

Skillnaden mellan i++ och ++i är att i++ returnerar i medan ++i returnerar i+1.

Eftersom returvärdet inte används här spelar det ingen roll vad man använder.

Ok, då kanske jag har missat något... Jag trodde att ++i 'increasade' värdet på i innan i användes. i++ å andra sidan använda i först, och sedan lade till värdet 1 till talet. Det stämmer alltså delvis, men det är returvärdet det gäller och inte själva variabeln?

Medlem sedan maj 20021 466 inlägg
#10

saw:
Det finns ju ingen Tag till MenuItem-objektet. :OO
Däremot finns det till ListViewItem och TreeNode. Märkligt.

I vilket fall kan du använda det andra alternativet jag föreslog.

class RecentMenuItem : MenuItem
{
// Dina variabler
}

SPiN: ++i returnerar det nya värdet och i++ returnerar det gamla. Variabeln kan inte användas innan den har ändrats. Det är omöjligt.

Variabeln används först efter att den har ändrats och när det andra blocket i for-satsen anropas (i < myArray.Count).

280 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
135 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
135 ms — ändringar (db)