Entwickler-Ecke

Dateizugriff - Einträge aus Listbox markiern und speichern in text Datei


Mr.Retsim - Mi 24.11.10 21:35
Titel: Einträge aus Listbox markiern und speichern in text Datei
Hallo,
bin ganz neu in dem Forum und noch ein ziemlicher Anfänger was Delphi angeht! Also bitte habt Geduld und Verständnis!

Also für die Schule müssen wir eine Bereitschaftsliste erstellen.
D.h.: In ein Edit Feld werden 3 Namen eingetippt und durch einen Button auf einer Listbox angezeigt. Bei Bedarf kann man die Einträge in der Listbox auch löschen. Soweit alles kein Problem.

Zudem habe ich noch zwei weitere Listboxen, eine mit den Wochentagen, die andere mit den Stundenzahlen (1-5). In diese habe ich ein Array angelegt, welches mir dann beim Ausführen des Programms die Einträge (Wochentage, Stundenzahl) anzeigt.

Nun möchte ich aber einen Tag und eine Stunde markieren und die Namen die in der Listbox stehen unter Tag und Stunde (z.b. Montag 3te Std) in einer Textdatei durch einen Buttonklick speichern. Diese Textdatei soll auch wieder wenn ich Montag und 3te Std. markiere durch einen Buttonklick geladen werden und in der Listbox erscheinen.

Ich habe das mit den Befehlen (Teachers=Listbox)
Teachers.Items.SaveToFile('Auswahl.txt'); und ListBox1.Items.LoadFromFile('Auswahl.txt')
versucht… doch dies funktioniert nicht und ich glaube, dass der Algorithmus etwas länger und mit mehr Informationen gespickt sein muss.

Vielen Dank im Voraus!!!!!

Mein Code:

