Einzelnen Beitrag anzeigen

Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Listbox nach Datum sortieren

  Alt 30. Mai 2009, 10:46
Hallo Satty67

erstmal Danke für Deine Antwort

Du schreibst:

Zitat von Satty67:
Du sortierst anhand der Tage seit 1.1.1990... ich nehme an, die Liste wird auch mit den Tagen am Anfang gespeichert oder in "Lade" davor eingefügt.
Die Liste wird ohne Tage gespeichert, die Tage sind werden in der 'sortieren Funktion eingefügt und entfernt. Sie dienen nur dem Sortiervorgang und müssen danach entfernt werden, weil sonst das weitere Proggi nicht funktioniert - es muß für weitere Funktionen das Datum an erster Stelle stehen.

Zitat von Satty67:
Wenn alles geladen und sortiert ist, entfernst Du die Tage, weil es doof aussieht. Wahrscheinlich in der Funktion "Lade" oder "aktuell", je nachdem... den Code hast Du nicht gezeigt.
Wie gesagt wird alles in der Func 'Sortiere' erledigt. Hier mal die Func:
Delphi-Quellcode:
function TForm1.sortiereListe(L:TListbox):TListbox;
var i: integer;
    Tage : string;
    Zeilendatum:String;
    Zeilenrest:string;
begin
for i := 0 to L.items.count-1 do
begin
ZeilenDatum:= copy(L.Items[i],1,10);
Zeilenrest:= copy(L.Items[i],11,length(L.Items[i]));
if IstString_einDatum(Zeilendatum) then
      {sortiert nach Monaten, Jahreszahl(2xxx muß aktuell sein}
// Tage:= Datumsdiff_inTagen(strtodate('01.01.2009'),setEreignisDatuminZukunft(strtodate(Zeilendatum),strtodate('01.01.2009')));
      {sortiert nach Jahr und Tag, ab 1900}
Tage:= Datumsdiff_inTagen(strtodate('01.01.1900'),setEreignisDatuminZukunft(strtodate(Zeilendatum),strtodate('01.01.1900')));
if copy(Tage,1,1)='-then Tage:=copy(Tage,2,length(Tage));
L.Items[i]:='';
if length(Tage)=1 then Tage:='0000'+Tage;
if length(Tage)=2 then Tage:='000'+Tage;
if length(Tage)=3 then Tage:='00'+Tage;
if length(Tage)=4 then Tage:='0'+Tage;
L.Items[i]:=Tage+' '+Zeilendatum +''+ Zeilenrest;
end;
L.Sorted := True;
for i := 0 to L.items.count-1 do L.Items[i]:=copy(L.Items[i],7,length(L.items[i])); //Entfernt die Tage
Result:=L;
end;
Zitat von Satty67:
Sooo.. die Liste ist geladen, sortiert und die Tage davor sind entfernt.

***

Jetzt kommt ein neuer Eintrag in die Liste, ohne die Tage davor. Die ganze Liste hat ja inzwischen keine Tage davor, weil Du die beim Laden entfernt hast, weil es doof aussieht.
Genau, hier die Proc:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var InputString:String;
    temp:String;
begin
  InputString:= InputBox('Eingabedialogfenster', 'Datum eingeben, dann 3 Leerzeichen, dann Text', '');
if (IstString_einDatum(DatetoStr(StrtoDate(copy(Inputstring,1,10))))) then
 begin
    temp:= DatetoStr(StrtoDate(copy(Inputstring,1,10)));
    Inputstring:=temp+copy(Inputstring,11,length(Inputstring));
    Listbox1.items.add(Inputstring);
    Listbox1:=(sortiereListe(Listbox1));
aktuell;
    Listbox1.items.SaveToFile('Uebersicht.txt');
 end;
end;
hier das Bild dazu:
http://www.siteupload.de/t961463-ProggiEingabe60jpg.jpg

Zitat von Satty67:
Jetzt kommt Deine Sortier Routine, um wegen dem neuen Eintrag zu sortieren. Die Sortier-Routine funktioniert aber nur mit den Tagen davor, das weist Du.

***

Vor jedem Sortieren wieder die Tage vor die Einträge setzten oder anders sortieren (durch Auswerten des Datums), wäre jetzt eine Möglichkeit. Datumsanzeige ändern, wie sx2008 es vorgeschlagen hat, auch eine Möglichkeit (dann kannst Du Dir die Tage davor ganz sparen).

Ein "schwereres Geschütz" wäre, die Anzahl Tage im Object des Listeneintrages zu speichern und mit einer eigenen kleinen Routine nach Object sortieren.

Siehe oben die Func 'sortieren'

Also, woran könnte es liegen, daß ich nach dem Programmstart nur einmal sortieren kann?
Was ist da los mit der Komponente TListbox?
  Mit Zitat antworten Zitat