Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

(WinAPI)Zwracanie ścieżek z GetOpenFileName() do dynamicznej tablicy.

Ostatnio zmodyfikowano 2013-12-16 10:15
Autor Wiadomość
xordi
Temat założony przez niniejszego użytkownika
(WinAPI)Zwracanie ścieżek z GetOpenFileName() do dynamicznej tablicy.
» 2013-12-09 05:34:05
Postanowiłem się zapytać kolegów o ocenę mojego myślenia, gdyż męczyłem się z tym problemem już jakiś czas, a zaznaczam że jestem początkujący, no więc chciałem napisać funkcję która po naciśnięciu jednego z przycisku wywoła funkcję GetOpenFileName() i wczyta ścieżkę pliku do dynamicznej "tablicy charów". Problem polegał na tym że nie wiadomo było ile plików doda kolejno user, i by można było je dodawać na bierząco, jedyną stałą jaka była dana to długość ścieżki z MAX_PATH.

Spójżcie, czy moje rozumowanie jest ok, i czy nie będzie żadnych wycieków pamięci:

na początku:
C/C++
int ileplikow = 0; //licznik plikow dodanych
OPENFILENAME ofn; //globalna struktura ofn
char ** sdNazwaPliku = new char *[]; //dynamiczna tablica wskaźników


A potem w obsłudze zdarzeń:
C/C++
case WM_COMMAND:
{
    wmId = LOWORD( wParam );
    wmEvent = HIWORD( wParam );
   
    if((( HWND ) lParam ) == hListBox ) { //to jest listbox z samymi nazwami plikow
        if( wmEvent == LBN_DBLCLK ) {
            int index = SendMessage( hListBox, LB_GETCURSEL, 0, 0 );
            SendMessage( hText, WM_SETTEXT, 0,( LPARAM ) sdNazwaPliku[ index ] ); // po podwojnym kliknieciu pobierany jest index kliknięcia i wysyłana jest do hText pozycja z dynamicznej tablicy
        }
    }
   
   
    //magia zaczyna się tutaj
    if(( HWND ) lParam == g_hPrzycisk ) {
        sdNazwaPliku[ ileplikow ] = new char[ MAX_PATH ]; //dodanie nowego rekordu do dynamicznej tablicy
       
        char sNazwaPliku[ MAX_PATH ] = ""; //zmienna do której funkcja zapisze sciezke
        ZeroMemory( & ofn, sizeof( ofn ) );
        ofn.lStructSize = sizeof( ofn );
        ofn.hwndOwner = hwnd;
        ofn.lpstrFilter = "Wszystkie pliki *.*\0*.*\0";
        ofn.nMaxFile = MAX_PATH;
        ofn.lpstrFile = sNazwaPliku;
        ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
       
        if( GetOpenFileName( & ofn ) ) {
            for( int i = 0; i < MAX_PATH; i++ ) {
                sdNazwaPliku[ ileplikow ][ i ] = sNazwaPliku[ i ]; //przepisanie scieżki do rekordu dynamicznej tablicy
            }
            SendMessage( hListBox, LB_ADDSTRING, 0,( LPARAM ) strrchr( sdNazwaPliku[ ileplikow ], '\\' ) + 1 ); //dodanie pozycji do list boxa
            ileplikow++; // inkrementacja indexu tablicy dynamicznej
        }
       
       
    }
   
    if(( HWND ) lParam == g_hDelete ) {
        //do zrobienia
    }

Macie jakieś może zastrzeżenia?? A może powinienem to inaczej rozwiązac?

No i tutaj jeszcze się pojawia pytanie... Jak napisać funkcję która będzie usuwała rekordy. Bo właśnie myślę nad napisaniem klasy z tego.

P-98790
RazzorFlame
» 2013-12-09 15:17:47
Przecież możesz użyć
std::vector
 z
#include <vector>
P-98794
xordi
Temat założony przez niniejszego użytkownika
I tak....
» 2013-12-16 10:15:37
I tak też zrobiłem... ;) Jak ktoś chce kod to PW xordi(at)wp.pl
P-99364
« 1 »
  Strona 1 z 1