Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Nächstes Datum errechnen (https://www.delphipraxis.net/126657-naechstes-datum-errechnen.html)

Matze 30. Dez 2008 12:22

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.

Larsi 30. Dez 2008 12:24

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.

DeddyH 30. Dez 2008 12:27

Re: Nächstes Datum errechnen
 
Geht er denn auch mit verschiedenen Jahren?

Larsi 30. Dez 2008 12:27

Re: Nächstes Datum errechnen
 
Es ist auf jeden Fall ne Verbesserung :lol:

haentschman 30. Dez 2008 12:28

Re: Nächstes Datum errechnen
 
Ich habe auch lange überlegt...

kommentierter Code von Larsi..
Delphi-Quellcode:
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;
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:

Larsi 30. Dez 2008 12:31

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.

Matze 30. Dez 2008 12:32

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von haentschman
das g soll im Prinzip nix anderes sein, als mit dem ersten Wert der Liste zu vergleichen.

Jain, wenn er bei 0 anfangan würde, wäre dies der Fall. Zugleich repräsentiert das g den Index mit dem kleinsten Datum.

Zitat:

Zitat von haentschman
Wenn aber der erste Wert der Liste schon kleiner ist als Now funktioniert die ganze Schose nicht mehr. :roll:

Richtig, dann ginge das ganze nicht.

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.

Meflin 30. Dez 2008 12:32

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Larsi
Kann ich nicht ganz nachvollziehen.

Soso, du kannst also deinen eigenen Code nicht mehr nachvollziehen :gruebel:

Na dann würd ich ihn nochmal von vorne schreiben :lol:

DeddyH 30. Dez 2008 12:34

Re: Nächstes Datum errechnen
 
Jetzt hätte ich beinahe meine (auch nicht optimale) Lösung gepostet, aber damit warte ich lieber noch :lol:

Larsi 30. Dez 2008 12:34

Re: Nächstes Datum errechnen
 
Wenn ich den ersten Wert beispielsweise

01.01.1950 nenne, dann sollte es doch nicht gehen oder? Tuts aber.

haentschman 30. Dez 2008 12:34

Re: Nächstes Datum errechnen
 
Zitat:

Jain, wenn er bei 0 anfangan würde, wäre dies der Fall. Zugleich repräsentiert das g den Index mit dem kleinsten Datum.
:oops: ja klar doch...geht sich bei 0 los.

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;

mkinzler 30. Dez 2008 12:35

Re: Nächstes Datum errechnen
 
Und wenn der Wert 31.12.1950 ist?

Matze 30. Dez 2008 12:35

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:

Larsi 30. Dez 2008 12:36

Re: Nächstes Datum errechnen
 
Gehts immernoch.

Oreaden 30. Dez 2008 12:38

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

Larsi 30. Dez 2008 12:40

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Matze
Nuja es geht schon, aber die Folgewerte, auch wenn sie das morgige Datum haben, die werden nie ausgespuckt, da 1950 kleiner ist.

Ich habe in meiner Listview jetzt z.b. folgendes stehen:

  • User1 31.12.1950
    User2 31.12.2008

Und der Code funktioniert. Was meinst du sonst mit diesem Beitrag?

DeddyH 30. Dez 2008 12:41

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:
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;
[edit] Schon wieder 4 Seiten? Das wird wohl langsam zur Gewohnheit bei Larsi-Threads :stupid: [/edit]

Larsi 30. Dez 2008 12:45

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.

Matze 30. Dez 2008 12:47

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Larsi
Ich habe in meiner Listview jetzt z.b. folgendes stehen:

User1 31.12.1950
User2 31.12.2008

Und der Code funktioniert. Was meinst du sonst mit diesem Beitrag?

Dein Code würde, wenn ich ihn richtig nachvollzogen habe, den 31.12.1950 zurückgeben, sofern du deinen Fehler mit dem falschen Startindex korrigiert hast. Sonst würde das zufälligerweise funktionieren. Setze den Startindex von g auf 0 und du wirst sehen, dass das 1950-Datum zurückgeliefert wird, g also 0 bleibt.

DeddyH 30. Dez 2008 12:47

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.

Larsi 30. Dez 2008 12:53

Re: Nächstes Datum errechnen
 
Edit: Ich habe vor der 2 am Anfang ne 0 vergessen.

haentschman 30. Dez 2008 12:57

Re: Nächstes Datum errechnen
 
@DeddyH
Delphi-Quellcode:
if (aDate >= date) and (aDate < minDate) then
funktioniert so nicht wirklich, da das erste gefundene Datum in der Zukunft größer als dein Startwert von minDate sein kann.
:wink:

DeddyH 30. Dez 2008 12:58

Re: Nächstes Datum errechnen
 
Sicher? ;)

