Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kontaktmanager: Ladeschleif funktioniert nicht! (https://www.delphipraxis.net/65835-kontaktmanager-ladeschleif-funktioniert-nicht.html)

Neutron 21. Mär 2006 10:01


Kontaktmanager: Ladeschleif funktioniert nicht!
 
Hallo Leute!
Bitte helft mir ich sitze gerade an einem Kontaktmanager und es kommen massig Probleme auf mich zu!

Zum Verständnis:
Ich speichere die Daten (Name, Nachname, Alter, Wohnort, usw..) in einen Stream Diese Daten speichere ich dann in
einen Unterordner da es viele verschiedene Kontakte(Torben, Otto, Hans, Peter) sind benenne ich die Daten in 1.OKM, 2.OKM, 3.OKM,
4.OKM, usw. Die Zahl ist abhängig von dem Listbox.ItemIndex d.h.:
Peter hat den Index 0 also Speichert er Peter als 0.OKM!

Zum Anfang werden diese Kontakte in einer Schleife geladen. Genau diese Schleife funktioniert nicht!
Hier der Quelltext:

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
I : Integer;
S : String;
U : String;
begin
Form2.Listbox1.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+'Speicher\LB.OKI');
S := Form2.Listbox1.Items.Strings[0];
Form2.ListBox1.Clear;
  for I := 0 to StrtoInt(S) do
    begin
    Count := Count + 1;
    Loadanfang;
    Listbox1.Items.Add(Edit13.Text+' '+Edit14.Text);
    end;
U := ExtractFilePath(Application.ExeName)+'Speicher\LB.OKI';
DeleteFile(U);
Application.OnIdle := IdleHandler;
Listbox1.ItemIndex := 0;
Laden;
end;
So das ist die OnShow procedure diese ruft in der Schleife die procedure Loadanfang; auf:

Delphi-Quellcode:
procedure TForm1.Loadanfang;
var
  Daten: TDatenArray;
  Stream: TStream;
  I: Integer;
  Len: Longint;
