![]() |
Re: Nächstes Datum errechnen
Larsi, du wolltest nur wissen, ob deine Lösung besser ist. Als Antwort kommt genaugenommen nur ein "Ja" oder "Nein" in Frage. Mache Sharky also keine Vorwürfe.
Ich habe deinen Code kommentiert und dir deinen Fehler genannt. Theoretisch sollte es dann passen, auch wenn der ständige Zugriff auf die VCL nicht empfehlenswert ist, aber es müsste dann funktionieren. Edit: Es gibt natürlich schon schönere Lösungen. Nicht dass es so aussieht, als halte ich das für eine Musterlösung. :mrgreen: Ich wollte nur, dass er mal ein Erfolgserlebnis hat und vielleicht merkt, dass er zukünftig selbst mit etwas mehr Überlegen hinter eine mögliche Lösung kommen kann. |
Re: Nächstes Datum errechnen
Wenn der erste Code NICHT geht aber der schon, dann würde ich schon sagen, dass der Code besser ist.
|
Re: Nächstes Datum errechnen
Geht er denn auch mit verschiedenen Jahren?
|
Re: Nächstes Datum errechnen
Es ist auf jeden Fall ne Verbesserung :lol:
|
Re: Nächstes Datum errechnen
Ich habe auch lange überlegt...
kommentierter Code von Larsi..
Delphi-Quellcode:
das g soll im Prinzip nix anderes sein, als mit dem ersten Wert der Liste beim ersten Durchlauf zu vergleichen. Wenn aber der erste Wert der Liste schon kleiner ist als Now funktioniert die ganze Schose nicht mehr. :roll:
var
i: Integer; g: integer; begin g := 1; // was das soll weiß nur Larsi, eine 0 könnte ich noch verstehen // er geht in einer Schleife alle Einträge durch ... for i := 0 to Listview1.Items.count - 1 do begin // ... prüft nach dem Konvertierungs-Gewurschtel von "Now" ob die Einträge in der Zukunft liegen ... if StrToDate(DateToStr(Now)) < StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) then begin // ... und dann, ob der Eintrag, der in der Schleife überprüft wird, // kleiner ist als der Index des Minimum-Eintrags (Index g) ... if StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) < StrToDate(Listview1.Items.Item[g].SubItems.Strings[0]) then // ... und setzt den neuen Min-Index falls der Listeneintrag kleiner ist g := i; end; end; ShowMessage(Inttostr(g)); end; |
Re: Nächstes Datum errechnen
Also bei mir geht es auch wenn der erste Eintrag schon kleiner ist als now. Kann ich nicht ganz nachvollziehen.
|
Re: Nächstes Datum errechnen
Zitat:
Zitat:
Ich weiß ja nicht, was Larsi will, aber er scheint zufrieden zu sein. Edit: Wobei, er fragt ja explizit ab, ob der Eintrag in der Zukunft liegt und prüft nur dann weiter. Das möchte er vermutlich. |
Re: Nächstes Datum errechnen
Zitat:
Na dann würd ich ihn nochmal von vorne schreiben :lol: |
Re: Nächstes Datum errechnen
Jetzt hätte ich beinahe meine (auch nicht optimale) Lösung gepostet, aber damit warte ich lieber noch :lol:
|
Re: Nächstes Datum errechnen
Wenn ich den ersten Wert beispielsweise
01.01.1950 nenne, dann sollte es doch nicht gehen oder? Tuts aber. |
Re: Nächstes Datum errechnen
Zitat:
Larsi: schaue dir noch mal meinen Code an und versuche zu verstehen was passiert. Wenn du möchtest kommentiere ich ihn noch mal. geprüft und für gut befunden :P
Delphi-Quellcode:
function NachstesDatum : TDate;
var MinDate: TDate; I: integer; begin MinDate:= Now; for I := 0 to ListView1.Items.Count - 1 do begin if StrToDate(Listview1.Items.Item[i].Caption) > Now then begin if MinDate = Now then begin MinDate:= StrToDate(Listview1.Items.Item[i].Caption); end else begin if (StrToDate(Listview1.Items.Item[i].Caption) < MinDate) then begin MinDate:= StrToDate(Listview1.Items.Item[i].Caption); end; end; end; Result:= MinDate; end; end; |
Re: Nächstes Datum errechnen
Und wenn der Wert 31.12.1950 ist?
|
Re: Nächstes Datum errechnen
Nuja es geht schon, aber die Folgewerte, auch wenn sie das morgige Datum haben, die werden nie ausgespuckt, da 1950 kleiner ist.
Edit: Ich weiß nicht welche Werte drinnen stehen. Er soll halt alle alten rausschmeißen, wenn er da welche drinnen hat. Davon, dass es eine suboptimale Lösung ist, braucht ihr mich nicht zu überzeugen. :stupid: |
Re: Nächstes Datum errechnen
Gehts immernoch.
|
Re: Nächstes Datum errechnen
Das Orakel ist mal wieder sprachlos, ach ja, das kommt schon öfters mal vor, da muß man sich nicht viel bei denken.
Für das nachvollziehen würde sich doch ein Papierkomputer eignen oder ein kleines Fluß-/Struktogramm das man mit Papier und Bleistift und ein paar Beispieldaten aufbauen kann. Dies nur vorab. Was ich mich allerdings frage, weshalb möchtest Du das ganze in einer LV sortieren und das ganze andere zeugs machen? Würde sich hier nicht eine kleine interne Liste dazu viel besser eignen, wo Du dann nur noch den Zeiger setzen müsstest. Dann hättest Du auch die Darstellung von der ganzen Verarbeitung getrennt und wärst viel flexibler und robuster. Schöne Grüße aus der Altjahreswoche OREADEN |
Re: Nächstes Datum errechnen
Zitat:
Und der Code funktioniert. Was meinst du sonst mit diesem Beitrag? |
Re: Nächstes Datum errechnen
Nun poste ich meinen Ansatz doch einmal. Larsi kann sich ja dann selbst Gedanken machen, wieso auch dieser suboptimal ist.
Delphi-Quellcode:
[edit] Schon wieder 4 Seiten? Das wird wohl langsam zur Gewohnheit bei Larsi-Threads :stupid: [/edit]
function GetNextDateIndex(const sl: TStrings): integer;
var minDate, aDate: TDate; i: integer; begin Result := -1; minDate := IncYear(StartOfAYear(YearOf(date))); for I := 0 to sl.Count - 1 do begin aDate := StrToDate(Copy(sl[i],1,6) + FormatDateTime('yyyy',date)); if (aDate >= date) and (aDate < minDate) then begin minDate := aDate; Result := i; end; end; end; |
Re: Nächstes Datum errechnen
Aber dein Code ist ja für TStrings und daher für ne Listview nicht geeigent. Gegen was muss ich den das ersetzen, dass ich es mit einer Listview machen kann.
|
Re: Nächstes Datum errechnen
Zitat:
|
Re: Nächstes Datum errechnen
Ich habe das mit einer Listbox probiert, da kann man einfach die Items übergeben. So musst Du halt eine Stringliste anlegen, mit den Subitems füllen und übergeben. Anschließendes Freigeben nicht vergessen.
|
Re: Nächstes Datum errechnen
Edit: Ich habe vor der 2 am Anfang ne 0 vergessen.
|
Re: Nächstes Datum errechnen
@DeddyH
Delphi-Quellcode:
funktioniert so nicht wirklich, da das erste gefundene Datum in der Zukunft größer als dein Startwert von minDate sein kann.
if (aDate >= date) and (aDate < minDate) then
:wink: |
Re: Nächstes Datum errechnen
Sicher? ;)
|
Re: Nächstes Datum errechnen
eigentlich schon. Da ich bei meinen Überlegungen auf dieses Problem gestoßen war.
Delphi-Quellcode:
du initialisierst minDate mit 01.01.2009 00:00, wenn ich o.g. Funktion richtig interpretiere. (ausgegangen vom heutigen Datum)
minDate := IncYear(StartOfAYear(YearOf(date)));
wenn der erste höhere als heute gültige Eintrag (z.B. 02.05.2009) gefunden wird ist
Delphi-Quellcode:
...False und minDate wird nicht aktualisiert.
if (aDate >= date) and (aDate < minDate) then
|
Re: Nächstes Datum errechnen
Die Datumsangaben werden alle auf das laufende Jahr gesetzt (OK, durch Stringfunktionen, deshalb ja suboptimal), minDate ist aber immer der 1.1. des nächsten Jahres, muss also zwangsläufig immer größer sein.
|
Re: Nächstes Datum errechnen
eben nicht :P
Heute: 30.12.2008 minDate: 01.01.2009 erster Eintrag in Liste: 02.05.2009 minDate < erster Eintrag sprich... aDate > minDate prinzipiell funktioniert das, wenn minDate einen gültiger Eintrag der Liste darstellt. So lange das nicht der Fall ist würde nur ein minDate Startwert Heute + 100 Jahre weiterhelfen. 8) |
Re: Nächstes Datum errechnen
Aus dem 02.05.2009 wird doch der 02.05.2008 gemacht (zumindest bis übermorgen).
|
Re: Nächstes Datum errechnen
.. um das ganze noch verwirrender zu gestalten,
sollte man da nicht zwischen wiederkehrenden und einmaligen Terminen unterscheiden? Bei den wiederkehrenden Terminen ist die Jahreszahl irrelevant - bei den einmaligen Terminen nicht. Grüße Klaus |
Re: Nächstes Datum errechnen
Zitat:
Zitat:
|
Re: Nächstes Datum errechnen
Zitat:
[edit]@haentschman: Zitat:
|
Re: Nächstes Datum errechnen
ok..ok.. hatte ich übersehen.
:gruebel: wieso dieser Kuddelmuddel... aber...schön daß wir drüber gesprochen haben. :hi: |
Re: Nächstes Datum errechnen
Zitat:
|
Re: Nächstes Datum errechnen
- ist schon interressant in wie viele Richtungen und verschiedenen Code man Probleme lösen kann.
- vor allem wie die Ablauflogik sich von Programmierer zu Programmieren unterscheiden kann. Unterm Strich kommt das selbe raus.... :thumb: einen schönen Tag noch... :hi: |
Re: Nächstes Datum errechnen
Dir auch einen schönen Tag, aber nun wieder Back To Topic (aber nur, wenn es unbedingt noch nötig ist *g*).
|
Re: Nächstes Datum errechnen
Zitat:
Du fragst ob dein Ansatz besser ist. Darauf antworte ich mit einem Nein. An keiner Stelle habe ich die Funktionsfähigkeit deines Codes bewertet sondern den Ansatz wie Du es machst. In meinem Posting davor habe ich Dir zum Beispiel geschrieben das Du die Daten in einer anderen Art "speichern" solltest um damit zu arbeiten. Reaktion von Dir, wie so oft wenn man Dir einen Hinweiss gibt -> Null :!: Noch immer scheinst Du nicht verstanden zu haben was Du machst. Dies zeigt ja eindeutig dieser Code:
Delphi-Quellcode:
Sei so nett und erkläre mir doch mal was der Code macht. Meine Delphi Kenntnisse scheinen nicht auszureichen um es zu verstehen.
StrToDate(DateToStr(Now))
|
Re: Nächstes Datum errechnen
Stephan, unser aller Kenntnis reicht nicht, um dieses Kleinod zeitgenössischer Programmierung in seiner Gesamtheit auch nur ansatzweise nachvollziehen zu können :lol:.
|
Re: Nächstes Datum errechnen
Hallo,
viel interessanter ist, wie der Compiler das optimiert! Bis bald Chemiker |
Re: Nächstes Datum errechnen
Ich kann mir nicht vorstellen, dass der Compiler das merkt.
|
Re: Nächstes Datum errechnen
Hallo DeddyH,
Dann soll es wohl ein Test für die Optimierungsfunktion des Compilers sein. Bis bald Chemiker |
Re: Nächstes Datum errechnen
Zitat:
Delphi-Quellcode:
SCNR
asm
nop end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 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-2025 by Thomas Breitkreuz