haentschman 30. Dez 2008 13:03

Re: Nächstes Datum errechnen
 
eigentlich schon. Da ich bei meinen Überlegungen auf dieses Problem gestoßen war.

Delphi-Quellcode:
minDate := IncYear(StartOfAYear(YearOf(date)));
du initialisierst minDate mit 01.01.2009 00:00, wenn ich o.g. Funktion richtig interpretiere. (ausgegangen vom heutigen Datum)

wenn der erste höhere als heute gültige Eintrag (z.B. 02.05.2009) gefunden wird ist
Delphi-Quellcode:
if (aDate >= date) and (aDate < minDate) then
...False und minDate wird nicht aktualisiert.

DeddyH 30. Dez 2008 13:05

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.

haentschman 30. Dez 2008 13:08

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)

DeddyH 30. Dez 2008 13:09

Re: Nächstes Datum errechnen
 
Aus dem 02.05.2009 wird doch der 02.05.2008 gemacht (zumindest bis übermorgen).

Klaus01 30. Dez 2008 13:12

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

haentschman 30. Dez 2008 13:13

Re: Nächstes Datum errechnen
 
Zitat:

Aus dem 02.05.2009 wird doch der 02.05.2008 gemacht (zumindest bis übermorgen).
:gruebel:
Zitat:

minDate := IncYear(StartOfAYear(YearOf(date)));
du benutzt aber für die Initialisierung das aktuelle Datum und nicht den Eintrag aus der Liste, der bleibt völlig unberührt.

DeddyH 30. Dez 2008 13:13

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Klaus01
.. 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

Guter Einwand, aber das ist ja dann ein Fall für Larsi :mrgreen:

[edit]@haentschman:
Zitat:

Delphi-Quellcode:
aDate := StrToDate(Copy(sl[i],1,6) + FormatDateTime('yyyy',date));

Hier liegt der Hase im Pfeffer. Ich schneide nur Tag und Monat ab und hänge das laufende Jahr dahinter. Somit ist der 01.01. des Folgejahres immer größer als der erste Eintrag. [/edit]

haentschman 30. Dez 2008 13:26

Re: Nächstes Datum errechnen
 
ok..ok.. hatte ich übersehen.

:gruebel: wieso dieser Kuddelmuddel...

aber...schön daß wir drüber gesprochen haben. :hi:

DeddyH 30. Dez 2008 13:29

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von haentschman
:gruebel:... wieso dieser Kuddelmuddel..

Es sollte ja eben keine C&P-Lösung sein :zwinker:

haentschman 30. Dez 2008 13:34

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:

DeddyH 30. Dez 2008 13:38

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*).

Sharky 30. Dez 2008 18:01

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Larsi
@Sharky:

Jetzt wo ich ernsthaft selber versucht habe trotz meiner fehlenden Delphi Kenntnisse auf die Lösung des Problems zu kommen und wirklich mit meinem Delphi Latein am Ende bin hilft mir so ein Beitrag wie "Nein" nicht weiter. Sharky, als Moderator sollte dir das klar sein, das du mir damit nicht hilfst. Und da die Lösung zumindest bei einem Beispiel funktioniert bin ich noch mehr überfordert wenn man mir nicht mal sagt warum der Code falsch ist. Und wie ich jetzt sehe stimmt mein Code sogar. Wem fehlen hier die Delphi Kenntnisse?

Wo möglich fehlen sie mir. Und auch deutsch kann ich nicht mehr ;-)
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:
StrToDate(DateToStr(Now))
Sei so nett und erkläre mir doch mal was der Code macht. Meine Delphi Kenntnisse scheinen nicht auszureichen um es zu verstehen.

DeddyH 30. Dez 2008 18:06

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:.

Chemiker 30. Dez 2008 18:16

Re: Nächstes Datum errechnen
 
Hallo,

viel interessanter ist, wie der Compiler das optimiert!

Bis bald Chemiker

DeddyH 30. Dez 2008 18:17

Re: Nächstes Datum errechnen
 
Ich kann mir nicht vorstellen, dass der Compiler das merkt.

Chemiker 30. Dez 2008 18:22

Re: Nächstes Datum errechnen
 
Hallo DeddyH,

Dann soll es wohl ein Test für die Optimierungsfunktion des Compilers sein.


Bis bald Chemiker

3_of_8 30. Dez 2008 18:26

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Sharky
Delphi-Quellcode:
StrToDate(DateToStr(Now))
Sei so nett und erkläre mir doch mal was der Code macht. Meine Delphi Kenntnisse scheinen nicht auszureichen um es zu verstehen.

Ist doch ganz einfach. Das ist eine uneingeschränkt portable Version von:
Delphi-Quellcode:
asm
  nop
end;
SCNR


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.
Seite 2 von 3     12 3      

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