Formatierte Eingabe
-
Ich habe den Quellcode folgendermaßen geändert, der Fehler ist nun weg, aber es werden immernoch die Sekunden angezeigt.
m_cMyTime.Format("%HH:%mm");
-
Danke für den Quellcode, wie du richtig bemerkt hast bin ich mit dieser Materie nicht richtig vertraut.
Aber bei der Verwendung des Quellcodes erhalte ich nun folgenden Fehler:
error C2440: 'initializing' : 'class CWnd *' kann nicht in 'class CDateTimeCtrl *' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Danke für deine Geduld
-
Arg, ich hab den Cast vergessen.
Sorry, nächster Anlauf:
CDateTimeCtrl* pCtrl = dynamic_cast<CDateTimeCtrl*>(GetDlgItem(IDC_DATETIMEPICKER)); ASSERT(pCtrl); if (pCtrl) { pCtrl->SetFormat("HH:mm"); }
-
nun erhalte ich Debug Assertion Failed!
haste ne idea ??
-
Wenn es an der selben Stelle steht wie das falsche vorhin - nein. Es muss nach CDaoRecordView::OnInitialUpdate(); stehen.
Drück doch mal Wiederholen und poste, wo er steht.
-
Sorry habe fergessen auf Release zu stellen.
Jetzt ist der Fehler weg, aber die Sekunden sind noch da.
-
Ähm, wenn du auf Release stellst kommt natürlich kein ASSERT mehr. Den solltest du aber nicht ignorieren. Das ist eine Art Warnung zur Laufzeit, dass etwas nicht stimmt. (Lies bitte mal MSDN dazu.)
Stell bitte auf Debug um und zeig mal Code (s.o.). Leider bin ich in 10 min weg - dann gehts morgen weiter.
-
void CStundenView::OnInitialUpdate()
{
GetRecordset();
CDaoRecordView::OnInitialUpdate();CDateTimeCtrl* pCtrl = dynamic_cast<CDateTimeCtrl*>(GetDlgItem(IDC_DATETIMEPICKER));
ASSERT(pCtrl);
if (pCtrl)
{
pCtrl->SetFormat("HH:mm");
}UpdateData(FALSE);
}
-
Ist es der ASSERT(pCtrl)? Dann ist da ein Wurm drin, den ich mit dem wenigen Code nicht erkennen kann.
Hast du bei der Meldung auf wiederholen gedrückt?
-
Nach dem Wiederholen wird der Fehler bei
--> ASSERT(pCtrl);
angezeigt.
-
Ich habe Jetzt meinen Quellcode folgendermaßen geändert:
Steuerelement : IDC_DATETIMEPICKER
Typ: CDateTimeCtrl
Element: m_cMyTimevoid CStundenView::OnInitialUpdate() { GetRecordset(); CDaoRecordView::OnInitialUpdate(); m_cMyTime.SetFormat("HH:mm"); UpdateData(FALSE); }
Auf diesem Weg Funktioniert es.
Danke für den Tipp und die Ausdauer bei der Lösung meines Problems.
-
Okay, nimm bitte mal den Assistenten und leg eine zweite Membervariable für das Control an.
Dieses Mal wählst du aber "Control", als Datentyp sollte dann nur noch CDateTimeCtrl gehen. Und dann versuchst du nochmal diese Zeile:
m_dtpZeiteingabe.SetFormat("HH:mm");
m_dtpZeiteingabe ist der Name von der neuen Variablen.
Ich fürchte, dass das auch nicht geht - aber dann kann ich ohne selbst zu debuggen nichts mehr herausfinden.
Der ASSERT bedeutet folgendes:
Das Control existiert noch nicht oder es ist nicht vom Typ CDateTimeCtrl.Hier nochmal der Code mit ausführlichen Kommentaren, denn auch wenn er hier nicht geht, so ähnlich wirst du ihn noch oft tippen.
// Einen Zeiger auf das Fenster des Controls holen und gleich in den richtigen Typ wandeln. CDateTimeCtrl* pCtrl = dynamic_cast<CDateTimeCtrl*>(GetDlgItem(IDC_DATETIMEPICKER)); // Im Debugmodus eine Meldung bringen, damit man auf jeden Fall merkt, wenn etwas nicht stimmt. Denn, wenn der Zeiger NULL ist, kann nicht damit gearbeitet werden. ASSERT(pCtrl); // Im Releasemodus würde er wegen einem Zugriff auf einen NULL-Zeiger abstürzen, daher die if. if (pCtrl) { // Nun kann ganz sicher mit dem Zeiger gearbeitet werden. pCtrl->SetFormat("HH:mm"); }
So viele Zeilen für einen Zeiger...
Hier im Forum kannst du oft diese Variante finden:GetDlgItem(IDC_DATETIMEPICKER)->EnableWindow(TRUE);
Dabei wird einfach davon ausgegangen, dass der Zeiger okay ist - dir wäre das Programm gnadenlos abgestürzt und du hättest nicht gewußt warum.
(Edit: Hier kam gerade sowas wie ich meinte: http://www.c-plusplus.net/forum/viewtopic.php?t=80674). C-Casts sollte man nicht mehr verwenden und geprüft wird nichts...)Den ASSERT kann man weglassen, aber die if ist wichtig. Der ASSERT ist nur eine Hilfe für dich wärend der Entwicklung.
In der Release werden die ASSERTs komplett weggelassen - schreib da also keine Zuweisungen oder so rein, das in Klammern wird in der Release nicht ausgeführt.
Wenn du wissen willst, ob ein Befehl ausgeführt werden konnte, dafür ist VERIFY. (Einfach merken und bei Gelegenheit nachlesen.)
-
Hallo
Ich hatte die Membervariable für CDateTimeCrtl genau so deklariert wie von Dir beschrieben.
Nur sind die 2x Punkte zwischen der Variable und der Funktion korrekt ??
Bei mir wird bei 2 Punkten ein Fehler ausgegeben.
Mit nur einem Punkt,c_dtpZeiteingabe.SetFormat("HH:mm");
funktioniert es bei mir. Jetzt habe ich nur noch das Problem wie kann die in
desem Control eine Zeit setzen, die Funktion SetTime() funktioniert b.z.w. gibt es nicht.Danke
-
Die Punkte waren ein Copy&Paste Fehler, sorry.
Die Funktion SetTime gibt es. Wenn sie nicht funktioniert, musst du mal in die MSDN gucken (sofern nicht schon geschehen) und gucken ob du sie richtig benutzt.
Wenn du dir sicher bist - zeig mal her.
-
Bei der Benutzung einer Membervariable vom Typ Control als CDateTimeCtrl,
finde ich nur die Funktion SetTimer();Das Auslesen der Zeit über GetTime() funktioniert.
Etwas anderes Habe ich bis jetzt nicht gefunden, auch wenn ich eine 2 Variable vom Typ CString zu meinem vorhandenen Steuerelement zuordne funtioniert dies nicht obwohl dann die Funktion SetTime() forhanden ist.
-
Auf dieses Menü verlass dich NIEMALS komplett, oder du bist verlassen. Wie du gerade gemerkt hast.
Wenn du wissen willst, was eine Klasse kann: MSDN aufmachen, Klassennamen eingeben, Classmembers aufrufen.So, nächster Anlauf...
-
Ich habe gefunden was du meinst.
CDateTimeCtrl* pCtrl = (CDateTimeCtrl*) GetDlgItem(IDC_DATETIMEPICKER1); ASSERT(pCtrl != NULL); // set with a CTime CTime timeTime(1998, 4, 3, 0, 0, 0); VERIFY(pCtrl->SetTime(&timeTime));
ich habe immer das & vor timeTime vergessen mit diesem Funktioniert es.
Ich Danke Dir du hast mir sehr geholfen.
-
Ich sehe gerade, du hast etwas geändert, an dem Code, den ich dir gegeben habe, warum?
CDateTimeCtrl* pCtrl = (CDateTimeCtrl*) GetDlgItem(IDC_DATETIMEPICKER1); ASSERT(pCtrl != NULL);
Das ist ein C-Cast, die sollte man in Cpp nicht mehr verwenden, vor allem nicht wenn man zwischen Klassen castet. Der dynamic_cast, den ich geschrieben hatte, hatte schon seinen Grund. (Wenn der Compiler meckert, musst du RTTI einschalten, das geht in den Projekteigenschaften.)
Naja, ich will dich nicht weiter verwirren, hoffentlich siehst du irgendwann ein, was ich meinte.
Schön, dass es jetzt geht.
-
[quote="estartu_de"]Ähm, wenn du auf Release stellst kommt natürlich kein ASSERT mehr. Den solltest du aber nicht ignorieren. Das ist eine Art Warnung zur Laufzeit, dass etwas nicht stimmt. NUTTE