begin
  Stream := TFileStream.Create(ExtractFilePath(Application.ExeName)+'Speicher\Daten\'+IntToStr(Count)+'.OKM', fmOpenRead);
  try
    Stream.Read(Len, SizeOf(Len));
    SetLength(Daten, Len);
    for I := 0 to Len - 1 do
    begin
      Stream.Read(Daten[I].ID, SizeOf(Daten[I].ID));
      Stream.Read(Len,SizeOf(Len));
      SetLength(Daten[I].Name, Len);
      Stream.Read(PChar(Daten[I].Name)^, Len);
    end;
  finally
  Stream.Free;
  end;
Edit13.Text := Daten[0].Name;
Edit14.Text := Daten[1].Name;
end;
Und hier ist noch die IdleHandler procedure:

Delphi-Quellcode:
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  Count := Listbox1.ItemIndex;
  Sleep(1);
  Done:= false;
end;
So vielleicht steigt ihr ja durch und findet einen Fehler!
Wenn euch was unklar ist dann fragt ruhig!!!

Klaus01 21. Mär 2006 10:24

Re: Kontaktmanager: Ladeschleif funktioniert nicht!
 
Was geht in der Schleife denn nicht?
Schon mal mit step/trace geschaut wo Du
in die Problem rennst?

Grüße
Klaus

Neutron 21. Mär 2006 10:44

Re: Kontaktmanager: Ladeschleif funktioniert nicht!
 
Also das Problem wird nicht von Delphi angezeigt! :(

Es ist so, dass er ja eigentlich den Vornamen und Nachnamen in die Listbox Laden soll!

Grundidee:

Programm Ende;
Listbox1.Itemindex.savetoFile('C:\Bla');


Programm Start;
Dann beginnt er damit das er die Zahl von ('C:\Bla') lädt und diese in der Variablen I speichert...
Und dann wird die Schleife mit Listbox1.add(Vorname, Nachname) I-mal ausgeführt.
Jedes mal macht er 'count' einen Plus (Count ist eine globale Variable).
Und die Daten (sprich erst einmal Vorname, Nachname) lädt er von ('C:\'+Count+'.OKM);

Aber er lädt immer nur Irgendwelche unverständlichen Sachen! Z.B.:

Ich gebe ein:
1. Vorname: Hans; Nachname: Müller;
2. Vorname: Peter; Nachname: Meyer;

Und er speichert! Ich beende und starte neu und es erscheint:

1: Peter Meyer
2:

oder

1: Hans Müller

Klaus01 21. Mär 2006 10:51

Re: Kontaktmanager: Ladeschleif funktioniert nicht!
 
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
I : Integer;
S : String;
U : String;
begin
  Form2.Listbox1.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+'Speicher\LB.OKI');
  S := Form2.Listbox1.Items.Strings[0];
  Form2.ListBox1.Clear;
  count := 0;
  for I := 0 to StrtoInt(S) do
    begin
     // Count := Count + 1;  { count wird nicht initialisiert}
      Loadanfang;
      Listbox1.Items.Add(Edit13.Text+' '+Edit14.Text);
      count := count + 1;
    end;
  U := ExtractFilePath(Application.ExeName)+'Speicher\LB.OKI';
  DeleteFile(U);
  Application.OnIdle := IdleHandler;
  Listbox1.ItemIndex := 0;
  Laden;
end;
Kann eine Ursache sein.
Das die Daten richtig abgespeichert werden, kannst Du das überprüfen?

Grüße
Klaus

Neutron 21. Mär 2006 10:59

Re: Kontaktmanager: Ladeschleif funktioniert nicht!
 
Ich weiß es jetzt wirklich nicht mehr vielleicht hilft es dir wenn du selbst siehst
Was ich in meinem Größenwahn geschrieben hab!

(Ich nehme das Programm jetzt raus, weil ich nicht möchte, dass sich es zuviele Downloaden) :!:

Klaus01 21. Mär 2006 12:37

Re: Kontaktmanager: Ladeschleif funktioniert nicht!
 
irgendetwas stimmt mit dem speichern nicht.

wenn ich zwei Name in der Liste stehen habe, und schaue mir dann
die Datei 0.OKM und 1.OKM an so steht jeweils ein Name in jeder Datei.
Wenn ich das Programm dann beende, steht nur noch in der zweiten Datei 1.OKM
ein Name in der ersten Datei 0.OKM wurde der Name überschrieben.

in Deinem FormShow habe ich nochfolgendes geändert:
Delphi-Quellcode:

  for I := 0 to StrtoInt(S) do
    begin
      Loadanfang;
      Listbox1.Items.Add(Edit13.Text+' '+Edit14.Text);
      Count := Count + 1;

    end;
weil sonst die Datei 0.OKM nie gelesen wird.

Ich würde mal überprüfen wann Deine count Variable überall gesetzt wird.
Vielleicht nicht nach jeder Änderung speichern, sondern einen extra Button zum speichern machen,
oder dann speichern wenn ein neuer Datensatz angelegt wird und beim Schließen des Programms.

Und vielleicht mal den Code etwas einrücken und kommentieren, so ist er etwas schlecht zu lesen.

Grüße
Klaus

Neutron 21. Mär 2006 13:34

Re: Kontaktmanager: Ladeschleif funktioniert nicht!
 
Danke erstmal! :-D
Ich glaube es liegt hier an dem Listbox1.Itemindex!
Der Fehler ist entstanden, weil ich dachte das wenn ich Listbox1.Itemindex-mal
Speichere das ich damit den gesamten Listboxumfang (d.h. Wie viele Items die Listbox hat)
als Integer erhalte! Aber ich bekomme ja nur den Wert den ich gerade ausgewählt habe!

Und Zack Fehler!

Danke nochmals!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.

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