Zum Inhalt springen

TDM

Mitglieder
  • Gesamte Inhalte

    1804
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von TDM

  1. ok 2. Versuch (hoffentlich wird es jetzt übersichtlicher ): Da ich die Datei noch Drucken will, hab ich mir so gedacht, dass ich die ja speichern müsste. Ergo: Member Ergo2: Problem mit den Pointern ist weg. Ergo3: Jedes Objekt macht ersteinmal eine eigene Wordschnittstelle: class CWordFile { public: void p_print(void); void p_save(const CString& p_lpPath); void p_setBookMarkText(const CString& p_lpBookMarkName, const CString& p_lpBookMarkText); CWordFile (const CString& p_lpSource); virtual ~CWordFile(); private: struct SValue_t { public: SValue_t(const CString& p_lpPath):m_seWordMembers(p_lpPath) { } CString m_lpeSource; struct SWValue_t { public: SWValue_t(const CString& p_lpPath); ~SWValue_t(); CComDispatchDriver m_oeSpDispDokument; CComDispatchDriver m_oeSpDocuments; IDispatchPtr m_oeSpDocument; HRESULT m_oeHR; VARIANT m_oevResult; CLSID m_oeCLSIDWordApplication; IDispatchPtr m_oeSpIWord; CComDispatchDriver m_oeSpDispWord; } m_seWordMembers; } m_seMembers; }; Zum Verständnis: Objekt wird über Konstruktor erzeugt; Konstruktor erzeugt Memberstruktur; Memberstruktur erzeugt Wordstruktur; Normaler Konstruktor: CWordFile::CWordFile(const CString& p_lpSource):m_seMembers(p_lpSource) { if (p_lpSource.IsEmpty()) { throw "Der Pfad zur Word-Datei ist leer."; } } (Wird vielleicht noch hübscher gemacht.) Der Übersichtlichkeit halber, habe ich noch ein paar Makros definiert: #define MP(p, v) (p.m_seMembers.v) #define MWP(p, v) (p.m_seMembers.m_seWordMembers.v) #define M(v) (this -> m_seMembers.v) #define _MW(v) (this -> m_seMembers.m_seWordMembers.v) #define MW(v) (this -> v) (Die Verweisen einfach auf die jeweilige Variable um Schreibarbeit zu ersparen.) Den Konstruktor der Wordmembers kürz ich mal: CWordFile::SValue_t::SWValue_t::SWValue_t(const CString& p_lpPath) { CoInitialize(NULL); MW(m_oeHR) = CLSIDFromProgID(L"Word.Application", &(MW(m_oeCLSIDWordApplication))); if (SUCCEEDED(MW(m_oeHR))) { MW(m_oeHR) = CoCreateInstance(MW(m_oeCLSIDWordApplication), NULL, CLSCTX_SERVER, IID_IDispatch, (void **) (IDispatch *) &(MW(m_oeSpIWord))); if (SUCCEEDED(MW(m_oeHR)) && (MW(m_oeSpIWord) != NULL)) { // weitere Initialisierungen (s.o.) } } else { CoUninitialize(); throw "Es ist kein MS-Word installiert."; } } So, nun das Problem - der Destruktor: CWordFile::SValue_t::SWValue_t::~SWValue_t() { auto VARIANT a_vArgsClose; a_vArgsClose.vt = VT_BOOL; a_vArgsClose.boolVal = FALSE; if (MW(m_oeSpDocuments) != NULL) { MW(m_oeHR) = MW(m_oeSpDocuments).Invoke1(L"Close", &a_vArgsClose, &(MW(m_oevResult))); } MW(m_oeHR) = MW(m_oeSpDispWord).Invoke0(L"Quit", &(MW(m_oevResult))); MW(m_oeSpIWord) -> ~IDispatch(); //= NULL; CoUninitialize(); } Problem an der Sache ist nun, dass nach dem Konstruktor in MASM der Destruktor von m_oeSpIWord aufgerufen wird. Damit ich aber alle anderen Interfaces befreie, muss ich das lt. Tut. vorher auf NULL setzen. NULL geht nicht, Destruktor geht nicht, delete geht auch nicht. Von NULL den Destruktor aufzufen ist bisschen sinnlos, deswegen bekommen ich da immer einen Access Error. Btw: Wenn jemand was damit anfangen kann: EAX = 00406C2E EBX = 00000000 ECX = 00000100 EDX = 00406C2E ESI = 00000000 EDI = 00000000 EIP = 00406C2E ESP = 0012ECFC EBP = 0012F554 EFL = 00000212 An sich ist das zwar kein Problem, da ich den Member durch expliziten Destruktoraufruf in einem Try-Block zerstöre (und damit nicht immer so ein blödes Fenster kommt), aber dennoch stört sowas. Url zum Tut.: Office Automation mit C++ oder Visual Basic Hoffe jetzt sieht man mehr durch. :/
  2. Hallo, Ich habe folgendes Problem: Über einen Dialog werden Daten eingelesen usw. Diese werden anschließend in einer Maske ausgegeben. In dieser Maske sind außerdem Buttons für das Speichern und Drucken als Worddokument. Dazu habe ich eine Klasse CWordFile geschrieben: class CWordFile { public: void p_print(void); void p_save(const CString& p_lpPath); static const CWordFile p_open(const CString& a_lpDestination); CWordFile(const CWordFile& p_oRhs); void p_setBookMarkText(const CString& p_lpBookMarkName, const CString& p_lpBookMarkText); virtual ~CWordFile(); private: CWordFile( const CString& p_lpSource); struct SValue_t { public: SValue_t(const CString& p_lpSource):m_lpeSource(p_lpSource) {} CString m_lpeSource; struct SWValue_t { public: CComDispatchDriver m_oeSpDispDokument; CComDispatchDriver m_oeSpDocuments; CComDispatchDriver m_oeSpDispWord; IDispatchPtr m_oeSpDocument; } m_seWordMembers; } m_seMembers; static struct SWord_t { HRESULT m_oeHR; VARIANT m_oevResult; CLSID m_oeCLSIDWordApplication; IDispatchPtr m_oeSpIWord; INT m_neMemberCounter; } s_m_seWordMembers; void m_Work(const INT p_nFlags); void m_init(void); void m_uninit(void); }; Es soll nur möglich sein, ein Objekt über die open-Methode zu erzeugen. Evtl. Initialisierungen für Word finden im Konstruktor statt: CWordFile::CWordFile(const CString& p_lpSource):m_seMembers(p_lpSource) { if (++CWordFile::s_m_seWordMembers.m_neMemberCounter == 1) { m_init(); } } und werden evtl. im Destruktor wieder unitialisiert: CWordFile::~CWordFile() { if (--CWordFile::s_m_seWordMembers.m_neMemberCounter == 0) { m_uninit(); } } Wie bereits erwähnt, wird das ein Objekt über einen Dialog erzeugt: void COutputDlg::On_Save_clicked() { auto CString a_lpSource = CSettings::s_p_lpGetWordSource(); static char BASED_CODE szFilter[] = "Worddokumente (*.doc)|*.doc|Textdatei (*.txt)|*.txt; | Alle Dateien (*.*)|*.*||"; auto CFileDialog a_oSFD(FALSE, NULL, NULL, OFN_OVERWRITEPROMPT, szFilter); auto CString a_lpDestination = _T(""); a_oSFD.m_ofn.lpstrTitle="Speichern unter"; if(a_oSFD.DoModal() == IDOK) { a_lpDestination = a_oSFD.GetPathName(); TRACE("%s", a_oSFD.GetFileExt()); try { auto CWordFile a_oFile = CWordFile:_open(a_lpSource); s_m_setBookmarks(a_oFile); a_oFile.p_save(a_lpDestination); } catch (CString p_lpException) { this ->MessageBox(p_lpException); } } }[/code] Es wird also über Open ein neues Objekt erstellt: [code]const CWordFile CWordFile:_open(const CString& p_lpSource) { if (!p_lpSource.IsEmpty()) { auto CString a_lpFile = (LPCTSTR) CFile(p_lpSource, CFile::modeRead | CFile::modeWrite | CFile::typeBinary).GetFilePath(); auto CWordFile a_oResult(a_lpFile); a_oResult.m_seMembers.m_seWordMembers.m_oeSpDispWord = CComDispatchDriver(CWordFile::s_m_seWordMembers.m_oeSpIWord); { auto DISPID a_dispidDocuments = 0; CWordFile::s_m_seWordMembers.m_oeHR = (a_oResult.m_seMembers.m_seWordMembers.m_oeSpDispWord) .GetIDOfName(L"Documents", &a_dispidDocuments); CWordFile::s_m_seWordMembers.m_oeHR = (a_oResult.m_seMembers.m_seWordMembers.m_oeSpDispWord) .GetProperty(a_dispidDocuments, &(CWordFile::s_m_seWordMembers.m_oevResult)); } a_oResult.m_seMembers.m_seWordMembers.m_oeSpDocuments = CComDispatchDriver( (CWordFile::s_m_seWordMembers.m_oevResult).pdispVal); if (SUCCEEDED(CWordFile::s_m_seWordMembers.m_oeHR) && (a_oResult.m_seMembers.m_seWordMembers.m_oeSpDocuments != NULL)) { auto VARIANT a_vFilename; a_vFilename.vt = VT_BSTR; a_vFilename.bstrVal = A2BSTR(a_lpFile); CWordFile::s_m_seWordMembers.m_oeHR = (a_oResult.m_seMembers.m_seWordMembers.m_oeSpDocuments) .Invoke1(L"Open", &a_vFilename, &(CWordFile::s_m_seWordMembers.m_oevResult)); SysFreeString(a_vFilename.bstrVal); a_oResult.m_seMembers.m_seWordMembers.m_oeSpDocument = NULL; { auto VARIANT a_vDocNummer; a_vDocNummer.vt = VT_I4; a_vDocNummer.lVal = 1; CWordFile::s_m_seWordMembers.m_oeHR = a_oResult.m_seMembers.m_seWordMembers.m_oeSpDocuments .Invoke1(L"Item", &a_vDocNummer, &(CWordFile::s_m_seWordMembers.m_oevResult)); a_oResult.m_seMembers.m_seWordMembers.m_oeSpDocuments = (CWordFile::s_m_seWordMembers.m_oevResult).pdispVal; } a_oResult.m_seMembers.m_seWordMembers.m_oeSpDispDokument = CComDispatchDriver(a_oResult.m_seMembers.m_seWordMembers.m_oeSpDocuments); } return a_oResult; } else { throw "Ungültiger Dateiname."; } } Problem ist nur, dass das lokale CWordFile-Objekt der Open-Methode nach Aufruf dieser zerstört wird (und damit auch die Zeiger in den CComDispatchDrivern). Ich habe zwar versucht diese via Kopierkonstruktor zu speichern: CWordFile::CWordFile(const CWordFile& p_oRhs):m_seMembers(p_oRhs.m_seMembers.m_lpeSource) { ++CWordFile::s_m_seWordMembers.m_neMemberCounter; (*(this -> m_seMembers.m_seWordMembers.m_oeSpDispDokument.p)) = (*(p_oRhs.m_seMembers.m_seWordMembers.m_oeSpDispDokument.p)); (*(this -> m_seMembers.m_seWordMembers.m_oeSpDispWord.p)) = (*(p_oRhs.m_seMembers.m_seWordMembers.m_oeSpDispWord.p)); (*(this -> m_seMembers.m_seWordMembers.m_oeSpDocuments.p)) = (*(p_oRhs.m_seMembers.m_seWordMembers.m_oeSpDocuments.p)); /*(this -> m_seMembers.m_seWordMembers.m_oeSpDispDokument) = CComDispatchDriver(p_oRhs.m_seMembers.m_seWordMembers.m_oeSpDispDokument.p); (this -> m_seMembers.m_seWordMembers.m_oeSpDispWord) = CComDispatchDriver(p_oRhs.m_seMembers.m_seWordMembers.m_oeSpDispWord.p); (this -> m_seMembers.m_seWordMembers.m_oeSpDocuments) = CComDispatchDriver(p_oRhs.m_seMembers.m_seWordMembers.m_oeSpDocuments.p);*/ } Aber das geht nicht, weil egal was ich mache diese Objekte beim Destruktor auf NULL gesetzt werden und damit hat die Funktion zum Setzen von Textmarken wenig sinn: void COutputDlg::s_m_setBookmarks(const CWordFile& p_oWordFile) { UpdateData(TRUE); auto CWordFile a_oWordFile = p_oWordFile; if (this ->m_oeMember.p_bHasUser()) { a_oWordFile.p_setBookMarkText(DOC_STI_FNAME, m_oeValOpStiFName); //a_oWordFile.p_setBookMarkText(..., m_oeValOpStiIdent); a_oWordFile.p_setBookMarkText(DOC_STI_SG, m_oeValOpStiSG); a_oWordFile.p_setBookMarkText(DOC_STI_SNAME, m_oeValOpStiSName); a_oWordFile.p_setBookMarkText(DOC_STI_TEL, m_oeValOpStiTel); } } , weil dann ein Verweis (in dem neuen Objekt) auf NULL an folgender Stelle steht: void CWordFile:_setBookMarkText(const CString& p_lpBookMarkName, const CString& p_lpBookMarkText) { auto IDispatchPtr a_oSpBookmarks = NULL; auto VARIANT a_ovResult; auto HRESULT a_lHR; this -> m_seMembers.m_seWordMembers.[B]m_oeSpDispDokument[/B].GetPropertyByName(L"Bookmarks", &a_ovResult);[COLOR="Red"] // <-- Da[/COLOR] a_oSpBookmarks = a_ovResult.pdispVal; auto CComDispatchDriver a_oSpDispBookmarks(a_oSpBookmarks); IDispatchPtr a_oSpBookmark = NULL; { auto VARIANT a_ovBkmName; a_ovBkmName.vt = VT_BSTR; a_ovBkmName.bstrVal = A2BSTR((LPCSTR) p_lpBookMarkName); a_oSpDispBookmarks.Invoke1(L"Item", &a_ovBkmName, &a_ovResult); SysFreeString(a_ovBkmName.bstrVal); a_oSpBookmark = a_ovResult.pdispVal; } if (a_oSpBookmark == NULL) { throw CString(CString(_T("Textmarke ")) + p_lpBookMarkName + CString(_T(" wurde nicht gefunden"))); } else { auto CComDispatchDriver a_oSpDispBookmark(a_oSpBookmark); auto IDispatchPtr a_oSpBmRange = NULL; { auto DISPID a_lDispidRange = 0; a_lHR = a_oSpDispBookmark.GetIDOfName(L"Range", &a_lDispidRange); a_lHR = a_oSpDispBookmark.GetProperty(a_lDispidRange, &a_ovResult); a_oSpBmRange = a_ovResult.pdispVal; } auto CComDispatchDriver a_oSpDispRange(a_oSpBmRange); { VARIANT a_ovNewText; a_ovNewText.vt = VT_BSTR; a_ovNewText.bstrVal = A2BSTR((LPCSTR) p_lpBookMarkText); auto DISPID a_lDispidText = 0; a_lHR = a_oSpDispRange.GetIDOfName(L"Text", &a_lDispidText); a_lHR = a_oSpDispRange.PutProperty(a_lDispidText, &a_ovNewText); SysFreeString(a_ovNewText.bstrVal); } } }[/code] Kann bei diesem Problem evtl. einer helfen ?
  3. VS 6.0 Aber ich nehms zurück - hatte aus Versehen die Variable für den Typ (a_dwValueType ) genommen. :floet:
  4. Das hatte ich vorhin schon probiert - da bekomm ich allerdings immer einen Assert strcore.cpp Line 512 btw: Wieso eigentlich Umrechnung bei UNICODE ? Dachte da wird statt RegQueryValueExA einfach RegQueryValueExW benutzt.
  5. TDM

    RAR-archiv öffnen

    Zwar kein rar, aber ich glaube, das hab ich auch schon mal irgendwo gesehen (einfach bisschen googlen): Zip Library for Visual C++ 8.0 free download. The Chilkat Zip C++ class library can be used with Microsoft Visual C++ 8.0, and provides C++ classes for creating, managing, and unzipping Zip archiv...
  6. m'kay, jetzt geht das erstmal: CSettings::CSettings() { auto HRESULT a_hr; auto HKEY a_sHkey; auto HKEY a_sKey = HKEY_LOCAL_MACHINE; a_hr = RegOpenKeyEx(a_sKey, (LPCTSTR) this -> m_seMembers.a_lpRegKey, 0, KEY_ALL_ACCESS, &a_sHkey); _ASSERT(SUCCEEDED(a_hr)); if (SUCCEEDED(a_hr)) { { auto HRESULT a_hr; auto CString a_lpBuffer = _T(""); auto DWORD a_dwValueType = 0; auto DWORD a_dwValueLen = _MAX_PATH; RegQueryValueEx(p_sHkey, BZR_REG_WORD_SRC_PATH, NULL, &a_dwValueType, (LPBYTE) a_lpBuffer.GetBuffer(_MAX_PATH), &a_dwValueLen); a_lpBuffer.ReleaseBuffer(); if (_T("") == a_lpBuffer) { GetCurrentDirectory(_MAX_PATH, (LPSTR) a_lpBuffer.GetBuffer(_MAX_PATH)); a_lpBuffer.ReleaseBuffer(); a_lpBuffer += _T("\\AV100b.doc"); a_hr = RegSetValueEx(p_sHkey, BZR_REG_WORD_SRC_PATH, 0, REG_SZ, (LPBYTE) (LPCTSTR) a_lpBuffer, a_lpBuffer.GetLength()); _ASSERT(SUCCEEDED(a_hr)); a_hr = RegFlushKey(p_sHkey); _ASSERT(SUCCEEDED(a_hr)); } this -> m_seMembers.m_lpeWordSource = a_lpBuffer; } RegCloseKey(a_sHkey); } } Danke.
  7. Hallo, ich möchte für ein Programm Daten aus der Windowsregistry laden. Dazu habe ich einen Singleton mit folgendem Konstruktor implementiert: CSettings::CSettings() { auto HRESULT a_hr; auto HKEY a_sHkey; auto HKEY a_sKey = HKEY_LOCAL_MACHINE; a_hr = RegOpenKeyEx(a_sKey, (LPCTSTR) this -> m_seMembers.a_lpRegKey, 0, KEY_ALL_ACCESS, &a_sHkey); _ASSERT(SUCCEEDED(a_hr)); if (SUCCEEDED(a_hr)) { { auto CString a_lpBuffer = _T(""); auto DWORD a_dwValueType = 0; auto DWORD a_dwValueLen = 0; RegQueryValueEx(a_sHkey, BZR_REG_PDATA_PATH, NULL, &a_dwValueType, (LPBYTE) a_lpBuffer.GetBuffer(a_lpBuffer.GetLength()), &a_dwValueLen); if (_T("") == a_lpBuffer) { GetCurrentDirectory(_MAX_PATH, (LPSTR) a_lpBuffer.GetBuffer(a_lpBuffer.GetLength())); a_lpBuffer += _T("\\AV100b.doc"); a_hr = RegSetValueEx(a_sHkey, BZR_REG_PDATA_PATH, 0, REG_SZ, (LPBYTE) (LPCTSTR) a_lpBuffer, a_lpBuffer.GetLength()); _ASSERT(SUCCEEDED(a_hr)); a_hr = RegFlushKey(a_sHkey); _ASSERT(SUCCEEDED(a_hr)); } } RegCloseKey(a_sHkey); } } Daran gibt es jetzt allerdings 2 Probleme: 1. a_lpBuffer ist nach dem Aufruf von RegQueryValueEx immer leer (egal ob ein Wert vorhanden ist oder nicht). 2. Bei GetCurrentDirectory wird zwar der richtige Wert in a_lpBuffer geschrieben, aber nach dem folgenden Verkettungsoperator besitzt a_lpBuffer einen Wert von "\AV100b.doc". Sollte += nicht eigentlich eine Art append sein ?
  8. Ok, ich hab COleDateTime probiert. Das Problem mit dem 00:xxer Datum ist nicht mehr da. Allerdings klappt die Ausgabe einfach nicht... Bsp: COleDateTimeSpan a_oTResult = (time_t) 0; ... //Calc gibt ein ulong zurück. //Nach aufruf ist m_span = 3600 (1h) a_oTResult += calc(); TRACE("RB:\t%s\n", a_oTResult.Format("%H:%M:%S")); //Ausgabe: //00:00:00 Wurde auch schon mit GetHours() etc. probiert. (Ich hasse Ole-Klassen und sie hassen mich. )
  9. TDM

    Login in C

    WritePrivateProfileString GetPrivateProfileString :mod:
  10. Das ist das schöne an Unixpfaden, man verursacht keine ungewollten Escapesequenzen. btw: \t ist Tab und kein Leerzeichen.
  11. Hallo, ich brauche Hilfe beider Verwendung von Objekten von CDateTimeCtrl und CTime: [Vorwor] Ich habe eine Dialogmaske mit 4 CDateTimeCtrl Steuerelementen; (Start-Datum, Start-Zeit, Ende-Datum, Ende-Zeit) Dafür musste ich folglich 4 CTime-Variablen deklarieren. (Oder geht das auch einfacherer, dass ich die Steuerung beider Objekte z.B. über eine Variable machen könnte?) Da dieses Dialogfenster 3 Mal auftritt (3 verschiedene Zeitspanntypen) hab ich mich der Generalisierung bedient: CZeit als abstrakte Basisklasse und die Unterklassen CBereitschaftszeit, CEinsatzzeit und CKorrektur. Damit ich die obengenannten 4 Zeitobjekte schön von jeweiligen Klasse abkapseln konnte, wurde dafür noch eine Struktur erstellt: typedef struct STime { ETime_t p_eeTimeType; CTime p_oeStartDate; CTime p_oeStartTime; CTime p_oeEndDate; CTime p_oeEndTime; } STime_t; Ein Objekt dieser Struktur findet sich in der Basisklasse. Der Konstruktor von CZeit ist wie folgt deklariert: CZeit::CZeit() { this -> p_bSetEndDate(CTime(p_oGetEndDate().GetYear(), p_oGetEndDate().GetMonth(), p_oGetEndDate().GetDay(), 0, 0, 0)); this -> p_bSetEndTime(CTime(1970, 1, 1, p_oGetEndTime().GetHour()+1, p_oGetEndTime().GetMinute(), 0)); this -> p_bSetStartDate(CTime(p_oGetStartDate().GetYear(), p_oGetStartDate().GetMonth(), p_oGetStartDate().GetDay(), 0, 0, 0)); this -> p_bSetStartTime(CTime(1970, 1, 1, p_oGetStartTime().GetHour()+1, p_oGetStartTime().GetMinute(), 0)); } Das setzen neuer CTime-Objekte ist wichtig, denn beim Erzeugen würden Restbestände z.B. von Sekunden vorhanden sein und den späteren Programmablauf verfälschen. [CZeit & GUI] Damit meine Dialoge auf die Sachen speichern, sind natürlich Gettings und Settings vorhanden. (bei den CZeit-Objekten, wie auch bei dem Dialog) Nach dem erzeugen eines Dialogs, wird die jeweilige CZeit-Instanz gesetzt: void CEinsatzzeitDlg:_setEinsatzzeit(const CEinsatzzeit& p_oEinsatzzeit) { if (&p_oEinsatzzeit != NULL) { this -> m_oeMember = p_oEinsatzzeit; m_updateFields(); } }[/code] Und danach die Oberfläche geupdated: [code]void CEinsatzzeitDlg::m_updateFields(void) { m_oeValEzStartTime =this -> m_oeMember.p_oGetStartTime(); m_oeValEzStartDate = this -> m_oeMember.p_oGetStartDate(); m_oeValEzEndTime = this -> m_oeMember.p_oGetEndTime(); m_oeValEzEndDate = this -> m_oeMember.p_oGetEndDate(); m_beValEzTrace = this -> m_oeMember.p_bGetTrace(); p_setRz(m_oeMember.p_bGetRZ()); UpdateData(false); } Nach einem Klick auf OK, wird die CZeit dann gespeichert: void CEinsatzzeitDlg::OnOK() { UpdateData(true); this -> m_oeMember.p_bSetStartTime(m_oeValEzStartTime); this -> m_oeMember.p_bSetStartDate(m_oeValEzStartDate); this -> m_oeMember.p_bSetEndTime(m_oeValEzEndTime); this -> m_oeMember.p_bSetEndDate(m_oeValEzEndDate); if (m_poParentFrame != NULL) { m_poParentFrame -> p_bSetEinsatzzeit(this -> m_oeMember); m_poParentFrame -> UpdateData(true); } CDialog::OnOK(); } Soweit zur Erklärung des Sachverhalts... [Problem] Wenn ich in der Dialogmaske eine Zeit (kein Datum) auf 00:xx setzen will, bekomme ich einen Assert: Timecore.cpp Line: 40 Das Hauptproblem scheint aber eher in mktime.c in _make_time_t(struct tm*, int) zu liegen - genauer bei: tmptm1 += _timezone. Ist es normal das _timezone -3600 ist ? Wäre dankbar für Hilfe.
  12. ok, es lag an dem const. STime_t m_seMembers; Ist meiner Meinung eine Instanziierung einer Struktur -> Strukturobjekt. auto, static, extern und register schreib ich immer mit damit ich seh wozu eine variable gehört.
  13. Hallo, ich habe das Problem, dass ich ein Element einer Memberstruktur verändern möchte diese aber außerhalb der Klasse definiert habe: typedef struct STime { ETime_t p_eeTimeType; CTime p_oeStartDate; CTime p_oeStartTime; CTime p_oeEndDate; CTime p_oeEndTime; } STime_t; Klassendeklaration: class CZeit { public: BOOL p_bSetStartTime(const CTime& p_oNewStartTime) const; BOOL p_bSetStartDate(const CTime& p_oNewStartDate) const; BOOL p_bSetEndTime(const CTime& p_oNewEndTime) const; BOOL p_bSetEndDate(const CTime& p_oNewEndDate) const; CZeit(); virtual ~CZeit(); protected: private: STime_t m_seMembers; }; So, jetzt würd ich gern Funktionen schreiben wie ich die Elemente der Struktur verändern kann: BOOL CZeit:_bSetStartTime(const CTime& p_oNewStartTime) const { auto BOOL a_bResult = (this -> m_seMembers.p_oeStartTime != p_oNewStartTime); if (a_bResult) { this -> m_seMembers.p_oeStartTime = p_oNewStartTime; } return a_bResult; }[/code] Problem an dem ganzen ist nur, dass mir mein Compiler (VS 6.0) immer 4 Fehler bringt (da 4 mal die gleichen Funktionen): Woran liegt das jetzt? Ich hab in anderen Klassen schon strukturen als Member verwendet und da gehts jedenfalls.
  14. TDM

    Schreibschutz auf JTable

    JTable als Member der Auflistungsdialogklasse und dann via Parameterübergabe eine Collection (oder einzelne Objekte) an den anderen Dialog. EDIT: btw: Ich glaube eher, dass die Daten im dataVector des jeweiligen Tablemodels gespeichert werden.
  15. XML da plattformunabhängig (gut, ini an sich auch) XML kann aber in verschiedenen anderen Sprachen als Schnittstelle dienen. Man denke nur mal an SQLX, Java usw. außerdem kannst du notfalls auch aus einer XML-Datei ini-Datei-Objekte erzeugen und diese dann als virtuelle Files behandeln. EDIT: Außerdem ist XML multichildnodefähig - glaub das geht einer ini nicht so einfach
  16. ok gefunden, [Format] Spalten :mod:
  17. Hallo, ich hab ein Problem mit Word und zwar hab ich ein Dokument, welches im A4 Querformat vorliegt. Es sind jeweils 2 A5-Seiten auf einem Blatt (nebeneinander versteht sich). Jetzt ist dass Problem, dass ich dieses Dokument in ein anderes einfügen soll. Die Seite hab ich in Doc[2] schon auf Querformat gestellt, aber wenn ich einfach Copy&Paste nehm, geht das trotzdem nicht (die Seite rechts aus Doc[1] wär dann in Doc[2] auf der nächsten Seite). Jetzt meine Frage: wie stell ich dass ein, dass ich auf einer A4 Seite im Querformat 2 Seiten hab ? Btw: Word 97
  18. Die Zahl die du dir ausdenkst, wird nicht eingegeben? Das Programm soll im Sinne von "Wer-ist-es?"-Fragen versuchen deine Zahl rauszufinden ? Hab ich das so richtig verstanden ?
  19. C#-Schlüsselwörter (C#)
  20. Die Sprache heißt VB (oder Sub-Sprachen davon) using kommt with am nächsten, funktioniert aber nur auf Namespaceebene. Nimm kürzere Variablennamen oder arbeite mit Copy&Paste wenn du nicht so viel Schreibaufwand haben willst.
  21. Spontan würd ich auf Modulo verweisen.
  22. *an Kopf klatsch* Ich sollte mehr die TODOs von Microsoft lesen... -> verschoben nach OnInitDialog Strings hinzufügen klappt jetzt, wie kann ich ganze Objekte dort reinbringen ? Es müsste dann via Memberfunktion auch die Darstellungsform (der anzuzeigende Text) repräsentierbar sein.
  23. Hallo, ich habe folgendes Problem: Ich hab ein Dialogfenster (MFC) mit einer CComboBox usw. Jetzt möchte ich, dass beim Start des Dialoges automatisch Objekte aus einer Datei geladen und in der Combobox angezeigt werden. Ich dachte mir, dass ich die gleich im Konstruktor der Dialogklasse fülle. Das ganze sieht in etwa so aus: CBZRDlg::CBZRDlg(CWnd* pParent /*=NULL*/) : CDialog(CBZRDlg::IDD, pParent) { //{{AFX_DATA_INIT(CBZRDlg) //}}AFX_DATA_INIT // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pAutoProxy = NULL; p_SetFileProperties(); auto CList<CUser, CUser&> a_oUsers; CUser::s_p_GetUsers(a_oUsers); auto CUser a_oUser = a_oUsers.GetTail(); auto POSITION a_sePosition = a_oUsers.GetTailPosition(); for (int a_nIndex=0;a_nIndex < a_oUsers.GetCount();a_nIndex++) { TRACE("FOR: %s\r\n", a_oUser.p_lpGetFName().c_str()); const char* test = a_oUser.p_lpToString(false).c_str(); m_oeCtrlMainStiUser.AddString(a_oUser.p_lpToString(false).c_str()); a_oUser = a_oUsers.GetPrev(a_sePosition); } } An sich eigentlich nichts besonderes, die Variable m_oeCtrlMainStiUser ist ein Control für die Combobox und soll die Objekte (zu Testzwecken erstmal nur Strings) aus einer CList in die Box eintragen. Leider funktioniert das nicht so wie ich mir das gedacht habe. Beim Programmstart (Konstruktoraufruf) klappt alles reibungslos bis zur Zeile: m_oeCtrlMainStiUser.AddString(a_oUser.p_lpToString(false).c_str()); Ich bekomme da immer folgende Fehlermeldung: mein Frage jetzt: Wie krieg ich da ein Objekt rein ? btw: VSC++ 6.0
  24. TDM

    [c#] switch nach Objekt

    ok, java-code ist wohl doch nicht das gleiche wie C# Dann halt so. Wieder was gelernt
  25. Denkfehler... sum = sum + (start+i); Wenn i mit 0 initialisiert wird, dann heißt das am Anfang 0 = 0 + (start+0) somit würde sum = start sein. In der Aufgabe hieß es zwischen Sowas auch hier: while(i <= (end-start));

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...