Delphi-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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
var
  Form1: TForm1;
     MonLesson: array[1..5of integer;
     TueLesson: array[1..5of integer;
     WedLesson: array[1..5of integer;
     ThuLesson: array[1..5of integer;
     FriLesson: array[1..5of integer;

 implementation

{$R *.dfm}

procedure TForm1.BtaddClick(Sender: TObject);
begin
//Editfeld
 Teachers.Items[Teachers.ItemIndex] := Edit1.Text;
     Edit1.Text := '';
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
// Eintraege in den Listboxen
       Day.Items.Add('Monday');
       Day.Items.Add('Tuesday');
       Day.Items.Add('Wednesday');
       Day.Items.Add('Thursday');
       Day.Items.Add('Friday');
       Lesson.Items.Add('1. Lesson');
       Lesson.Items.Add('2. Lesson');
       Lesson.Items.Add('3. Lesson');
       Lesson.Items.Add('4. Lesson');
       Lesson.Items.Add('5. Lesson');

end;

procedure TForm1.TeachersClick(Sender: TObject);
begin
  //Scrollbar waagrecht
Teachers.Perform(LB_SetHorizontalExtent, 50000);
end;


procedure TForm1.BtaddKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//Mit Enterkey anstatt auf Button klicken (geht jedoch nicht)
 if key = VK_Return then Btadd.Click;
end;


procedure TForm1.btdeleteClick(Sender: TObject);
begin
//delete Button
  Teachers.DeleteSelected;
end;

procedure TForm1.btcloseClick(Sender: TObject);
begin
//Close Application
  close;
end;

procedure TForm1.BtsaveClick(Sender: TObject);
begin
     // Save and Load

// beim Ende
Teachers.Items.SaveToFile('Auswahl.txt');
end;

procedure TForm1.btloadClick(Sender: TObject);
begin
  // beim Start
//ListBox1.Items.LoadFromFile('Auswahl.txt');
end;

end.


bummi - Mi 24.11.10 22:03

Meinst Du in der Art?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
fn:String;
begin
  fn := IncludeTrailingBackSlash(Paramstr(0)) + IntToStr(Day.Itemindex) + '_' + IntToStr(Lesson.Itemindex) + '.txt';
Teachers.Items.SaveToFile(fn);

bzw.
if FileExists(fn) then Teachers.Items.LoadFromFile(fn);
end;


Mr.Retsim - Mi 24.11.10 22:45

Hallo Vielen Dank für die rasche Antwort
das sieht schon mal sehr gut aus,
den ersten Befehl habe ich schon einmal bei einem ähnlichen Thema gesehen, wenn ich ihn jedoch hier einfüge

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.BtsaveClick(Sender: TObject);
begin
     // Save and Load

fn := IncludeTrainlingBackSlash(Paramstr(0)) + IntToStr(Day.Itemindex) + '_' + IntToStr(Lesson.Itemindex) + '.txt';
Teachers.Items.SaveToFile(fn);
end;

kommt die Meldung "Undefinierter Bezeichner: 'IncludeTrainlingBackSlash'"

Den zweiten Befehl hatte ich mir auch mit einer Schleife vorgestellt, jedoch passiert da nichts wenn ich auf den Load Button klicke.

Danke!


bummi - Mi 24.11.10 22:49

war ein Tippfehler, IncludeTrailingBackSlash

laden über eine Schleife?
ich dachte Du willst die Lehrer für gewählten Tag/Stunde anzeigen?


Delete - Mi 24.11.10 23:08

Muss ich dazu Teachers.Items.SaveToFile('Auswahl.txt'); noch was sagen? :roll:


Mr.Retsim - Mi 24.11.10 23:13

Also, mein Programm sieht so aus:
[img]http://www.s1.directupload.net/file/d/2353/n8lcu8ok_jpg.htm[/img]

Die Namen die in der Listbox sind sollen unter dem markierten Tag und der markierten Stunde mit einem Click auf Save gespeichert werden.
Wenn ich dann wieder Tag und Stunde markiere und auf Load klicke möchte ich das diese Namen wieder in der Listbox erscheinen.

Den Tippfehler habe ich ausgebessert, nun läuft das Programm, aber wenn ich dann auf Save drücke kommt folgende Fehlermeldung:
Im Projekt Project1.exe ist eine Exception der Klasse EFCreateError aufgetreten. Medlung: 'Datei "C:\Users...\0_2.txt" kann nicht erstellt werden. Das System kann den angegebenen Pfad nicht finden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Wenn ich dann auf OK drücke, führt der mich zum Quellcode un markiert folgende Zeile mit einem Grünen Pfeil:

Delphi-Quelltext
1:
Teachers.Items.SaveToFile(fn);                    


Danke für ihre Geduld!!!!


Mr.Retsim - Mi 24.11.10 23:18

@Lukie,Entschuldigung aber das verstehe ich nicht. Wie gesagt ich bin noch ein ziemlicher Anfänger. Das Grobe verstehe ich ja, nur weiß nicht wo ich wann welche Befehle einsetzen muss??!

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Muss ich dazu Teachers.Items.SaveToFile('Auswahl.txt'); noch was sagen? :roll:


Danke


Delete - Mi 24.11.10 23:19

Was meinst du., wo Windows die Datei speichert?


Mr.Retsim - Mi 24.11.10 23:31

Ahhh, also du meinst vor dem .txt muss ich den Speicherpfad eingeben?
Weil ich hatte auch noch wo anders gelesen, dass man dies nicht machen muss.
Naja, aber würde diese Änderung ausreichen um das Programm so zum laufen zu bringen wie ich möchte?
Danke und Gruß


Delete - Mi 24.11.10 23:54

Keine Ahnung, aber es stellt zumindest sicher, dass die Datei auch wieder gefunden wird beim Laden und nicht irgendwo auf der Festplatte gespeichert wird.


bummi - Mi 24.11.10 23:57

Nein...leider bin ich heute wirklich müde, da ist noch ein Fehler

Delphi-Quelltext
1:
fn := IncludeTrailingBackSlash(ExtractFilePath(Paramstr(0))) + .....                    


ExtractFilePath fehlt, sorry.
Paramstr(0) ist der Pfad Deiner Anwendung + Name Deiner Anwendung
ExtractFilePath entfernt den Namen Deiner Anwendung.

Asche auf mein Haupt.


Mr.Retsim - Do 25.11.10 21:16

Hallo,
sry für die späte Antwort, ich war heute lang in der Schule

Also erst mal vielen Dank!
ES FUNKTIONIERT!!!!!!!!!!!!!
Vielen Vielen Dank
So sieht es jetzt aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.BtsaveClick(Sender: TObject);
begin
     // Save and Load

fn := IncludeTrailingBackSlash(ExtractFilePath('C:\Users\Mattheus\Desktop\INFO\Text Dateien')) + IntToStr(Day.Itemindex) + 'Bereitschaftsliste.exe' + IntToStr(Lesson.Itemindex) + '.txt';
Teachers.Items.SaveToFile(fn);
end;


Aber vielleicht können sie mir noch bei einem kleineren Problem helfen:
Nachdem ich etwas in das Editfeld eingetragen habe, möchte ich dass es auch mittels Druck auf die Entertaste in der Listbox erscheint. Bisher habe ich folgendes und es erscheint keine Fehlermeldung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 
procedure TForm1.BtaddKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//Mit Enterkey anstatt auf Button klicken (geht jedoch nicht)
 if key = VK_Return then Btadd.Click;
end;



Vielen Dank, sie haben mir echt sehr geholfen!!!!


bummi - Do 25.11.10 21:19

Das Event sollte wohl am Editfeld hängen?
Und hier Duzen sich alle ....


Mr.Retsim - Do 25.11.10 21:34

Gut stimmt....

Aber jetzt ist mir noch etwas aufgefallen:
Das mit dem Speichern und Laden geht wunderbar! Wenn ich jetzt aber z.B. für Montag 3. Std.: Müller, Klaus, Peter eintrage und speichere kann ich es nicht wieder laden, sobald ich für z.B. Dienstag 4. Std. Franz, Karl, Hans eintrage.
Dann wird es nämlich überschrieben un lädt anstatt Müller, Klaus, Peter hat Franz, Karl, Hans.....

Kann es sein, dass nur die Save und Load Buttons programmiert wurden, unabhängig davon welche Stunde/Tag markiert wurde?
Weil ich möchte für jeden Tag und Stunde verschiedene Namen speichern. Ein Freund hat mir irgendwas von Strinlists und Pointerlists gesagt... vielleicht muss man in dem Fall so was verwenden. (Also das die Pointer dann auf verschiedene Speicherzellen zeigen und dass der Inhalt da wieder auszulesen ist)....

Danke


bummi - Do 25.11.10 21:59

baust Du den Dateinamen so auf?

Delphi-Quelltext
1:
Pfad +  IntToStr(Day.Itemindex) + '_' + IntToStr(Lesson.Itemindex) + '.txt'                    


Mr.Retsim - Do 25.11.10 22:11

Ja: also so sieht jedenfalls der Code aus:

Delphi-Quelltext
1:
2:
fn := IncludeTrailingBackSlash(ExtractFilePath('C:\Users\Mattheus\Desktop\INFO\Text Dateien')) + IntToStr(Day.Itemindex) + 'Bereitschaftsliste.exe' + IntToStr(Lesson.Itemindex) + '.txt';
Teachers.Items.SaveToFile(fn);


Kann man dem da nicht irgendwie sagen: For every Day/Lesson, create new .txt; also sowas in der Richtung, weil er speichert ja alle Textdateien einzeln ab, überschreibt diese aber....

DANKE


bummi - Do 25.11.10 22:13

Kannst Du mir mal den Code als Anhang schicken?


Mr.Retsim - Do 25.11.10 22:27

Klar:
Also ich habe da noch 2 Buttons die noch keine Funktionen haben.


bummi - Do 25.11.10 22:40

Die Funktion zum Laden sollte auch wissen was sie laden soll....
hier mußt Du freilich fn auch setzen, ich würde hier auch keine globale Variable nehmen, im Moment liest Du aus der Datei in die Du zuletzt gespeichert hast.


Mr.Retsim - Do 25.11.10 23:26

Ja das klingt plausibel!
Habs jetzt geändert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.btloadClick(Sender: TObject);
begin
    //Load
if FileExists(fn) then Teachers.Items.LoadFromFile(IncludeTrailingBackSlash(ExtractFilePath('C:\Users\Mattheus\Desktop\INFO\Text Dateien')) + IntToStr(Day.Itemindex) + 'Bereitschaftsliste.exe' + IntToStr(Lesson.Itemindex) + '.txt');

end;


Ich weiß nicht ob du auf das hinaus wolltest, aber jetzt läuft es wo wie es soll!
Weißt du vielleicht, warum er die Texdateien im Ordner INFO speichert, anstatt in INFO-> Text Dateien?

Vielen Dank!!


platzwart - Do 25.11.10 23:34

Dafür muss du noch ein '\' hinter 'Text Dateien' einfügen.


Mr.Retsim - Do 25.11.10 23:43

Ahh gut... hätte ich vielleicht auch selbst drauf kommen können...

Aber dann hätte ich noch eine Frage:
Ist es Möglich, dass wenn ich etwas unter Montag 3.Stunde speichere, die Textdatei dann auch Montag 3.Stunde bzw. Day1 Lesson1 heißt?
Weil bisher speichert er es immer unter XBereitschaftsliste.exe2.txt (wobei X = verschiedene Zahlen)
Also sowas wie: Name .txt after marked item in array?

Danke für eure Hilfe!!!
Gruß


bummi - Fr 26.11.10 00:16

statt

Delphi-Quelltext
1:
2:
3:
IntToStr(Day.Itemindex)
//einfach
Day.Items[Day.ItemIndex]


für Lesson entsprechend.

Bereitschaftsliste.exe würde ich aus dem Dateinamen weglassen(subjektive Meinung)

[OT]
Wenn Du ab und zu mal ein Showmessage(fn) einbaust kannst Du auch ohne Debugger sehen was passiert, ansonsten F5 im Code setzt eine Breakpoint mit F7 im Einzelschritt durchlaufen und mit der Maus über den Variablen stehen bleiben zeigt Dir den Inhalt und die Veränderung
[/OT]

Ich würde harte Pfade vermeiden, im Zweifelsfall lege den Pfad in einer IniDatei/Registryeintrag ab, damit das Programm auch auf anderen Rechnern lauffähig bleibt.


platzwart - Fr 26.11.10 00:18


Delphi-Quelltext
1:
2:
fn := IncludeTrailingBackSlash(ExtractFilePath('C:\Users\Mattheus\Desktop\INFO\Text Dateien\')) + IntToStr(Day.Itemindex) + 'Lesson' + IntToStr(Lesson.Itemindex) + '.txt';
Teachers.Items.SaveToFile(fn);


So als Anreiz... Du musst bloß diese Zeile anpassen...


Delete - Fr 26.11.10 02:07

user profile iconMr.Retsim hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.BtsaveClick(Sender: TObject);
begin
     // Save and Load

fn := IncludeTrailingBackSlash(ExtractFilePath('C:\Users\Mattheus\Desktop\INFO\Text Dateien')) + IntToStr(Day.Itemindex) + 'Bereitschaftsliste.exe' + IntToStr(Lesson.Itemindex) + '.txt';
Teachers.Items.SaveToFile(fn);
end;


Gibt es den Pfad auch auf meinem Rechner? Und auf dem Desktop speichern würde mich auch ziemlich nerven. Wenn das jedes Programm machen würde.


Mr.Retsim - Sa 27.11.10 00:59

Hallo!
Danke für eure Antworten!
Also ich habs jetzt so wie beschrieben zum laufen gebracht.
Jetzt speichert das Programm: z.B.: Monday-3.Lesson


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 // Save
procedure TForm1.BtsaveClick(Sender: TObject);

begin

fn := IncludeTrailingBackSlash(ExtractFilePath('C:\Users\Mattheus\Desktop\INFO\TEXT\')) + Day.Items[Day.ItemIndex] + '-' + Lesson.Items[Lesson.Itemindex] + '.txt';
Teachers.Items.SaveToFile(fn);
end;


   //Load
procedure TForm1.btloadClick(Sender: TObject);
begin

if FileExists(fn) then Teachers.Items.LoadFromFile(IncludeTrailingBackSlash(ExtractFilePath('C:\Users\Mattheus\Desktop\INFO\TEXT\')) + Day.Items[Day.ItemIndex] + '-' + Lesson.Items[Lesson.Itemindex] + '.txt');

end;


Ihr habt recht, es ist ein bisschen doof mit dem Pfad und damit es auch auf den Schulrechnern läuft, müsste ich den Pfad jedes mal ändern. Also ich werde es jetzt mal mit einer solchen iniDatein/Registryeintrag versuchen. @bummi: Vielen Dank!

Danke