Alle Beiträge von Klotzkopp
-
CListCtrl
Bevor Du die neue Selektion auf den ersten Eintrag setzt, musst Du zuerst die alte Selektion entfernen: POSITION pos = m_Grid.GetFirstSelectedItemPosition(); if( pos ) { m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), LVIS_SELECTED, 0 ); }[/CODE] UpdateData bewirkt nur bei Wert/Value-Variablen den Datenaustasch zwischen Variable und Steuerelement. Bei Steuerelement/Control-Variablen wie CListCtrl macht UpdateData gar nichts. Den gelöschten Datensatz musst Du von Hand mit CListCtrl::DeleteItem aus dem List Control enfernen.
-
Mentor Router
Da Du von Lichtern redest, nehme ich mal an, Du hast einen Hardware-Router. Dann wäre es gut, wenn Du auch sagst, von welchem Hersteller der Router ist und um welches Modell es sich handelt.
-
Tree-Ansicht erstellen
Genau so. Du fängst mit GetRootItem an und hangelst Dich mit GetNextSiblingItem und GetChildItem durch den Baum.
-
Daten von Betriebssystem auslesen
An den Benutzernamen kommst Du mit GetUserName, unter Windows 2000 und Windows XP auch mit GetUserNameEx, das unterschiedliche Formatierungen bietet. Für GetUserName brauchst Du Advapi32.lib, für GetUserNameEx Secur32.lib. Was das Auslesen des Passworts angeht, verweise ich auf die Boardregeln.
-
Trennen von Pfad und Dateiname?
Der Dateiname muss keinen Punkt enthalten. Es macht auch keinen Sinn, nach einem Punkt zu suchen, außer Du willst die Dateierweiterung abtrennen. Außerdem können die Elemente des Pfades auch durch Slashs voneinander getrennt sein. Also: Einfach nach dem letzten Slash oder Backslash suchen, und dahinter trennen.
-
Bildresource zur laufzeit ändern
Welche Fehlernummer ist das?
-
CListCtrl
Hat das List Control den Fokus oder den Style LVS_SHOWSELALWAYS? Wenn beides nicht der Fall ist, kannst Du die Selektion gar nicht sehen.
-
Bildresource zur laufzeit ändern
Mit LoadBitmap habe ich es irgendwie auch nicht hinbekommen. Aber mit LoadImage geht es: hBitmap = (HBITMAP) ::LoadImage( 0, "c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
-
Slider soll Static Text ändern
Ein Slider-Steuerelement senden Scroll-Nachrichten an sein Parent. Wenn es ein horizontaler Slider ist, sendet er WM_HSCROLL, ein vertikaler sendet WM_VSCROLL. Du musst also dem Parent-Fenster des Sliders - üblicherweise ein Dialog oder ein FormView - eine Nachrichtenbehandlungsfunktion für WM_HSCROLL bzw. WM_VSCROLL hinzufügen. Der dritte Parameter dieser Funktion erhält einen Zeiger auf das Steuerelement, leider in Form eines CScrollBar*, auch wenn die Nachricht von einem Slider kommt. Daher muss man den Zeiger casten, um zu prüfen, ob die Nachricht vom Slider stammt: [color=blue]void[/color] [color=blue]CDeinDlg[/color]::[color=darkred]OnHScroll[/color]([color=blue]UINT[/color] [color=darkblue]nSBCode[/color], [color=blue]UINT[/color] [color=darkblue]nPos[/color], [color=blue]CScrollBar[/color]* [color=darkblue]pScrollBar[/color]) { [color=blue]CSliderCtrl[/color]* [color=darkblue]pSlider[/color] = [color=blue]static_cast[/color]<[color=blue]CSliderCtrl[/color]*>( [color=darkred]GetDlgItem[/color]( [color=purple]IDC_DEIN_SLIDER[/color] ) ); [color=blue]if[/color]( [color=darkblue]pScrollBar[/color] == [color=blue]reinterpret_cast[/color]<[color=blue]CScrollBar[/color]*>( [color=darkblue]pSlider[/color] ) ) { [color=blue]int[/color] [color=darkblue]nRealPos[/color] = [color=darkblue]pSlider[/color]->[color=darkred]GetPos[/color](); [color=blue]CString[/color] [color=darkblue]strPos[/color]; [color=darkblue]strPos[/color].[color=darkred]Format[/color]( "%d", [color=darkblue]nRealPos[/color] ); [color=darkred]SetDlgItemText[/color]( [color=purple]IDC_COLOR_STATIC[/color], [color=darkblue]strPos[/color] ); } [color=blue]CDialog[/color]::[color=darkred]OnHScroll[/color]([color=darkblue]nSBCode[/color], [color=darkblue]nPos[/color], [color=darkblue]pScrollBar[/color]); }[/CODE]Wenn Du bereits eine Steuerelementvariable für den Slider hast, kannst Du Dir natürlich den Kram mit GetDlgItem sparen.
-
Builds mit MS Visual Studio
Du kannst fehlende externe Tools nicht durch Konfiguration des Visual Studio ersetzen. Wenn das Projekt grep verwendet, dann brauchst Du grep. Grep für Windows gibt es z.B. hier: http://www.interlog.com/~tcharron/grep.html bison gibt es bei cygwin, z.B. hier: http://ftp.uni-kl.de/pub/windows/cygwin/release/bison/
-
Tree-Ansicht erstellen
CTreeCtrl bietet keine Suchfunktion. Du musst also von Hand den gesamten Baum durchsuchen. Das kannst Du rekursiv oder iterativ machen.
-
Win32 API DllImport -> Net
Nachtrag: PlaySound kommt aus winmm.dll, die Defines für fdwSound stehen in mmsystem.h. Bei den anderen Fragen kann ich Dir leider nicht helfen.
-
Win32 API DllImport -> Net
In Absprache mit dem Ersteller des Themas verschoben nach: Delphi/VB/VBS/AS 400/C#/.net/Sonstige
-
E-Mails vom Server abholen
Quelle: http://www.sojia.org/~pigfoot/mirror/Indy9_00_03_Html/008280.html TIdPOP3 is not intended to provide extensive manipulation operations of mail on the server; normally, mail is downloaded and then deleted. Use TIdIMAP4 and TIdIMAP4Server when a more advanced (and complex) mail protocol is required.
-
CListCtrl
Wie sollte das auch funktionieren? Du versuchst, das erste Item in einem List Control zu selektieren, das keine Items enthält. Du musst diese Zeile ausführen, nachdem Du das List Control mit Daten gefüllt hast.
-
Simple Sache läuft unter XP & 2000, aber nicht unter 98, ME, NT
Kannst Du das Programm auf einer der abstürzenden Plattformen debuggen? Was passiert, wenn Du es unter XP im Kompatibilitätsmodus ausführst?
-
CListCtrl
Damit löschst Du explizit den Focus-State, falls das Item ihn hat. Macht nicht viel Sinn, also besser so: m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED); Das verursacht den beschriebenen Effekt: man kann kein anderes Item auswählen. Hier darfst Du das auf keinen Fall machen. Das kommt schon eher hin. Sind da die Items denn schon eingetragen?
-
CListCtrl
NM_CLICK wird nur mit der Maus ausgelöst. Außerdem ist es dabei möglich, über LVM_SUBITEMHITTEST herauszufinden, ob auf ein Subitem geklickt wurde. LVN_ITEMCHANGED wird immer ausgelöst, wenn ein Item selektiert oder deselektiert wird, egal ob das durch die Maus oder die Tastatur ausgelöst wurde. Wenn Dein List Control auch mit der Tastatur bedienbar sein soll, musst Du LVN_ITEMCHANGED verwenden.
-
Bildresource zur laufzeit ändern
Selbst laden musst Du sie, und zwar mit LoadBitmap. Anzeigen kannst Du sie mit CStatic::SetBitmap (oder STM_SETIMAGE, falls Du die MFC nicht verwendest).
-
CListCtrl
Wo ist denn das Problem? :confused: CString strText0 = m_Grid.GetItemText( item, 0 ); CString strText1 = m_Grid.GetItemText( item, 1 ); CString strText2 = m_Grid.GetItemText( item, 2 ); CString strText3 = m_Grid.GetItemText( item, 3 ); CString strText4 = m_Grid.GetItemText( item, 4 ); CString strText5 = m_Grid.GetItemText( item, 5 ); ... Oder so: CString strGanzeZeile; for( int i=0; i<nColumnCount; ++i ) { strGanzeZeile += m_Grid.GetItemText( item, i ); }[/CODE] Oder lies die Texte in ein Array von CStrings...
-
CListCtrl
Es gibt zwei Versionen dieser Methode. Die erste Version schreibt den Text in einen Puffer: // hole Text von Item 3, SubItem 5 char szBuffer[200]; m_listctrl.GetItemText( 3, 5, szBuffer, 199 ); Die zweite Version macht es noch einfacher, sie liest den Text in ein CString-Objekt und gibt dieses zurück: // hole Text von Item 3, Subitem 5 CString strText = m_listctrl.GetItemText( 3, 5 ); Das ist keine Methode, sondern ein int. In diesem int steht der Index des selektierten Items.
-
CListCtrl
CListCtrl::GetItemText
-
CListCtrl
Du erstellst eine Nachrichtenbehandlungsfunktion für LVN_ITEMCHANGED. Die sollte dann in etwa so aussehen: [color=blue]void CDeinDialog[/color]::OnItemchangedList([color=blue]NMHDR[/color]* pNMHDR, [color=blue]LRESULT[/color]* pResult) { [color=purple]NM_LISTVIEW[/color]* pNMListView = ([color=purple]NM_LISTVIEW[/color]*)pNMHDR; if( pNMListView->uNewState & [color=purple]LVIS_SELECTED[/color] ) { [color=green]// In pNMListView->iItem steht der Index des gewählten Items[/color] } *pResult = 0; }[/CODE]
-
Virtueller Destruktor
Virtuelle Funktionen verwendet man, wenn man auf ein Objekt einer abgeleiteten Klasse über einen Zeiger auf eine Basisklasse zugreift. Wenn aber der Destruktor nicht virtuell ist, wird nur der Basisklassendestruktor aufgerufen, was meist nicht das ist, was man will. Ein Beispiel: [color=blue]class[/color] [color=blue]Base[/color] { [color=blue]public[/color]: [color=blue]Base[/color]() {} [color=blue]virtual[/color] ~[color=blue]Base[/color]() {} }; [color=blue]class[/color] [color=blue]Derived[/color] : [color=blue]public[/color] [color=blue]Base[/color] { [color=blue]public[/color]: [color=blue]Derived[/color]() : [color=blue]Base[/color](), [color=darkred]p[/color]([color=darkblue]0[/color]) { [color=darkblue]p[/color] = [color=purple]new[/color] [color=blue]char[/color][[color=darkblue]4[/color]]; } ~[color=blue]Derived[/color]() { [color=blue]if[/color]( [color=darkblue]p[/color] ) [color=blue]delete[/color] [color=darkblue]p[/color]; } [color=blue]private[/color]: [color=blue]char[/color]* [color=darkblue]p[/color]; }; [color=blue]int[/color] [color=darkred]main[/color]() { [color=blue]Base[/color]* [color=darkblue]pBase[/color] = [color=purple]new[/color] [color=blue]Derived[/color]; [color=green]// wenn Base::~Base nicht virtuell ist, wird hier nicht[/color] [color=green]// Derived::~Derived aufgerufen, sondern nur Base::~Base,[/color] [color=green]// und p wird nicht freigegeben![/color] [color=blue]delete[/color] [color=darkblue]pBase[/color]; } [/CODE]
-
CListCtrl und SDI
EOF ist -1, !EOF ist also immer falsch. Vielleicht meinst Du sowas wie pRs->EOF? Außerdem solltest Du in der Schleife auf den nächsten Datensatz wechseln, sonst hast Du eine Endlosschleife.