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

Parę problemów z edytorem tekstowym

dział ogólny

Parę problemów z edytorem tekstowym

Nowy postprzez Mister123450 » niedziela, 21 grudnia 2014, 18:36

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
Avatar użytkownika
Mister123450
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): sobota, 20 grudnia 2014, 19:20
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez polymorphism » niedziela, 21 grudnia 2014, 19:13

(...) 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() , ...)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez Mister123450 » niedziela, 21 grudnia 2014, 19:36

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')

Ostatnio edytowano niedziela, 21 grudnia 2014, 20:10 przez polymorphism, łącznie edytowano 1 raz
Powód: Nie cytuj całych postów, tylko te fragmenty, do których się odnosisz.
Avatar użytkownika
Mister123450
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): sobota, 20 grudnia 2014, 19:20
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez polymorphism » niedziela, 21 grudnia 2014, 19:43

Te błędy są odnośnie mojego kodu, czy Twojego?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez Mister123450 » niedziela, 21 grudnia 2014, 19:53

@up
Mojego kodu.
Avatar użytkownika
Mister123450
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): sobota, 20 grudnia 2014, 19:20
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez polymorphism » niedziela, 21 grudnia 2014, 20:09

Ech, trzeba Cię ciągnąć za język. Sprawdziłeś tę moją poprawkę?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez Cyfrowy Baron » niedziela, 21 grudnia 2014, 22:46

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez Mironas » poniedziałek, 22 grudnia 2014, 12:43

@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
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Parę problemów z edytorem tekstowym

Nowy postprzez Mister123450 » poniedziałek, 22 grudnia 2014, 15:42

Dziękuję za naprowadzenie mnie na dobrą drogę, naprawiłem błędy, które posiadałem.
Avatar użytkownika
Mister123450
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): sobota, 20 grudnia 2014, 19:20
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez Cyfrowy Baron » poniedziałek, 22 grudnia 2014, 18:17

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Parę problemów z edytorem tekstowym

Nowy postprzez Mironas » wtorek, 23 grudnia 2014, 11:02

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.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron