logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VS, C++, MFC: List Control i eksport danych do bazy ODBC

puntigamer 27 Sie 2009 15:58 2081 6
REKLAMA
  • #1 6950148
    puntigamer
    Poziom 13  
    Posty: 123
    Ocena: 4
    Witam
    W swojej aplikacji mam kontrolkę List Control (tabelka jak w exelu). Trochę ją przerobiłem abym mógł edytować wiersze itp.
    Wiersze do tabeli dodaję z pól "editbox", które otrzymują wartości od sliderów.
    Wszystko pięknie, mam wreszcie oczekiwaną tabelę z wartościami i teraz chciałbym tę tabelę w jakiś sposób gdzieś zapisać. Widzę dwa rozwiązania: albo bo pliku, albo do bazy danych.
    Do tego będę miał kilka takich tabel z już ustalonymi danymi, czyli takich tabel, które z jakiegoś źródła wczytam do tabelki w aplikacji.

    Podsumowując. Kilka różnych stałych tabel z danymi oraz przykładowo jedna edytowalna (z możliwością zapisu jej).

    Czy robić to na DB czy na plikach?
    Może macie jakieś doświadczenie w posługiwaniu się tą kontrolką i zapisywaniu z niej całej tabeli.
    Byłbym wdzięczny za jakiekolwiek pomoce/linki.
    pozdrawiam!
  • REKLAMA
  • Pomocny post
    #2 6952526
    MiL999
    Poziom 26  
    Posty: 1173
    Pomógł: 59
    Ocena: 74
    Jedynym wyjściem są 2 pętle i ręczne odczytywanie każdej komórki po kolei ( list.GetItemText(i, j) ). Jeżeli chcesz to tylko zapisac to wybrałbym zapis do pliku bo po co zaprzęgać do tego bazę danych.
  • REKLAMA
  • #3 6952812
    puntigamer
    Poziom 13  
    Posty: 123
    Ocena: 4
    no i ekstra, rzeczowa dyskusja :)
    też mi sie wydawało, że nei ma sensu (nie potrzeba tu takiej logiki jak w DB)
    Dz
  • REKLAMA
  • #4 6970111
    puntigamer
    Poziom 13  
    Posty: 123
    Ocena: 4
    mam pytanie. jak w list control wykonac zaznaczenie wiersza w sposób jak pokazany jest na zdjęciu (lub na granatowo). przeszukiwałem metody ale nie doszukałem się odpowiedniej. może ktoś będzie wiedział. chodzi mi o to , że zaznaczę myszką odpowiedni wiersz, a po tabeli chcę przesuwać się za pomocą "następny/poprzedni wiersz" i wyświetlac z niego informacje. wiersz na ktorym konkretnie jestem podswietlic na szaro albo granatowo (ogolnie wyroznic).
    Wie ktoś może także jak nazywa się reakcja, która wykonałaby się od razu po zaznaczeniu któregoś wiersza kliknieciem myszka? (taka reakcja jak na naciśnięcie przycisku)?
    pozdrawiam!
    obrazek.jpg
  • REKLAMA
  • #5 6970683
    MiL999
    Poziom 26  
    Posty: 1173
    Pomógł: 59
    Ocena: 74
    Programowo zaznaczyć wiersz można tak:
    
    int row; //wiersz do zaznaczenia
    LV_ITEM lv_item;
    lv_item.state = LVIS_FOCUSED | LVIS_SELECTED;
    lv_item.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
    lv_item.mask = LVIF_STATE;
    m_List.SetItemState(row, &lv_item);
    m_List.EnsureVisible(row, FALSE);
    


    Najlepiej wsadź to w jakąś funkcję i wywołuj w razie potrzeby.
    Po kliknięciu myszą na listę wywołuje się LVN_ITEMCHANGED. Trzeba to oprogramować.
  • #6 6971224
    puntigamer
    Poziom 13  
    Posty: 123
    Ocena: 4
    Dziękuje MilL999

    Zrobiłem tak jak pokazałeś. Po naciśnięciu myszką wiersza i naciśnięciu przycisku "następny" tabelka ma zaznaczone wiersze oba, ten myszką i ten następny. W kodzie naciśnięcia buttona ustawiłem fokus na kontrolkę listview.

    A chciałbym mieć zawsze mieć zaznaczony tylko jeden wiersz. Selected chyba pozwala na zaznaczenie większej liczby wierszy.
    Poza tym jak odczytać który wiersz mam zaznaczony przez ten kod?

    Gdy zaznaczę myszką, to odczytuje nr wiersza funkcją
    int row = m_grid.GetItemIndex();
    a w wypadku tego kodu wyzej to nie działa.

    Już myślałem, że odejdę od tego rozwiązania i pozostanę przy poruszaniu się za pomocą strzałek (góra/dół), ale problem jest ten sam, czyli po zaznaczeniu myszką pierwszego wiersza i naciśnięciu np dwa razy na strzałkę w dół (klawiatura) fokus i zaznaczenie mam na pozycji 3, ale gdy użyję funkcji GetItemIndex i tak usuwa mi wiersz zaznaczony myszką. :(

    Dodano po 4 [godziny] 13 [minuty]:

    Dla potomnych ;)

    
    dodać to w kodzie oprogramowującym nacisnięcie buttona....
    
    	int row = m_grid.GetSelectionMark();  //pobiera nr zaznaczonego wiersza
    	row++;
    
    	POSITION pos = m_grid.GetFirstSelectedItemPosition(); 
    	while(pos)
    	m_grid.SetItemState(m_grid.GetNextSelectedItem(pos), 0, LVIS_SELECTED | LVIS_FOCUSED);
    	m_grid.SetItemState(row, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
    
    	m_grid.SetSelectionMark(row);
    	m_grid.SetFocus();  //ustawia fokus znowu na kontrolkę
  • #7 6974506
    MiL999
    Poziom 26  
    Posty: 1173
    Pomógł: 59
    Ocena: 74
    Sprawdź parametr Single Selection dla listy. Może on robi to samo.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji zapisu danych z kontrolki List Control w aplikacji MFC napisanej w C++ w środowisku Visual Studio. Autor ma tabelę z możliwością edycji wierszy, do której dane są wprowadzane z pól edycyjnych powiązanych ze sliderami. Pojawia się pytanie, czy lepiej zapisywać dane do pliku czy do bazy danych ODBC. Wskazano, że prostsze jest zapisanie danych do pliku, gdyż wymaga to jedynie iteracji po komórkach (list.GetItemText(i, j)) za pomocą dwóch pętli, bez konieczności stosowania bazy danych. Dodatkowo omówiono sposób programowego zaznaczania pojedynczego wiersza w kontrolce List Control za pomocą struktury LV_ITEM i funkcji SetItemState, z uwzględnieniem obsługi zdarzenia LVN_ITEMCHANGED do wykrywania kliknięć myszy. Poruszono też problem zaznaczania wielu wierszy i sugestię użycia trybu Single Selection, aby ograniczyć zaznaczenie do jednego wiersza. Dyskusja zawiera praktyczne wskazówki dotyczące manipulacji stanem zaznaczenia i odczytu indeksu zaznaczonego wiersza w kontrolce List Control.
Wygenerowane przez model językowy.
REKLAMA