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

Notatnik - Pewien problem

0 głosów
204 wizyt
pytanie zadane 22 lipca 2016 w C i C++ przez Hacper Gaduła (4,420 p.)

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 (102,850 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 Hacper Gaduła (4,420 p.)
Nie ponieważ, nie wiem jak to zrobić. Nie było tego w kursie. ;(
1
komentarz 23 lipca 2016 przez draghan VIP (102,850 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 Hacper Gaduła (4,420 p.)
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 (102,850 p.)
To pokaż przykładowe "włożenie". ;) Jeśli będzie coś nie tak - skorygujemy wspólnie.
komentarz 24 lipca 2016 przez Hacper Gaduła (4,420 p.)

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 (100,090 p.)

Nie było tego w kursie. ;(

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

komentarz 25 lipca 2016 przez draghan VIP (102,850 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,290 p.)
ParamCount i ParamStr.

Podobne pytania

+1 głos
1 odpowiedź 129 wizyt
pytanie zadane 9 sierpnia 2015 w C i C++ przez Basze Użytkownik (630 p.)
0 głosów
1 odpowiedź 82 wizyt
0 głosów
1 odpowiedź 452 wizyt
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

62,455 zapytań

108,603 odpowiedzi

226,736 komentarzy

36,182 pasjonatów

Przeglądających: 195
Pasjonatów: 17 Gości: 178

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...