tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
889
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tom_Green Tom_Green ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    20
    Hallo

    Ich habe ein Problem. Ich möchte in einem Gui eine zweispaltige Tabelle generieren, die bei jedem Aufruf, eine vorher eingelesene Anzahl Zeilen hat. In der ersten Spalte möchte ich etwas fixes eintragen und in die zweite Spalte sollten sich Werte eintragen lassen.

    Ich arbeite mit Microsoft Visual Studio.
    Hat mir jemand einen Lösung für mein Problem. Was für ein Steuerelement muss ich dafür benutzen?

    mfg
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Dafür gibt es direkt keine Control. Da musst du manuell kombinieren.

    Für die Ansicht an sich genügt eine ListControl (nicht ListBox). Du musst dann auf ein Doppelklickereignis (oder ein beliebiges anderes) reagieren und eine Edit-Control als Child an der Stelle anzeigen. Dann per Subclassen auf ein paar Ereignisse wie Escape/Enter oder Applikationswechsel prüfen, damit die Edit auch schön brav wieder weggeht.
     

  3. #3
    Tom_Green Tom_Green ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    20
    hättest du für das ein beispiel code? kann mir nämlich noch nicht ganz vorstellen wie das mit child usw. funktioniert.

    habe ich das richtig verstanden. ich nehme eine List control und wenn die list dann betätigt wird generiere ich diese edit fields?

    mfg
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Hier ein Stück Code, wo ich das so mache:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    
    void CDlgZuordnung::OnNMDblclkListZuordnung( NMHDR *pNMHDR, LRESULT *pResult )
    {
     
      if ( m_EditPopup.GetSafeHwnd() )
      {
        // wenn wir schon drin sind, nicht nochmal
        return;
      }
      POINT   ptMouse;
     
      GetCursorPos( &ptMouse );
      m_ListZuordnung.ScreenToClient( &ptMouse );
     
      LVHITTESTINFO     lvHTInfo;
     
      lvHTInfo.pt   = ptMouse;
     
      int   iItem, iSubItem;
      HitTest( ptMouse, iItem, iSubItem );
     
      RECT    rcItem;
     
      m_iEditItem = iItem;
      m_iEditSubItem = iSubItem;
     
      GetSubItemRect( iItem, iSubItem, rcItem );
     
      m_ListZuordnung.ClientToScreen( &rcItem );
      ScreenToClient( &rcItem );
     
      if ( iSubItem == 0 )
      {
        m_EditPopup.Create( WS_BORDER | WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_NUMBER, rcItem, this, 17 );
        m_EditPopup.SetFont( GetFont() );
     
        m_EditPopup.SetWindowText( m_ListZuordnung.GetItemText( iItem, iSubItem ) );
        m_EditPopup.SetSel( 0, -1 );
        m_EditPopup.SetFocus();
        m_EditPopup.SetLimitText( 8 );
      }
      else if ( iSubItem == 1 )
      {
        // IP
        m_EditPopup.Create( WS_BORDER | WS_CHILD | WS_VISIBLE | ES_WANTRETURN, rcItem, this, 17 );
        m_EditPopup.SetFont( GetFont() );
     
        m_EditPopup.SetWindowText( m_ListZuordnung.GetItemText( iItem, iSubItem ) );
        m_EditPopup.SetSel( 0, -1 );
        m_EditPopup.SetFocus();
      }
      else if ( iSubItem == 2 )
      {
        // MAC
        m_EditPopup.Create( WS_BORDER | WS_CHILD | WS_VISIBLE | ES_WANTRETURN, rcItem, this, 17 );
        m_EditPopup.SetFont( GetFont() );
     
        m_EditPopup.SetLimitText( 12 );
        m_EditPopup.SetWindowText( m_ListZuordnung.GetItemText( iItem, iSubItem ) );
        m_EditPopup.SetSel( 0, -1 );
        m_EditPopup.SetFocus();
      }
     
      *pResult = 0;
     
    }
     
     
     
    BOOL CDlgZuordnung::OnCommand( WPARAM wParam, LPARAM lParam )
    {
     
      if ( (HWND)lParam == m_EditPopup.GetSafeHwnd() )
      {
        if ( HIWORD( wParam ) == EN_KILLFOCUS )
        {
          m_EditPopup.DestroyWindow();
          return TRUE;
        }
      }
     
      return CPropertyPage::OnCommand(wParam, lParam);
    }
     
     
     
    BOOL CDlgZuordnung::PreTranslateMessage( MSG* pMsg )
    {
     
      if ( ( pMsg->hwnd == m_EditPopup.GetSafeHwnd() )
      &&   ( pMsg->message == WM_KEYDOWN ) )
      {
        if ( pMsg->wParam == VK_RETURN )
        {
          EditEnd();
          return TRUE;
        }
        else if ( pMsg->wParam == VK_ESCAPE )
        {
          EditEnd();
          return TRUE;
        }
      }
      return CPropertyPage::PreTranslateMessage(pMsg);
     
    }
     
     
     
    void CDlgZuordnung::EditEnd()
    {
     
      CString     cstrGnu;
     
      m_EditPopup.GetWindowText( cstrGnu );
     
      m_ListZuordnung.SetItemText( m_iEditItem, m_iEditSubItem, cstrGnu );
      m_EditPopup.DestroyWindow();
     
      SetModified();
     
    }
     

  5. #5
    Tom_Green Tom_Green ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    20
    OK einige Fragen zu deinem Code.

    1. was ist m_EditPopup für ein Datentype?
    2. erzeugst du mit diesem code fortlaufend die edit fields in der Liste?
    3. Von wo sind die Methoden HitTest und GetSubItemRect muss ich irgendwie noch ein spezielles include machen oder von was erbt dein ZuordnungsDlg?

    mfg
     

  6. #6
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    1) m_EditPopup ist ein CEdit
    2) Jein, es gibt nur eine Edit, die wird durch einen Doppelklick erzeugt; und bei einem Fokus-Wechsel (EN_KILLFOCUS) oder Escape/Return wieder geschlossen
    3) HitTest und GetSubItemRect müssten in aktuellen MFC-Versionen Member von CListControl sein. Früher gab es die da drin nicht, da hatte ich mir die selbst gebaut.
     

  7. #7
    Tom_Green Tom_Green ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    20
    könntest du mir vielleicht den ganzen Header und das ganze .cpp fiel dieses Dlg schicken?
     

  8. #8
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Schwierig, da sind einige firmeneigene Dinge drin. Die eigentlichen Funktionsteile hast du in dem Ausschnitt oben aber schon drin. Der Header ist ja eh nur eine Kopie des .cpp-Files.
     

Ähnliche Themen

  1. In einem CTabFolder eine Tabelle und ein Combo darstellen
    Von DerDon456 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 28.01.10, 16:37
  2. versuche DB Ausgabe in Tabelle mit einem JS Div ein und auszublenden
    Von grillfleisch im Forum Javascript & Ajax
    Antworten: 10
    Letzter Beitrag: 24.01.10, 17:06
  3. Zeile in eine Tabelle in einem Worddokument einfügen
    Von mmike im Forum Office-Anwendungen
    Antworten: 0
    Letzter Beitrag: 06.08.08, 22:11
  4. Nach einem Wert in Tabelle suchen
    Von -GS-Master im Forum Relationale Datenbanksysteme
    Antworten: 7
    Letzter Beitrag: 12.04.07, 17:18
  5. Tabelle in einem Forumsbeitrag
    Von scmaps im Forum HTML & XHTML
    Antworten: 2
    Letzter Beitrag: 11.06.05, 10:51

Stichworte