2009-12-17 12 views
5

Chciałbym zachować prostą listę ostatnich plików w mojej aplikacji MFC, która pokazuje 4 ostatnio używane nazwy plików.Utrzymywanie ostatniej listy plików

Bawiłem się przykładem z książki "The MFC Answers Book" Eugene'a Kaina, która może programowo dodawać ciągi do listy ostatnich plików dla aplikacji opartej na standardowej architekturze Document/View: (patrz "Zarządzanie listą ostatnich plików (MRU) "):

http://www.nerdbooks.com/isbn/0201185377

Moja aplikacja jest dość lekkie narzędzie, które nie używa Dokument/Widok architekturę do zarządzania danymi, formatów plików i tak dalej. Nie jestem pewien, czy w tym przypadku stosowano by te same zasady, które zastosowano w powyższym przykładzie.

Czy ktoś ma przykłady tego, jak radzi sobie z utrzymywaniem ostatniej listy plików wyświetlanej w menu Plik i może być przechowywany gdzieś w pliku/rejestrze? Bardziej niż cokolwiek, to mój brak wiedzy i zrozumienia powstrzymuje mnie.

Aktualizacja: Niedawno znaleźć ten artykuł CodeProject być bardzo przydatne ...

http://www.codeproject.com/KB/dialog/rfldlg.aspx

Odpowiedz

4

Niedawno zrobiłem przy użyciu MFC, więc skoro wydaje się być za pomocą MFC jak dobrze może to pomoże:

w:

BOOL MyApp::InitInstance() 
{ 
    // Call this member function from within the InitInstance member function to 
    // enable and load the list of most recently used (MRU) files and last preview 
    // state. 
    SetRegistryKey("MyApp"); //I think this caused problem with Vista and up if it wasn't there 
           //, not really sure now since I didn't wrote a comment at the time 
    LoadStdProfileSettings(); 
} 

// ..

//function called when you save or load a file 
void MyApp::addToRecentFileList(boost::filesystem::path const& path) 
{ 
    //use file_string to have your path in windows native format (\ instead of /) 
    //or it won't work in the MFC version in vs2010 (error in CRecentFileList::Add at 
    //hr = afxGlobalData.ShellCreateItemFromParsingName) 
    AddToRecentFileList(path.file_string().c_str()); 
} 

//function called when the user click on a recent file in the menu 
boost::filesystem::path MyApp::getRecentFile(int index) const 
{ 
    return std::string((*m_pRecentFileList)[index]); 
} 

// ...

//handler for the menu 
BOOL MyFrame::OnCommand(WPARAM wParam, LPARAM lParam) 
{ 
    BOOL answ = TRUE; 

    if(wParam >= ID_FILE_MRU_FILE1 && wParam <= ID_FILE_MRU_FILE16) 
    { 
     int nIndex = wParam - ID_FILE_MRU_FILE1; 

     boost::filesystem::path path = getApp()->getRecentFile(nIndex); 
     //do something with the recent file, probably load it 

     return answ; 
    } 
} 

Potrzebujesz tylko tego, że twoja aplikacja pochodzi z CWinApp (i używam klasy pochodnej CFrmWnd do obsługi menu, może robisz to samo?).

Powiedz, czy to dla ciebie działa. Nie jestem pewien, czy mam wszystko.

+0

Ostatnio odkryłem równolegle jedną lub dwie rzeczy, o których wspomniałeś, w szczególności LoadStdProfileSettings i AddToRecentFileList, które są niezbędne (+1). – AndyUK

4

można użyć algorytmu boost circular buffer do prowadzenia listy, podczas gdy program jest uruchomiony, a następnie zapisać go do rejestr (powinien być banalny) za każdym razem, gdy jest aktualizowany, i ładuj go, gdy program jest uruchamiany po raz pierwszy.

+0

Dlaczego algorytm cyklicznego bufora, prosty wektor lub tablica z 4 miejscami sprawią, że wszystko będzie dobrze. Zapisywanie do rejestru lub pliku lokalnego w celu przechowywania – RvdK

+1

Ponieważ bufor cykliczny doładowania automatycznie usuwa pierwszy element wstawiony, gdy zabraknie mu miejsca. Został zaprojektowany dokładnie dla takich rzeczy jak ostatnia lista plików. Za pomocą wektora z 4 miejscami musisz zidentyfikować najstarszy element i go usunąć, jeśli jest pełny; z doładowaniem wszystko odbywa się automatycznie! –

Powiązane problemy