Formatierte Eingabe
-
Hallo mal wieder.
Ich habe schon seit längerer Zeit ein Problem.
Ich habe ein EDIT-Eingabefeld und möchte dieses für die Zeiteingabe
in 24 Stundenanzeige (23:30) ohne Sekunden formatieren.Dabei möchte ich nur 2330 eingeben, der Doppelpkt. soll während der Eingabe automatisch gesetzt werden.
( siehe ACCESS Text Eingabeformat ##:##).Oder kann mann das Eingabefeld direkt als COleDateTime benutzen und anschließend das Eingabeformat ändern
( Format HH:MM, der Doppelpkt. soll auch hier während der Eingabe automatisch gesetzt werden.)Ich hoffe das mir jemand Helfen kann.
Danke!!
-
Hat es einen bestimmten Grund, dass du kein CDateTimeCtrl nimmst?
Das Format kann man entsprechend einstellen und als Bonus kannst du die Zeit auch noch per Mausklick eingeben.
-
Ich habe auch bei Datums-/Zeitauswahl keine Möglichkeit gefunden die Sekunden
wegzulassen.Der 2. grund ist das ich außerdem nicht weis, wie mann das Dropdown b.z.w. Drehfeld deaktivieren, unsichtbar, kann.
-
Sekunden weglassen ist einfach: CDateTimeCtrl::SetFormat("HH:mm");
Das Drehfeld deaktivieren oder verstecken sollte auch nicht unmöglich sein...
-
Danke für die schnellen Antworten, aber währe es möglich ein Quellcode Beispiel zu zeigen, denn ich habe keine Ahnung wo mann SetFormat Festlegen muß.
Beim aufruf erscheint der Fehler:
Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
Was mache ich Falsch ??
-
Hmm, sorry du musst noch CDateTimeCtrl:: durch die passende Membervariable ersetzen bzw. einen Zeiger auf das Control, je nachdem, was du hast.
-
Bei diesem versuch bekomme ich immer Debug Fehler beim Ausführen.
Verwendung : IDC_DATETIMEPICKER
Typ : cTime
Element : m_cMyTimekannste mir einen tipp geben ?
thanks
-
So einen Fehler habe ich noch nicht gesehen. Kannst du mal den Code dazu zeigen?
-
public:
CTime m_cMyTime;void CStundenView::DoDataExchange(CDataExchange* pDX)
CDaoRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStundenView)
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER, m_cMyTime);
//}}AFX_DATA_MAP
}void CStundenView::OnInitialUpdate()
{GetRecordset();
CDaoRecordView::OnInitialUpdate();m_cMyTime.Format("HH:mm");
UpdateData(FALSE);
}
-
Ahhh, du hast eine Wertvariable angelegt.
Du brauchst aber eine Controlvariable. Zumindest für SetFormat.Das siehst du auch an den verschiedenen Typen. Deine Variable ist vom Typ CTime, SetFormat ist aber in der Klasse CDateTimeCtrl (deswegen hatte ich das auch so geschrieben, damit du das siehst...).
Wenn du die nicht extra anlegen möchtest, hilft auch:
CDateTimeCtrl* pCtrl = GetDlgItem(IDC_DATETIMEPICKER); ASSERT(pCtrl); if (pCtrl) { pCtrl->SetFormat("HH:mm"); }
Btw: Da du dich scheinbar noch nicht so super auskennst: Du weißt, dass CTime einen sehr eingeschränkten Wertebereich hat?
-
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.