CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Parę problemów z edytorem tekstowym
Strona 1 z 1

Parę problemów z edytorem tekstowym

Nowy postNapisane: niedziela, 21 grudnia 2014, 18:36
przez Mister123450
Witam!
Otóż mam parę problemów z budową edytora tekstowego. Pierwszym problemem jest zmniejszenie ścieżki pliku do samej względnej ścieżki. Szukałem jednak to co znalazłem albo nie istniało, albo już nie istnieje, "metoda" MinimizeName.

Struktura ProgSettings:
KOD cpp:     UKRYJ  
struct programSet {
// General
AnsiString AppName;
unsigned short Width,
               Height;

// File
AnsiString TempPath, FileName, FileNameMin;
bool FileSaved;

// Font
AnsiString FontName;
unsigned short FontSize;
};


KOD cpp:     UKRYJ  
void __fastcall TForm1::MOpen1Click(TObject *Sender)
{
        MClose1Click(Sender);
        if(OpenDialog1->Execute())
        {
                RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
                ProgSettings.FileName = OpenDialog1->FileName;
                ProgSettings.FileNameMin = OpenDialog1->FileName.MinimizeName();
                Form1->Caption = ProgSettings.AppName + ProgSettings.FileName;
                ProgSettings.FileSaved = true;
                UndoSaved = UndoLastSave = 0;
                UndoLast = 1;
                ClearTemp();
                RichEdit1->Lines->SaveToFile(ProgSettings.TempPath + "sqsundo" + UndoLast);
        }
}
//--> MOpen1Click


Drugi problem to jest konwertowanie AnsiString do const char*, z którym bawiłem się na różne sposoby, zmieniając typy zmiennych ale i tak wciąż jest błąd z tą smutną linijką MessageBox();
ToExit to zmienna typu boolean do zapytania czy funkcję MClose1Click wywołała MExit1Click ale nie zajmowałem się tym i miło byłoby prosić też o jakąś pomoc jak to napisać. Niestety nie wpadłem na pomysł jak przetrzymać wartość zwróconą przez MessageBox by inaczej anulować zamykanie pliku.
KOD cpp:     UKRYJ  
void __fastcall TForm1::MClose1Click(TObject *Sender)
{
       
        if(!ProgSettings.FileSaved)
        {
                if(MessageBox(NULL, "File: " + ProgSettings.FileNameMin + "\nis not saved.\nWould you like to save?", "File not saved", MB_YESNOCANCEL | MB_ICONINFORMATION) == IDYES)
                        RichEdit1->Lines->SaveToFile(ProgSettings.FileName);
                else if(IDCANCEL)
                {
                        return;
                }
        }

        ToExit = true;
        RichEdit1->Lines->Clear();
        ProgSettings.FileName = "";
        ProgSettings.FileNameMin = "";
        ProgSettings.FileSaved = false;
        UndoSaved = UndoLastSave = UndoLast = 0;
        Form1->Caption = ProgSettings.AppName + "Untitled";
        ClearTemp();
}
//--> MClose1Click


Która funkcja jest odpowiedzialna za uruchomienie programu (szukając w dokumentacji nic nie ma) z parametrami, jeżeli w cmd ten program uruchamia się wpisując "program.exe file.txt". Czy kod jest na tyle potrzebny to nie wiem.
KOD cpp:     UKRYJ  
void __fastcall TForm1::MCompile1Click(TObject *Sender)
{
;
}
//--> MCompile1Click

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: niedziela, 21 grudnia 2014, 19:13
przez polymorphism
(...) ale i tak wciąż jest błąd z tą smutną linijką MessageBox();

Jak jest błąd, to trzeba podać jaki błąd.

Zgaduję:
KOD cpp:     UKRYJ  
MessageBox(NULL, (AnsiString("File: ") + ProgSettings.FileNameMin + "\nis not saved.\nWould you like to save?").c_str() , ...)

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: niedziela, 21 grudnia 2014, 19:36
przez Mister123450
polymorphism napisał(a):Jak jest błąd, to trzeba podać jaki błąd.


[C++ Error] main.cpp(142): E2034 Cannot convert 'AnsiString' to 'const char *'
[C++ Error] main.cpp(142): E2342 Type mismatch in parameter 'lpText' (wanted 'const char *', got 'AnsiString')


Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: niedziela, 21 grudnia 2014, 19:43
przez polymorphism
Te błędy są odnośnie mojego kodu, czy Twojego?

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: niedziela, 21 grudnia 2014, 19:53
przez Mister123450
@up
Mojego kodu.

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: niedziela, 21 grudnia 2014, 20:09
przez polymorphism
Ech, trzeba Cię ciągnąć za język. Sprawdziłeś tę moją poprawkę?

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: niedziela, 21 grudnia 2014, 22:46
przez Cyfrowy Baron
KOD cpp:     UKRYJ  
if( Application->MessageBox( ("File: " + (String)ProgSettings.FileNameMin + "\nis not saved.\nWould you like to save?").c_str(), "File not saved", MB_YESNOCANCEL | MB_ICONQUESTION) == ID_YES )


