Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prblem bei erstellen einer txt datei (https://www.delphipraxis.net/144371-prblem-bei-erstellen-einer-txt-datei.html)

jonsen2.0.0.9 6. Dez 2009 12:18


Prblem bei erstellen einer txt datei
 
Hallo,

hab jetzt ma versucht, ein Programm zu schreiben bei dem man Notizen in eine Checklistbox machen kann.

Das funktioniert auch alles aber ich möchte, das wenn man das Programm beedet und dann wieder startet das man die Notizen wieder hat.

Außerdem soll das Programm die beim schließen automatisch in eine .txt datei schreiben.

das sieht bis jetzt so aus:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
Var i:integer;
   sl:TStringList;
begin
 sl := TStringList.Create;
 try
  for i := 0 to CheckListBox1.Items.Count - 1 do
   begin
    if (CheckListBox1.Checked[i] = true) then
     sl.Add(CheckListBox1.Items[i]);
   end;
 finally
  sl.SaveToFile(sDir + '\Notes.txt'); \\sDir ist der Pfard in dem das Programm ist!  (sDir:=GetCurrentDir;)
  sl.Free;
 end;
end;

er erzeugt zwar eine Text datei aber schreibt nichts in sie.


und wie man die dann wieder ausliest weiss ich leider auch nich...hoffe ihr habt nen paar tipps für mich!

Micha88 6. Dez 2009 12:23

Re: Prblem bei erstellen einer txt datei
 
Liste der Anhänge anzeigen (Anzahl: 1)
EDIT: ist in der CheckListBox überhaupt was drin, was gespeichert werden kann?

jonsen2.0.0.9 6. Dez 2009 12:46

Re: Prblem bei erstellen einer txt datei
 
ja hab vorher immmer was eingetrage....

himitsu 6. Dez 2009 12:54

Re: Prblem bei erstellen einer txt datei
 
Dann debuge doch mal diese Prozedur und schau was Delphi da macht, bzw.warum es da etwas nicht macht.


Zitat:

Delphi-Quellcode:
if (CheckListBox1.Checked[i] = true) then

versuch mal
Delphi-Quellcode:
if CheckListBox1.Checked[i] then

patti 6. Dez 2009 12:58

Re: Prblem bei erstellen einer txt datei
 
Oder probier das ganze mal bei OnCloseQuery und nicht bei OnClose. Vielleicht hilft das ja, weil eigentlich müsste der Code schon stimmen :gruebel:

jonsen2.0.0.9 6. Dez 2009 13:01

Re: Prblem bei erstellen einer txt datei
 
na gut das läuft jetzt nur jetzt hab ich ein anderes problem:

ich will das alle abgehackten notizen (checked=true) beim schließen gelöscht werden und danach eingetragen und gespeichert wier:

ABER WAS MACHE ICH HIER FALSCH DAS DER IMMER ABSCHMIERT ANSTATT ZU BEENDEN UND ZU SPEICHER:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
 i: integer;
 sl: TStringList;
begin
 sl := TStringList.Create;
 try
  for i := Pred(CheckListBox1.Items.Count) downto 0 do
   begin
     if CheckListBox1.Checked[i]=true then
      CheckListBox1.Items.Delete(i)
      else
      sl.Add(CheckListBox1.Items[i]);
   end;
 finally
  sl.SaveToFile(sDir + '\Notes.txt');
  sl.Free;
 end;
Form1.Close;
end;

himitsu 6. Dez 2009 13:12

Re: Prblem bei erstellen einer txt datei
 
ABSCHMIERT ist keine Fehlerbeschreibung!

Was passiert (Fehlermeldung) und wo passiert es.
Auch hier hilft oftmals ordentliches Debugen!

sl.SaveToFile gehört vor das Finally, denn tritt dort eine Exception auf, weil z.B. nicht gespeichert werden konnte, dann wird SL nicht freigegeben.

Form1.Close in OnClose? Ich den die Form wurde schon geschlossen?

Und ganz interessant:
Warum willst du die Einträge löschen, wo die Form doch eh grad geschlossen und womöglich gleich gelöscht wird?

Und ws soll bitte dieses GROßGESCHREIBE bringen? (auf mich wirkt es so, als wenn ich angeschrieen werde)

wicht 6. Dez 2009 13:14

Re: Prblem bei erstellen einer txt datei
 
Ich würde vermuten, dass es gar nicht kompiliert, aufgrund dieser schönen Zeile:
Code:
sl.Add(CheckListBox1.Items[i]);
sollte das nicht vielleicht
Code:
sl.Add(CheckListBox1.Items[i].Text);
oder .Caption am Ende heißen?

HTH..

jonsen2.0.0.9 6. Dez 2009 13:23

Re: Prblem bei erstellen einer txt datei
 
also fangen wir mal an:

es gibt keine Fehlermeldung sondern der Taskmanager meint keine Rückmeldung und meine CPU ist bei 90-100%(beide) auslastung (duel core 3ghz pro kern)



Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
 i: integer;
 sl: TStringList;
begin
 sl := TStringList.Create;
 try
  for i := Pred(CheckListBox1.Items.Count) downto 0 do
   begin
     if CheckListBox1.Checked[i]=true then
      CheckListBox1.Items.Delete(i)
      else
      sl.Add(CheckListBox1.Items[i]);
   end;
    sl.SaveToFile(sDir + '\Notes.txt');
 finally
  sl.Free;
 end;
Form1.Close;
end;

muss dat sl.savefile da wos jetzt ist hin? in die schleife kanns ja eigentlich nich gehören...

Micha88 6. Dez 2009 13:25

Re: Prblem bei erstellen einer txt datei
 
Hat sich mal einer meinen VORSCHLASG angesehen?
Das funktioniert nämlich.

Davon abgesehen, du solltest die erstmal die Basics ansehen, bevor du irgentwelche Funktionen wie pred verwendest.

Hättets du die die Basics auf www.dsdt.info abgesehen, so hättest du hier hete keine Fragen gestellt.

jonsen2.0.0.9 6. Dez 2009 13:27

Re: Prblem bei erstellen einer txt datei
 
ja hab angesehen und versuche das gerade bei mir einzubauen nur du siehst ja welche fehler da auftauchen warum auch immer...

himitsu 6. Dez 2009 13:27

Re: Prblem bei erstellen einer txt datei
 
Zitat:

Zitat von jonsen2.0.0.9
es gibt keine Fehlermeldung sondern der Taskmanager meint keine Rückmeldung und meine CPU ist bei 90-100%(beide) auslastung (duel core 3ghz pro kern)

und warte mal etwas ... irgendwann kommt 'ne "Stack-Voll"-Exception :zwinker:

und genau sowas fällt beim Debuggen auf :warn:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ..
  Close;
end;
OnClose (diese Prozedur) wird aufgerufen
Close ruft ebenfalls Diese (sich selber) auf
= Endlosschleife


und dann nochwas:
=true oder =false nutzt man NIE zum vergleichen/prüfen
die globale Objektvariable (hier Form1) nutzt man NIE innerhalb des Objektes selber

Micha88 6. Dez 2009 13:28

Re: Prblem bei erstellen einer txt datei
 
Zitat:

Zitat von jonsen2.0.0.9
ja hab angesehen und versuche das gerade bei mir einzubauen nur du siehst ja welche fehler da auftauchen warum auch immer...

Also bei mit läuft es ohne Exceptions, ohne hohe CPU :/

jonsen2.0.0.9 6. Dez 2009 13:31

Re: Prblem bei erstellen einer txt datei
 
was nutze ich denn anstelle von =true = false?

gut DANKE für den tipp mit der endlosschleife geht ohne die :oops:

und das programm läuft jetzt auch so wie es laufen soll...DANKE AN ALLE
:thumb:

jonsen2.0.0.9 6. Dez 2009 13:32

Re: Prblem bei erstellen einer txt datei
 
michael habe bei mir auch was geändert um das an mein programm anzupassen...hab aber etwas falsch gemacht !

hatte ausversehen endlosschleife drin.... :oops:

Progman 6. Dez 2009 13:37

Re: Prblem bei erstellen einer txt datei
 
Weil du wahrscheinlich eine Endlosschleife programmiert hast :)
Man macht keine for-Schleifen über Listen, deren Elemente in der for-Schleife gelöscht werden. Irgendwann greift die Laufvariable ins Leere. Das löst man besser mit while. (So als Anmerkung) :warn:

