• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Notatnik - Pewien problem

VPS Starter Arubacloud
0 głosów
597 wizyt
pytanie zadane 22 lipca 2016 w C i C++ przez niezalogowany

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ć?

2 odpowiedzi

+2 głosów
odpowiedź 22 lipca 2016 przez draghan VIP (106,230 p.)
A czy zaprogramowałeś go w ten sposób, żeby otwierał plik podany mu na wejście przez system?
komentarz 23 lipca 2016 przez niezalogowany
Nie ponieważ, nie wiem jak to zrobić. Nie było tego w kursie. ;(
1
komentarz 23 lipca 2016 przez draghan VIP (106,230 p.)

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

komentarz 23 lipca 2016 przez niezalogowany
Tak rozumiem kod jednak próbowałem na wiele sposobów "włożyć ten kod do startu programu" jednak zawsze jest błąd.
komentarz 24 lipca 2016 przez draghan VIP (106,230 p.)
To pokaż przykładowe "włożenie". ;) Jeśli będzie coś nie tak - skorygujemy wspólnie.
komentarz 24 lipca 2016 przez niezalogowany

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();
}
//---------------------------------------------------------------------------

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;
}
//---------------------------------------------------------------------------

komentarz 25 lipca 2016 przez jpacanowski VIP (101,940 p.)

Nie było tego w kursie. ;(

I to są właśnie efekty oglądania videotutoriali...

komentarz 25 lipca 2016 przez draghan VIP (106,230 p.)

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.

0 głosów
odpowiedź 25 lipca 2016 przez maly Nałogowiec (37,190 p.)
ParamCount i ParamStr.

Podobne pytania

+1 głos
1 odpowiedź 267 wizyt
pytanie zadane 9 sierpnia 2015 w C i C++ przez Basze Użytkownik (630 p.)
0 głosów
1 odpowiedź 539 wizyt
0 głosów
2 odpowiedzi 480 wizyt
pytanie zadane 28 stycznia 2021 w C i C++ przez paluch Nowicjusz (120 p.)

92,452 zapytań

141,261 odpowiedzi

319,074 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...