(String)ProgSettings.FileNameMin


Nie wiem co zwraca FileNameMin dlatego zrobiłem rzutowanie na AnsiString, ale jeśli zwraca wartość typu AnsiString to ten String w nawiasie przed jest zbędny.

Nie kombinuj z samym MessageBox chyba, że chcesz go przypisać do konkretnego okna, a nie do całej aplikacji. Skoro w komunikacie pada pytanie to nie MB_ICONINFORMATION czyli ikona informacji, lecz MB_ICONQUESTION czyli ikona zapytania. Na pewno chcesz, żeby komunikat wyświetlał 3 przyciski [ TAK ] [ NIE ] [ ANULUJ ], a nie tylko dwa skoro nie obsługujesz przycisku [ ANULUJ ]. Może wystarczy MB_YESNO.

Poczytaj tutaj o MessageBox: Obsługa komunikatów.

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: poniedziałek, 22 grudnia 2014, 12:43
przez Mironas
@Mister123450
Piszesz tak chaotycznie, że trudno zrozumieć o co Ci chodzi. Ale spróbujmy:
Mister123450 napisał(a):Pierwszym problemem jest zmniejszenie ścieżki pliku do samej względnej ścieżki

KOD cpp:     UKRYJ  
String dir = ExtractRelativePath(dir1, dir2);    // Zwraca ścieżke względną pomiędzy katalogami


Mister123450 napisał(a):Drugi problem to jest konwertowanie AnsiString do const char*

KOD cpp:     UKRYJ  
  AnsiString s = "Ala ma kota";
  char* c = s.c_str();
 

A np. dla MessageBox-a:
KOD cpp:     UKRYJ  
  AnsiString s1 = "File: " + ProgSettings.FileNameMin + "\nis not saved.\nWould you like to save?";
  if(MessageBox(NULL, s1.c_str(), "File not saved", MB_YESNOCANCEL | MB_ICONINFORMATION) == IDYES)
  [...]


Mister123450 napisał(a):Która funkcja jest odpowiedzialna za uruchomienie programu [...] z parametrami

Jeśli chodzi Ci o odczyt parametrów startowych z którymi uruchomiono program, to:
KOD cpp:     UKRYJ  
  ParamCount();  // zwraca ilość parametrów startowych
  ParamStr(x);  // zwraca wybrany parametr
  ParamStr(0);  // Parametr nr 0 - zwraca ścieżkę do uruchomionego pliku
 

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: poniedziałek, 22 grudnia 2014, 15:42
przez Mister123450
Dziękuję za naprowadzenie mnie na dobrą drogę, naprawiłem błędy, które posiadałem.

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: poniedziałek, 22 grudnia 2014, 18:17
przez Cyfrowy Baron
Mironas napisał(a):
KOD cpp:     UKRYJ  
  ParamStr(0);  // Parametr nr 0 - zwraca ścieżkę do uruchomionego pliku



Zwraca ścieżkę do programu wraz z nazwa programu. Załóżmy, że uruchamiasz program o nazwie Etytor.exe z lokalizacji c:\Program Files\Mój Edytor. W takim wypadku ParamStr(0) zwróci: c:\Program Files\Mój Edytor\Edytor.exe. Jeśli chcesz by zwrócił tylko samo ścieżkę to musisz użyć funkcji ExtractFilePath, czyli:

KOD cpp:     UKRYJ  
String path = ExtractFilePath( Param(0) );


wtedy zwróci dokładnie: c:\Program Files\Mój Edytor - bez ukośnika na końcu, a jeśli użyjesz ExtractFileDir to na końcu tej ścieżki będzie jeszcze ukośnik.

Re: Parę problemów z edytorem tekstowym

Nowy postNapisane: wtorek, 23 grudnia 2014, 11:02
przez Mironas
Cyfrowy Baron napisał(a):Zwraca ścieżkę do programu wraz z nazwa programu.

Dokładnie to miałem na myśli. Pojęcie ścieżka [dostępu] do pliku oznacza miejsce ulokowania konkretnego pliku (wraz z nazwą tego pliku) w strukturze katalogów:
Wikipedia -> Ścieżka dostępu
Wikipedia -> Path (computing)

Jednocześnie pojęcie "ścieżka" stosowane jest jako wyłącznie ścieżka katalogów w którym znajduje określony plik. Czasem stosuje się określenia "skrócona ścieżka" lub "pełna ścieżka" dla odróżnienia. Przykładem może być funkcja ExtractShortPathName działająca podobnie jak ExtractFilePath.