TDate Datum in TMonthCalendar anzeigen



  • Da das Problem mit meiner Datenbank abfrage nun soweit geklärt ist, habe ich auch schon das nächste:)

    Also meine idee:

    ich habe den TMonthCalendar und möchte in tdate variablen gespeicherten datums(gibts das?) im kalender mit bolddays fett markieren.

    habe folgenden text gefunden:
    void __fastcall TForm1::MonthCalendar1GetMonthInfo(TObject *Sender, DWORD Month,
    DWORD &MonthBoldInfo)

    {
    unsigned bolddays[2] = {1,8};
    unsigned Buffer = MonthBoldInfo;
    MonthCalendar1->BoldDays(bolddays,1,Buffer);
    MonthBoldInfo = Buffer;
    }

    zum testen wunderbar! jetzt werden in jedem monat der 1 und der 8 markiert!

    Wie kann ich jetzt verschiedene datums 🙂 markieren?!

    habe gedacht, das ich vieleicht irgendwo über ne funktion, den tag/monat/jahr übergeben kann... leider nein 😕

    Die Borland Hilfe und im Internet hab ich leider nix hilfreiches gefunden...

    hat jemand ne idee?!



  • z.B. so:

    void __fastcall TForm1::MonthCalendar1GetMonthInfo(TObject *Sender, DWORD Month, 
    DWORD &MonthBoldInfo) 
    {
    TDateTime date[2] = {TDateTime("15.04.2010"),TDateTime("16.05.2010")};
    WORD day,month,year,hour,minute,seconde,millisecond;
    
    unsigned Buffer = MonthBoldInfo;
    for (int i = 0; i < 2; i++)
    	{
    	DecodeDateTime(date[i],year,month,day,hour,minute,seconde,millisecond);
    	unsigned bolddays;
    	if (Month == month)
    		{
    		bolddays = day;
    		MonthCalendar1->BoldDays(&bolddays,0,Buffer);
    		}
    	}
    MonthBoldInfo = Buffer;
    }
    

    verwende doch bitte das SyntaxColoring für deine Quellcodeausschnitte



  • ach gott du bist mein held!!!!!

    vielen vielen dank!!! so machen selbst fehler spass:)



  • kann es aber sein, dass man pro monat nur ein tag markieren kann?

    wenn ich nämlich 2 im gleichen monat markieren möchte funktioniert das nicht!



  • Otz110 schrieb:

    kann es aber sein, dass man pro monat nur ein tag markieren kann?

    Dann wär diese Komponente so ziemlich sinnfrei.
    Hier irgendwo im Forumsarchiv gibts aber einen Thread, wo das schonmal besprochen
    wurde. Im Moment fehlt mir aber der Link...

    edit: hier ist er



  • hmmm ok... hab mir das ganze mal durchgelesen aber werd gerade nicht schlau daraus:

    hab folgenden code:

    TDateTime date[2] = {TDateTime("15.05.2010"),TDateTime("16.05.2010")};
    WORD day,month,year,hour,minute,seconde,millisecond;
    
    unsigned Buffer = MonthBoldInfo;
    for (int i = 0; i < 2; i++)
    	{
    	DecodeDateTime(date[i],year,month,day,hour,minute,seconde,millisecond);
    	unsigned bolddays;
    	if (Month == month)
    		{
    		bolddays = day;
    		MonthCalendar1->BoldDays(&bolddays,0,Buffer);
    		}
    	}
    MonthBoldInfo = Buffer;
    

    jetzt macht "überschreibt" er ja verständlicherweise das erste datum....

    wie mach ich das jetzt am besten? ich stehe irgendwie grad aufm schlauch....:(



  • Otz110 schrieb:

    jetzt macht "überschreibt" er ja verständlicherweise das erste datum....

    Solange bolddays kein Array ist, immer.
    In deiner Zeile 11 ist der Haken.

    edit: und Zeile 12 sollte heissen:

    MonthCalendar1->BoldDays(bolddays, 31, Buffer);
    

    Mit Betonung auf 31 statt 0. Denn soviele Tage kann ein Monat haben...



  • TDateTime date[2] = {TDateTime("15.05.2010"),TDateTime("16.05.2010")};
    WORD day,month,year,hour,minute,seconde,millisecond;
    	unsigned bolddays[2];
    unsigned Buffer = MonthBoldInfo;
    for (int i = 0; i < 2; i++)
    	{
    	DecodeDateTime(date[i],year,month,day,hour,minute,seconde,millisecond);
    
    	if (Month == month)
    		{
    		bolddays[i] = day;
    		MonthCalendar1->BoldDays(bolddays[i], 31, Buffer);
    		}
    	}
    MonthBoldInfo = Buffer;
    

    hab jetzt wie gesagt die bolddays als array deklariert... ach ich glaub ich sollte für heute schluss machen. hab kein kopf



  • kpeter schrieb:

    Mit Betonung auf 31 statt 0. Denn soviele Tage kann ein Monat haben...

    ich glaub die Zahl gibt eher die Menge der Elemente im Array an, siehe BCB-Hilfe:

    void __fastcall BoldDays(const unsigned * Days, const int Days_Size, unsigned &MonthBoldInfo);

    Beschreibung

    Mit BoldDays werden die Tage im aktuellen Monat codiert, die fett angezeigt werden sollen. Der von BoldDays zurückgegebene Wert kann dem Parameter MonthBoldInfo einer OnGetMonthInfo-Ereignisbehandlungsroutine zugewiesen werden.

    Der Parameter Days ist ein Integer-Array ohne Vorzeichen mit den Tagen, die fett angezeigt werden sollen. Days_Size ist der Index des letzten Wertes in diesem Array (Anzahl der Werte - 1).

    versuchs mal so:

    TDateTime date[2] = {TDateTime("15.05.2010"),TDateTime("16.05.2010")};
    WORD day,month,year,hour,minute,seconde,millisecond;
    
    unsigned Buffer = MonthBoldInfo;
    int j = 0;
    for (int i = 0; i < 2; i++)
        {
        DecodeDateTime(date[i],year,month,day,hour,minute,seconde,millisecond);
        unsigned bolddays[31];
        if (Month == month)
            {
            bolddays[j] = day;
            MonthCalendar1->BoldDays(bolddays,j,Buffer);
            j++;
            }
        }
    MonthBoldInfo = Buffer;
    


  • ok funktioniert soweit... vielen dank..

    aber warum funktioniert meine jetztige idee nicht:

    MHD=="20.04.2010";
    
    int j = 0;
    TDateTime date[2] = {TDateTime("01.01.1990"),TDateTime("01.01.1990")};
    WORD day,month,year,hour,minute,seconde,millisecond;
    for (int u=1; u < 2; u++)
    {
       if (date[u]=="01.01.1990")
       {
    	   date[u]=MHD;
    	   u=3;
       }
    
    }
    
    unsigned Buffer = MonthBoldInfo;
    
    for (int i = 0; i < 2; i++)
    	{
    	DecodeDateTime(date[i],year,month,day,hour,minute,seconde,millisecond);
        unsigned bolddays[31];
    	if (Month == month)
    		{
    		bolddays[j] = day;
    		MonthCalendar1->BoldDays(bolddays,j,Buffer);
    		j++;
    		}
    	}
    MonthBoldInfo = Buffer;
    }
    

    meine idee, im date array ein datum zu ersetzen durch mhd(als zuersetzendes habe ich 01.01.1990 genommen.....)

    grüße 🤡



  • was genau "funktioniert nicht"?

    wieviel Datumswerte hast du denn? und wo bekommst du sie her?

    in meinem Quellcode war das Datums-Array nur ein Beispiel, je nachdem wo du deine Daten her bekommst kannst du auch eine andere Feldvariante nehmen, z.B. aus nem Query, vector usw.

    noch ein Tipp: um For-Schleifen komplett abzubrechen verwendet man break, um den aktuellen Schleifendurchlauf abzubrechen und mit dem nächsten weiter zu machen continue



  • Linnea schrieb:

    kpeter schrieb:

    Mit Betonung auf 31 statt 0. Denn soviele Tage kann ein Monat haben...

    ich glaub die Zahl gibt eher die Menge der Elemente im Array an,

    Das war jetzt eher überflüssig.
    Da man ja nun nicht weiss, wieviele Tage der Anwender fett dargestellt haben will,
    legt man das Array im Vorhinein auf 31 Tage aus. Das dies dann die Anzahl der Arrayelemente ist,
    ist wohl klar.



  • also ich muss wohl etwas weiter ausholen.

    ich mache zurzeit ein projekt bei dem ich ein kühlschrank über einen rfid reader produkte und das mindeshaltbarkeitsdatum erkennen lasse.

    jetzt wollte ich wenn die rfid transponder eingelesen werden das datum an so einem kalender anzeigen lassen.
    (eventuell falls möglich noch durch klick auf das jeweilige datum, direkt zu den produkten die an dem tag ablaufen wechseln und falls möglich wenn man über das datum fäht das eine kleine nachrichtkommt die ebenfalls die ablaufenden produkte anzeigt) 🕶 🕶

    das eingelesene mhd ist als tdate deklariert.

    jetzt dachte ich mir ich löse das neuhinzufügen von frisch eingelesen mhds so:

    TDateTime date[2] = {TDateTime("01.01.1990"),TDateTime("01.01.1990")};

    for (int u=1; u < 2; u++)
    {
    if (date[u]=="01.01.1990")
    {
    date[u]=MHD;
    u=3;
    }

    }

    ich erstelle das array date mit den 2 werten ("01.01.1990") als standartwert. wenn jetzt ein neues datum eingelesen wird, wird es in mhd übergeben!
    jetzt will ich abfragen wenn ein neues übergeben wird an welcher stelle noch ein standartdatum ("01.01.1990") steht und es durch das neue ersetzen. klingt sicherlich nicht ganz profesionell und sicherlich gibt es noch einfachere und übersichtlichere methoden aber diese hier kam mir zuerst in den kopf:)



  • ahh ich habs es funktioniert....

    mein problem war ich hab anstatt = den vergleich mit == geschrieben...

    so einfach kanns sein:)

    void __fastcall TForm1::MonthCalendar1GetMonthInfo(TObject *Sender, DWORD Month,
    	  DWORD &MonthBoldInfo)
    
    { MHDX = "21.04.2010";
    
    int j = 0;
    TDateTime date[2] = {TDateTime("01.01.1990"),TDateTime("01.01.1990")};
    
    for (int u=1; u < 2; u++)
    {
       if (date[u]=="01.01.1990")
       {
    	   date[u]=MHDX;
    	   u=3;
       }
    
    }
    WORD day,month,year,hour,minute,seconde,millisecond;
    
    unsigned Buffer = MonthBoldInfo;
    
    for (int i = 0; i < 2; i++)
    	{
    	DecodeDateTime(date[i],year,month,day,hour,minute,seconde,millisecond);
    	unsigned bolddays[31];
    	if (Month == month)
    		{
    		bolddays[j] = day;
    		MonthCalendar1->BoldDays(bolddays,j,Buffer);
    		j++;
    		}
    	}
    MonthBoldInfo = Buffer;
    }
    


  • was nicht funktioniert hast du immernoch nicht gesagt...

    in deinem Quellcode ist ein Fehler in der For-Schleife: u muß bei 0 beginnen, da jedes Array mit dem Index 0 anfängt
    außerdem stimmt die Abfrage nicht ganz:

    TDateTime date[2] = {TDateTime("01.01.1990"),TDateTime("01.01.1990")}; 
    
    for (int u=0; u < 2; u++) 
      { 
      if (date[u]==TDateTime("01.01.1990")) 
        { 
        date[u]=MHD; 
        break; 
        } 
      }
    

    aber damit wird immer wieder das erste Datum überschreiben, weil du die Definition für das Datums-Array in der Funktion MonthCalendar1GetMonthInfo stehen hast und nicht als Variable der Klasse, da bei jedem Aufruf der Funktion das Datums-Array neu erstellt wird -> Thema "Variablengültigkeit/Scop"

    außerdem bist du so immer auf 2 Datumswerte begrenzt

    hast du die MHD alle in einer Datenbank oder werden die nur zum Zeitpunkt des "Einlesens" dargestellt?



  • Linnea schrieb:

    was nicht funktioniert hast du immernoch nicht gesagt...

    sorry:) es wurde kein oder nur ein datum angezeigt!

    Linnea schrieb:

    aber damit wird immer wieder das erste Datum überschreiben, weil du die Definition für das Datums-Array in der Funktion MonthCalendar1GetMonthInfo stehen hast und nicht als Variable der Klasse, da bei jedem Aufruf der Funktion das Datums-Array neu erstellt wird -> Thema "Variablengültigkeit/Scop"

    ok reicht es wenn ich die variable einfach global definiere?

    Linnea schrieb:

    außerdem bist du so immer auf 2 Datumswerte begrenzt

    ich kann das ganze ja noch endlos erweitern...

    Linnea schrieb:

    hast du die MHD alle in einer Datenbank oder werden die nur zum Zeitpunkt des "Einlesens" dargestellt?

    jaa ich hab die ganzen datums(daten!?) in einer access datenbank stehen die ich über eine ado connection und nem query in meinem programmcode zugreife..



  • Otz110 schrieb:

    jaa ich hab die ganzen datums(daten!?) in einer access datenbank stehen die ich über eine ado connection und nem query in meinem programmcode zugreife..

    na dann ist es doch recht einfach: mach die SQL-Abfrage in die Funktion, beim SQL-Kommando kannst du sogar nur die mit dem gerade angezeigten Monat eingrenzen, dann ein Feld mit den Werten füllen und anzeigen, fertig.



  • Linnea schrieb:

    na dann ist es doch recht einfach: mach die SQL-Abfrage in die Funktion, beim SQL-Kommando kannst du sogar nur die mit dem gerade angezeigten Monat eingrenzen, dann ein Feld mit den Werten füllen und anzeigen, fertig.

    hmm einfach 😕

    dann will ichs mal probieren

    ich hab mir meine sql anweisung

    Form3->ADOQuery1->SQL->Clear();
    Form3->ADOQuery1->SQL->Add("Select MHD From DerInhalt");
    Form3->ADOQuery1->Open();
    

    dann hab ich hier mein kalenderprogramm von vorhin:

    MHDX = "21.04.2010";
    
    int j = 0;
    TDateTime date[2] = {TDateTime("01.01.1990"),TDateTime("01.01.1990")};
    
    for (int u=1; u < 2; u++)
    {
       if (date[u]=="01.01.1990")
       break;
       {
    	   date[u]=MHDX;
    	   u=3;
       }
    
    }
    WORD day,month,year,hour,minute,seconde,millisecond;
    
    unsigned Buffer = MonthBoldInfo;
    
    for (int i = 0; i < 2; i++)
    	{
    	DecodeDateTime(date[i],year,month,day,hour,minute,seconde,millisecond);
    	unsigned bolddays[31];
    	if (Month == month)
    		{
    		bolddays[j] = day;
    		MonthCalendar1->BoldDays(bolddays,j,Buffer);
    		j++;
    		}
    	}
    MonthBoldInfo = Buffer;
    

    aber jetzt zusammenfügen?!?!?!?!?

    wohin werden die mhds aus der tabele gespeichert wenn ich sie mit meiner sql abrufe?



  • ungetestet, aber ein bißchen was kannst du ja auch selbst machen:

    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("Select distinct day(MHD) as ttag From DerInhalt where month(MHD) = :monat ");
    ADOQuery1->Parameters->ParamByName("monat")->Value = Month;
    ADOQuery1->Open();
    int count = ADOQuery1->RecordCount;
    if (count <= 0) return;
    unsigned feld[31];
    unsigned Buffer = MonthBoldInfo; 
    for (ADOQuery1->First();!ADOQuery1->Eof;ADOQuery1->Next())
      {
      feld[ADOQuery1->RecNo-1] = ADOQuery1->FieldByName("ttag")->AsInteger;
      }
    MonthCalendar1->BoldDays(feld,count-1,Buffer);
    ADOQuery1->Close();
    MonthBoldInfo = Buffer;
    

    [Edit] ups da hab ich wohl noch die Abfrage nach dem Jahr des angezeigten Kalender vergessen 😉



  • hmm das funktioniert ja schon aber irgendwie markiert er mir nur die mhds von april und mai...

    hab in der tabelle aber noch von oktober... und von nächstem jahr stehen.
    was ist da denn der fehler? ist das array zu klein gewählt?


Anmelden zum Antworten