Matze 6. Dez 2009 13:40

Re: Prblem bei erstellen einer txt datei
 
Zitat:

Zitat von jonsen2.0.0.9
was nutze ich denn anstelle von =true = false?

Das wurde z.T. bereits geschrieben:

Delphi-Quellcode:
// true
if CheckListBox1.Checked[i] then

// false
if not CheckListBox1.Checked[i] then
Grüße, Matze

wicht 6. Dez 2009 13:44

Re: Prblem bei erstellen einer txt datei
 
Zitat:

Man macht keine for-Schleifen über Listen, deren Elemente in der for-Schleife gelöscht werden. Irgendwann greift die Laufvariable ins Leere. Das löst man besser mit while. (So als Anmerkung)
Was spricht denn außer ästhetischen Gründen dagegen? Die Laufvariable ist am Ende meist 0, und das ist dann, wenn ich das letzte Element lösche, bevor die Schleife zuende ist. Oder ist das falsch?

Progman 6. Dez 2009 16:48

Re: Prblem bei erstellen einer txt datei
 
Will man alle Einträge einer Liste löschen, ist while ideal:
Delphi-Quellcode:
while Liste.Count > 0 do Liste.Delete(0);
Will man nur Einträge löschen, die einer bestimmten Bedingung genügen dann ergäbe eine for-Schleife (im Mindestfall) falsche Ergebnisse.
Beispiel:
Delphi-Quellcode:
for i:=0 to Liste.Count-1 do begin
  if Liste[i]=Bedingung then Liste.Delete(i);
end;
Angenommen, die Liste hat 5 Einträge (0..4) und Eintrag 2 erfüllt die Bedingung. Dann würde er gelöscht und Eintrag 3 würde zu 2 und 4 zu 3. Die Laufvariable i wird aber erhöht und prüft als nächstes Liste[3], die ja vorher die 4 war. Die eigentliche ursprüngliche 3 wird gar nicht mehr geprüft, sondern "übersprungen".
Das sind so die kleinen Stolpersteine, die einen dann ins Grübeln bringen :)

himitsu 6. Dez 2009 17:02

Re: Prblem bei erstellen einer txt datei
 
@Progman: darum läßt man in soeinem Fall die Schleife rückwärts laufen,
so wie es auch schon gemacht wurde.
Delphi-Quellcode:
for i := Pred(CheckListBox1.Items.Count) downto 0 do
Dann gibt es dieses Problem auch nicht.

Beim Vorwärtslaufen gibt es 2 Probleme:
- Delphi merkt sich das Ende der schleife und fragt dieses nur einmal ab
drum kann man da auch über das Listenende hinausgeraten, wenn die Liste kürzer wird
- wird etwas gelöscht, dann wird der nächste Index übersprungen, da er ja nun den selben Index bekommen hat


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz