Autor Beitrag
matze94
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Fr 17.09.10 17:33 
ich möchte das jenachdem welcher listbox eintrag gerade markiert ist der string path einen bestimmten wert annimt

also das ich eine datei (.exe) öffnen kann die in der Liste verzeichnet ist, nur müsste ich ja dan jeden eintrag noch einen wert haben, aber wie mache ich das? vielleicht mit einer 2spaltigen listbox wo die 2.spalte versteckt ist?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 17.09.10 17:43 
An eine Listbox kannst du Objekte binden und nicht nur Strings.
Also schreib dir eine Klasse die alle Daten enthält die an einem Eintrag hängen sollen und zeige dann Instanzen dieser Klasse in der Listbox an.

Hilfreiches aus der Hilfe.
matze94 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Fr 17.09.10 18:29 
äh wie schreib ich eine klasse?
so lang beschäftige ich mich noch nicht mit winforms
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 17.09.10 20:46 
user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
äh wie schreib ich eine klasse?
so lang beschäftige ich mich noch nicht mit winforms

Du beschäftigst dich wohl insgesamt noch nicht lange mit C#? Denn Klassen gehören nicht zu WinForms, sondern in die Grundlagen der Sprache. Am besten suchst du dir ein schönes Buch oder ein Tutorial, zum Beispiel das von Galileo OpenBook.
matze94 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 18.09.10 12:19 
ich hab mich jetzt mal mit klassen beschäftigt blos noch eine frage
ich einen button im programm der einträge hinzufügt bzw. einen der löscht einen
wenn ich aber die zusätliche eigenschaft über eine klasse mach muss ich für einen neuen eintrag das programm ändern
wie machen das aber programme wie z.b. pstart oder asuite?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 18.09.10 16:38 
Hallo,

könntest du in deinem nächsten Beitrag bitte von der Interpunktion Gebrauch machen? Danke. :)

Du willst die hinzugefügten Einträge auf Dauer speichern, ohne sie aber fest im Programmcode zu verankern, sehe ich das richtig? (Edit: wahrscheinlich nicht, aber ich hab deinen Beitrag beim besten Willen nicht verstanden)

Dann gibt es mehrere Möglichkeiten. Zum Einen kannst du eine Datei erstellen und in diese die Dateiliste schreiben:

ausblenden C#-Quelltext
1:
2:
3:
4:
using (StreamWriter writer = new StreamWriter(Application.UserAppDataPath + "\\paths.txt")) {
  writer.WriteLine("erste Zeile");
  writer.WriteLine("zweite Zeile");
}

Dabei wird die Datei "paths.txt" im Anwendungsdaten-Ordner des lokalen Benutzers angelegt und die zwei Zeilen hineingeschrieben. Die WriteLine-Aufrufe müssen bei dir natürlich die Dateipfade schreiben.

Auslesen kannst du die Zeile dann analog:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (File.Exists(Application.UserAppDataPath + "\\paths.txt")) {
  using (StreamReader reader = new StreamReader(Application.UserAppDataPath + "\\paths.txt")) {
    MessageBox.Show(reader.ReadLine());
  }
}


Eine andere Möglichkeit wären Anwendungseinstellungen.


Zuletzt bearbeitet von Yogu am Sa 18.09.10 16:59, insgesamt 2-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 18.09.10 16:52 
Zitat:
könntest du in deinem nächsten Beitrag bitte von der Interpunktion Gebrauch machen? Danke. :)

Enthält zumindest 1 Satzzeichen. Aber leider nicht einen Großbuchstaben. :(

Zitat:
wenn ich aber die zusätliche eigenschaft über eine klasse mach muss ich für einen neuen eintrag das programm ändern

Hä? Jeder Eintrag ist eine Instanz der selben Klasse. Wenn man jede Klasse nur einmal einsetzen könnte wäre ja Objektorientierte Programmierung wahrscheinlich schon Sekundenbruchteile nach ihrer Erfindung auch wieder verworfen worden. ;) Wo siehst du die Notwendigkeit einer weiteren Eigenschaft für einen weiteren Eintrag?

Zitat:
wie machen das aber programme wie z.b. pstart oder asuite?

Möglicherweise genauso wie von mir beschrieben. In den verschiedenen UI Frameworks gibt es aber natürlich jeweils andere Verfahren so etwas zu lösen. Die Autoren werden als ein Verfahren benutzt haben das zu dem von ihnen benutzten UI Framework passt.
matze94 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 18.09.10 18:47 
@ yogu
Zum teil richtig, dass mit den speichern funktioniert bei mir schon, etwas anders als von dier beschrieben.
nun will ich das jenachdem welches item gerade ausgewählt ist der string path einen bestimmten wert annimmt
ich hab mir schon überlegt ob ich vielleicht eine datenbank integriere, was aber warscheinleich sehr schwierig ist.
@Ralf Jansen
Zitat:
Wo siehst du die Notwendigkeit einer weiteren Eigenschaft für einen weiteren Eintrag?

