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..5] of integer; TueLesson: array[1..5] of integer; WedLesson: array[1..5] of integer; ThuLesson: array[1..5] of integer; FriLesson: array[1..5] of integer;
implementation
{$R *.dfm}
procedure TForm1.BtaddClick(Sender: TObject); begin Teachers.Items[Teachers.ItemIndex] := Edit1.Text; Edit1.Text := ''; end;
procedure TForm1.FormCreate(Sender: TObject); begin 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 Teachers.Perform(LB_SetHorizontalExtent, 5000, 0); end;
procedure TForm1.BtaddKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = VK_Return then Btadd.Click; end;
procedure TForm1.btdeleteClick(Sender: TObject); begin Teachers.DeleteSelected; end;
procedure TForm1.btcloseClick(Sender: TObject); begin close; end;
procedure TForm1.BtsaveClick(Sender: TObject); begin Teachers.Items.SaveToFile('Auswahl.txt'); end;
procedure TForm1.btloadClick(Sender: TObject); begin 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 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??!
Luckie hat folgendes geschrieben : |
| 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 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 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 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) 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
Mr.Retsim hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.BtsaveClick(Sender: TObject); begin 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:
| 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;
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!