Witam, stworzyłem dzisiaj notatnik zgodnie z poradnikiem pana Mirosława: http://miroslawzelent.pl/kurs-obiektowy-c++/wlasny-notatnik-w-builderze/. Teraz chciałbym go ustawić jako domyślny w komputerze. Jednak jest pewien problem. Ponieważ jak ustawiłem go i odpalam przykładowy plik tekstowy to odpala się normalnie tzn. bez odczytu danych z pliku. Czy wie ktoś jak to naprawić?
Na kursie pana Mirosława świat się nie kończy - może i jest on dobry na sam początek, ale istnieje masa kwestii, których on nie porusza. Jeśli chcesz dobrze programować, musisz koniecznie nauczyć się żyć w zgodzie z wyszukiwarką internetową. To jest po prostu konieczność. ;)
Rozwiązanie Twojego problemu może podpowiedzieć Ci prosty program. Skompiluj i uruchom. Przeanalizuj. Potem spróbuj otworzyć jakiś plik przy pomocy tego programu. Wyciągnij wnioski. :)
#include <iostream> int main(int argc, char* argv[]) { std::cout<<"Liczba otrzymanych argumentow: "<<argc<<"\n"; std::cout<<"Argumenty, przekazane przez system do programu:\n"; for(int i = 0; i < argc; ++i) std::cout<<i<<":\t"<<argv[i]<<"\n"; std::cin.get(); return 0; }
Jeśli będziesz miał nadal wątpliwości, pisz. Ja będę tu dopiero po weekendzie, więc uzbrój się w cierpliwość lub poczekaj na ewentualną podpowiedź innego Pasjonata. :)
Pozdrawiam, draghan
Przypominam że jest to zrobione w programie C++ Builder 6, kod pliku Unit1.cpp:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; AnsiString nazwapliku = ""; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Otwrz1Click(TObject *Sender) { if (OpenDialog1->Execute()) { try { tresc->Lines->LoadFromFile(OpenDialog1->FileName); nazwapliku = OpenDialog1->FileName; } catch(...) { ShowMessage("Błąd odtwarcia pliku! Upewnij się że plik instnieje na dysku"); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Zapiszjako1Click(TObject *Sender) { if (SaveDialog1->Execute()) { try { nazwapliku = SaveDialog1->FileName; tresc->Lines->SaveToFile(SaveDialog1->FileName); } catch(...) { ShowMessage("Zapis zakończył się niepowodzeniem!"); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Zapisz1Click(TObject *Sender) { if (nazwapliku!="") { tresc->Lines->SaveToFile(nazwapliku); } else { Form1->Zapiszjako1Click(MainMenu1); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Nowy1Click(TObject *Sender) { if(Application->MessageBox("Czy napewno utworzyć nowy plik?","Potwierdź", MB_YESNOCANCEL | MB_ICONQUESTION) == IDYES) { tresc->Lines->Clear(); nazwapliku = ""; } } //--------------------------------------------------------------------------- void __fastcall TForm1::trescKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (Shift.Contains(ssCtrl)) { if ((Key == 'S') || (Key == 's')) { Form1->Zapisz1Click(MainMenu1); } } if (Shift.Contains(ssCtrl)) { if ((Key == 'N') || (Key == 'n')) { Form1->Nowy1Click(MainMenu1); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Zakocz1Click(TObject *Sender) { if(Application->MessageBox("Czy napewno zakończyć program?","Potwierdź", MB_YESNO | MB_ICONQUESTION) == IDYES) { Application->Terminate(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if(Application->MessageBox("Czy napewno zakończyć program?","Potwierdź", MB_YESNO | MB_ICONQUESTION) == IDNO) { Action=caNone; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Wytnij1Click(TObject *Sender) { tresc->CutToClipboard(); } //--------------------------------------------------------------------------- void __fastcall TForm1::KopiujCtrlC1Click(TObject *Sender) { tresc->CopyToClipboard(); } //--------------------------------------------------------------------------- void __fastcall TForm1::WklejCtrlV1Click(TObject *Sender) { tresc->PasteFromClipboard(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Zawijaniewierszy1Click(TObject *Sender) { if (Zawijaniewierszy1->Checked==true) { Zawijaniewierszy1->Checked=false; tresc->WordWrap=false; tresc->ScrollBars = ssBoth; } else { Zawijaniewierszy1->Checked=true; tresc->WordWrap=true; tresc->ScrollBars = ssVertical; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Czcionka1Click(TObject *Sender) { if(FontDialog1->Execute()) { tresc->Font->Name = FontDialog1->Font->Name; tresc->Font->Color = FontDialog1->Font->Color; tresc->Font->Size = FontDialog1->Font->Size; tresc->Font->Style = FontDialog1->Font->Style; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Informacje1Click(TObject *Sender) { Form2->ShowModal(); } //---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop
#include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; AnsiString nazwapliku = ""; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------------------
void __fastcall TForm1::Otwrz1Click(TObject *Sender) { if (OpenDialog1->Execute()) { try { tresc->Lines->LoadFromFile(OpenDialog1->FileName); nazwapliku = OpenDialog1->FileName; } catch(...) { ShowMessage("Błąd odtwarcia pliku! Upewnij się że plik instnieje na dysku"); }
} } //---------------------------------------------------------------------------
void __fastcall TForm1::Zapiszjako1Click(TObject *Sender) { if (SaveDialog1->Execute()) { try { nazwapliku = SaveDialog1->FileName; tresc->Lines->SaveToFile(SaveDialog1->FileName); } catch(...) { ShowMessage("Zapis zakończył się niepowodzeniem!"); }
} } //--------------------------------------------------------------------------- void __fastcall TForm1::Zapisz1Click(TObject *Sender) { if (nazwapliku!="") { tresc->Lines->SaveToFile(nazwapliku); } else { Form1->Zapiszjako1Click(MainMenu1); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Nowy1Click(TObject *Sender) { if(Application->MessageBox("Czy napewno utworzyć nowy plik?","Potwierdź", MB_YESNOCANCEL | MB_ICONQUESTION) == IDYES) { tresc->Lines->Clear(); nazwapliku = ""; } } //--------------------------------------------------------------------------- void __fastcall TForm1::trescKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (Shift.Contains(ssCtrl)) { if ((Key == 'S') || (Key == 's')) { Form1->Zapisz1Click(MainMenu1); } } if (Shift.Contains(ssCtrl)) { if ((Key == 'N') || (Key == 'n')) { Form1->Nowy1Click(MainMenu1); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Zakocz1Click(TObject *Sender) { if(Application->MessageBox("Czy napewno zakończyć program?","Potwierdź", MB_YESNO | MB_ICONQUESTION) == IDYES) { Application->Terminate(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if(Application->MessageBox("Czy napewno zakończyć program?","Potwierdź", MB_YESNO | MB_ICONQUESTION) == IDNO) { Action=caNone; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Wytnij1Click(TObject *Sender) { tresc->CutToClipboard(); } //--------------------------------------------------------------------------- void __fastcall TForm1::KopiujCtrlC1Click(TObject *Sender) { tresc->CopyToClipboard(); } //--------------------------------------------------------------------------- void __fastcall TForm1::WklejCtrlV1Click(TObject *Sender) { tresc->PasteFromClipboard(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Zawijaniewierszy1Click(TObject *Sender) { if (Zawijaniewierszy1->Checked==true) { Zawijaniewierszy1->Checked=false; tresc->WordWrap=false; tresc->ScrollBars = ssBoth; } else { Zawijaniewierszy1->Checked=true; tresc->WordWrap=true; tresc->ScrollBars = ssVertical; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Czcionka1Click(TObject *Sender) { if(FontDialog1->Execute()) { tresc->Font->Name = FontDialog1->Font->Name; tresc->Font->Color = FontDialog1->Font->Color; tresc->Font->Size = FontDialog1->Font->Size; tresc->Font->Style = FontDialog1->Font->Style; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Informacje1Click(TObject *Sender) { Form2->ShowModal(); } //---------------------------------------------------------------------------
a pliku Project1.cpp:(tutaj jest zmiana):
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include "Unit1.h" #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); USEFORM("Unit2.cpp", Form2); //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { if (argv[1]!="") { tresc->Lines->LoadFromFile(argv[1]); } } //---------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->Title = "Notatnik"; Application->CreateForm(__classid(TForm1), &Form1); Application->CreateForm(__classid(TForm2), &Form2); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //---------------------------------------------------------------------------
#include <vcl.h> #include <iostream> #include "Unit1.h" #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); USEFORM("Unit2.cpp", Form2); //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { if (argv[1]!="") { tresc->Lines->LoadFromFile(argv[1]); } } //---------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->Title = "Notatnik"; Application->CreateForm(__classid(TForm1), &Form1); Application->CreateForm(__classid(TForm2), &Form2); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //---------------------------------------------------------------------------
Nie było tego w kursie. ;(
I to są właśnie efekty oglądania videotutoriali...
Zauważ, że w ten sposób masz w programie dwie główne funkcje - main() oraz WinMain(). Tak być nie może.
Niestety, w WinAPI odebranie parametrów wywołania programu nie jest tak banalne, jak przy użyciu "zwykłej" funkcji main. Dostajesz pojedynczy string z linią wywołania, samodzielnie musząc to porozbijać na poszczególne parametry.
Jednak istnieje pewna funkcja, rozbijająca ten jeden string na tablicę parametrów... Lecz działa ona dla wide-char, czyli dwubajtowych znaków. To może Ci przeszkadzać w operacjach na plikach.
#include <windows.h> WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nShowCmd) { MessageBox(NULL, GetCommandLine(), "Trzeci argument WinMain", MB_OK); // ta funkcja pobiera linię parametrów wywołania programu... // i musisz sobie to porozbijać własnoręcznie lub użyć poniższych funkcji - ich "wadą" są działania na łańcuchach "szerokich" - może Ci to kolidować z resztą programu: int how_many_arguments; LPWSTR arguments_line = GetCommandLineW(); LPWSTR *argument_list = CommandLineToArgvW(arguments_line, &how_many_arguments); if(argument_list == NULL) // coś nie wyszło... { MessageBoxW(NULL, L"Nie udalo sie sparsowac parametrow.", L"Blad", MB_OK); } else { for(int i = 0; i < how_many_arguments; ++i) { MessageBoxW(NULL, argument_list[i], L"Parametr", MB_OK); } } LocalFree(argument_list); // nie zapominamy zwolnić pamięci, którą zaalokowała funkcja CommandLineToArgvW return 0; }
To rozwiązanie dla czystego WinAPI. Widzę, że maly podpowiada identyfikatory ParamCount oraz ParamStr... Spróbuj najpierw ich użyć, zamiast argc i argv - oczywiście już w funkcji WinMain.
93,742 zapytań
142,678 odpowiedzi
323,297 komentarzy
63,326 pasjonatów
Motyw:
Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡
Oto polecana książka warta uwagi.Pełną listę książek znajdziesz tutaj
Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.