der bestandteil von diesen programm soll folgende funktion erfüllen:
Programme, insbesondere Portable Programm liegen in unterverzeichnisen über eine autorun.inf wird beim einsteck des usb sticks (wo die programme droben sind) soll so eine Art Menü gestartet werden. Dort sollen in einer Liste die einträge auftauchen nach dem auswählen eines Programm und den drücken eines buttons sollen das jeweilige programm starten

eigentlich müssten die listbox einträge ja dann in einer datenbank (z.b. mdb) liegen oder?
Weil ich brauch ja 3 werte por eintrag:
- den namen der in der Listbox angezeigt wird
- den Pfad (Path.Combine(Application.StartupPath, @"\Unterpfad\");
- den Namen der .exe (z.b. firefox.exe)
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 18.09.10 19:52 
user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
eigentlich müssten die listbox einträge ja dann in einer datenbank (z.b. mdb) liegen oder?

Das wäre natürlich die optimale Umsetzung, allerdings wäre es ziemlich viel Aufwand für ein vergleichsweise kleines Projekt. Da das Programm portabel sein soll, wäre es außerdem blöd, wenn erst einmal ein Datenbank-Client installiert werden müsste.

user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
Weil ich brauch ja 3 werte por eintrag:
- den namen der in der Listbox angezeigt wird
- den Pfad (Path.Combine(Application.StartupPath, @"\Unterpfad\");
- den Namen der .exe (z.b. firefox.exe)

Dann kannst du dir einfach eine Klasse erstellen, die diese drei Eigenschaften hat. Dann musst du noch die Methode ToString überschreibst, und in ihr den Anzeigenamen zurückgeben.

Der nächste Punkt ist, die Klassen in eine Datei zu schreiben und aus ihr zu lesen. Am einfachsten wäre es wohl, die Klasse dazu in einen String nach dem Schema "DateinameMitPfad=Anzeigename" umzuwandeln, und einen Konstruktur bereitzustellen, der diesen String als Parameter bekommt.

Das war jetzt ziemlich viel auf einmal, hier ein bisschen Code zur Veranschaulichung:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
class ListEntry {
  private string fileName;
  private string displayName;

  public ListEntry(string fileName, string displayName) {
    this.fileName = fileName;
    this.displayName = displayName;
  }

  public ListEntry(string serialized) {
    // serialized ist ein String der Form "fileName=displayName"

    // Also suchen wir nach dem letzten Vorkommen eines Gleichheitszeichens
    int equalSignPos = serailized.LastIndexOf('=');

    // Der Dateiname ist links vom Zeichen, der Anzeigename rechts davon.
    this.fileName = serialized.Substring(0, equalSignPos-1);
    this.displayName = serialized.Substring(equalSignPos+1);
  }

  public string FileName { get { return fileName; } set {fileName = value; } }
  public string DisplayName { get { return displayName; } set {displayName = value; } }

  public string Serialize() {
    return fileName + "=" + displayName;
  }

  public string ToString() {
    return displayName;
  }
}

Wir haben eine Klasse mit zwei Feldern (fileName und displayName), auf die von Außen durch die Eigenschaften FileName und DisplayName zugegriffen werden kann.

Die Methode Serialize() gibt einen String zurück, der in eine Datei geschrieben werden kann. Mit dem zweiten Konstruktor kann aus einem solchen String wieder eine Instanz von ListEntry erstellt werden.

Alles klar? ;)
matze94 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 18.09.10 20:10 
das mit der klasse hab ich jetzt soweit verstanden
das code beispiel wandelt von displayName in fileName um.
also muss ich die displayName in der listbox anzeigen
dann durch den code laufen lassen und den fileName trennen in pfad und datei und ausführen
und welchen soll ich in der datei (liste.xml) speichern?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 18.09.10 20:28 
user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
das code beispiel wandelt von displayName in fileName um.

Öhm, nein. Es kann einen serialisierten String in Dateiname und Anzeigename umwandeln, und anders herum.

user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
also muss ich die displayName in der listbox anzeigen

Du musst nur eine Instanz der Klasse ListEntry der ListBox hinzufügen - die Klasse ist ja dafür da, den Anzeigenamen dann anzuzeigen, also regelt sie das selbst (mit der ToString-Methode).

user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
dann durch den code laufen lassen und den fileName trennen in pfad und datei und ausführen

Wieso willst du FileName in Pfad und Datei trennen?

Im Prinzip musst du beim Klick auf den Ausführen-Knopf folgendes machen:

ausblenden C#-Quelltext
1:
2:
3:
object item = listBox1.Items[listBox1.SelectedIndex];
ListEntry entry = (ListEntry)item;
Ausführen(entry.FileName);


user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
und welchen soll ich in der datei (liste.xml) speichern?

Den serialisierten String (Rückgabewert von Serialize())
matze94 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: So 19.09.10 09:10 
bis jetzt sieht das schreiben in die datei so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
string sFile = Application.StartupPath + "\\Liste.xml";
System.IO.StreamWriter oStream = null;
int i = 0;
oStream = new System.IO.StreamWriter(sFile);
while(i < listBox1.Items.Count)
{
    oStream.WriteLine(listBox1.Items[i]);
    i = i + 1 ;
}
oStream.Close();


aber dann muss ich ja das dan für jedes element mit einen anderen argument als "listBox1.Items[i]" benutzen?

der code fürs einlesen sieht so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
            string sFile = Application.StartupPath + "\\Liste.xml";
            System.IO.StreamReader oStream = null;
            string sLine = null;
            listBox1.Items.Clear();
            System.IO.FileInfo oFile = new System.IO.FileInfo(sFile);
            if (oFile.Exists == true)
            {
                oStream = new System.IO.StreamReader(sFile);
                do
                {
                    sLine = oStream.ReadLine();
                    if ((sLine == null))
                    break;
                    listBox1.Items.Add(sLine);
                } while (true);
                oStream.Close();
                if (listBox1.Items.Count == 0)
                {
                }
                else
                {
                    button6.Enabled = true;
                    button9.Enabled = true;
                    button10.Enabled = true;
                }
            }

was muss ich dort beachten?
CSMN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43
Erhaltene Danke: 2



BeitragVerfasst: So 19.09.10 11:36 
hi matze94,

du machst dir das ziemlich kompliziert.

das:
ausblenden C#-Quelltext
1:
2:
3:
System.IO.StreamWriter oStream = null;
int i = 0;
oStream = new System.IO.StreamWriter(sFile);


kannst du auch so schreiben:
ausblenden C#-Quelltext
1:
2:
System.IO.StreamWriter oStream = new System.IO.StreamWriter(sFile);
int i = 0;


du verwendest eine while-schleife, obwohl dir die anzahl der
durchläufe bekannt ist:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
while(i < listBox1.Items.Count)
{
    oStream.WriteLine(listBox1.Items[i]);
    i = i + 1 ;
}


da würde ich eine for-schleife nehmen, damit fällt dann weiter
oben die deklaration und initialisierung von i weg.

ausblenden C#-Quelltext
1:
2:
3:
4:
for(int i=0; i<listBox1.Items.Count;i++)
{
    oStream.WriteLine(listBox1.Items[i]);
}




beim einlesen hast du die folgende logik
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
                if (listBox1.Items.Count == 0)
                {
                }
                else
                {
                    button6.Enabled = true;
                    button9.Enabled = true;
                    button10.Enabled = true;
                }



das kannst du auch wie folgt schreiben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
                if (listBox1.Items.Count != 0)
                {
                    button6.Enabled = true;
                    button9.Enabled = true;
                    button10.Enabled = true;
                }


des weiteren verwendest du keine try & catch logik. try & catch wird in der
anwendung empfohlen wenn es nicht auf die performance ankommt. das heißt das
der quelltext - von der deklaration von simplen typen abgesehen - von diesen
blöcken umschlossen wird und eine auswertung bzw. mitteilung im catch block
vorgenommen wird.

ansonsten muss ich gestehen, dass ich deine frage nicht verstanden habe. was
genau war deine frage?
matze94 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: So 19.09.10 12:40 
Also, da ich gemerkt habe das ich eindeutig nicht genügend programmierkentnisse für dieses komplexe programm besitze habe ich beschlossen dieses projekt einstweilen auf eis zu legen und mich etwas einfacheren sachen zu witmen, bzw. den funktionsumfang des programms zu minimieren bzw. zu vereinfachen. aus diesen grund "fliegt" auch die listbox raus und wird durch einen normalen windowsordner mit verknüpfungen ersetzt. trotzdem dank für die hilfe
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Mo 20.09.10 09:52 
prinzipiell ist dein prob relativ einfach zu lösen...
ich hab mal zwei kleine funktionen gebastelt.
ich benutzte die klasse, die dir yogu gegeben hat, damit da nicht zu viel neues ist...
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
private void LoadFiles()
        {
            DirectoryInfo dir = null;
            // do not use this, if u know the directory.
            // use DirectoryInfo dir = new DirectoryInfo(yourdirpath); instead
            FolderBrowserDialog dialog = new FolderBrowserDialog();
            if (dialog.ShowDialog() == DialogResult.OK)
                dir = new DirectoryInfo(dialog.SelectedPath);
            else
                return;
            //*
            var files = dir.GetFiles("*.exe", SearchOption.AllDirectories);
            foreach (var file in files)
                listBox.Items.Add(new ListEntry(file.FullName, file.Name));
        }
        private void Execute()
        {
            string file = ((ListEntry)listBox.SelectedItem).FileName;
            Process.Start(file);
        }


mit LoadFiles() lädst du alle *.exe dateien in deine listBox.
mit Execute() startet er die in der listBox ausgewählte datei.

mehr code ist es eigentlich nicht ^^

/edit: ich würde btw, willst du die dateien lieber von einer datei laden, eine .xml datei empfehlen.