CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Usunięcie ostatniej linii w Rich Edit

Usunięcie ostatniej linii w Rich Edit

dział ogólny

Usunięcie ostatniej linii w Rich Edit

Nowy postprzez szprotek » sobota, 30 października 2010, 19:58

Chciałem usunąć ostatnią linę w richedit:
Kod: Zaznacz cały
RichEdit1->Lines->Strings[RichEdit1->Lines->Count-1] = char(8);

ale to nie działa. Pomóżcie.
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez Cyfrowy Baron » niedziela, 31 października 2010, 06:53

Jakiego typu jest metoda Lines obiektu TRichEdit? Oczywiście jest to typ TStrings, dlatego nie należy skupiać się na usuwaniu ostatniej linii obiektu RichEdit, lecz na usuwaniu ostatniego elementu listy TStrings, a ta klasa posiada metodę Delete(int nr_linii), więc:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 RichEdit1->Lines->Delete(RichEdit1->Lines->Count - 1);
}


By się posługiwać jakąś klasą trzeba poznać jej metody.
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 XPFirefox

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez szprotek » niedziela, 31 października 2010, 09:06

wielkie dzięki za pomoc :)
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez ludwik07 » środa, 16 marca 2011, 00:19

Sorry za odświeżenie tematu ale jakby wyglądało usunięcie ostatniego znaku z RichEdit? A i czy SelectAll() działa w RichEdit? Znalzłem w internecie, że tą metodą można zaznaczyć cały tekst w RichEdit (i nawet w BCB mogę wybrać taką opcję przy RichEdit) ale u mnie to nie działa, musiałem zastąpić to czymś innym.
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez Cyfrowy Baron » środa, 16 marca 2011, 11:16

ludwik07 napisał(a): A i czy SelectAll() działa w RichEdit? Znalzłem w internecie, że tą metodą można zaznaczyć cały tekst w RichEdit


SelectAll działa w RichEdit i na pewno działa w C++Builder 6. Nie wiem jak to jest o Ciebie z tym komponentem, a konkretnie, czy ten komponent w twoim środowisku ma właściwość HideSelection. Ustawienie właściwości HideSelection na true sprawia, że nie widać zaznaczenia w RichEdit.
Inny sposób zaznaczenia wszystkiego, ale HideSelection też musi być ustawione na false.

KOD cpp:     UKRYJ  
 RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, 0, 0);
 RichEdit1->SelLength = RichEdit1->Text.Length();




ludwik07 napisał(a):Sorry za odświeżenie tematu ale jakby wyglądało usunięcie ostatniego znaku z RichEdit?


KOD cpp:     UKRYJ  
 int count = RichEdit1->Lines->Count - 1;
 int length =  RichEdit1->Lines->Strings[count].Length();

 RichEdit1->Lines->Strings[count] = RichEdit1->Lines->Strings[count].Delete(length, 1);

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
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 XPFirefox

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez ludwik07 » środa, 16 marca 2011, 12:01

Dzięki, działa wszystko :) i miałeś rację z tym HideSelection, miałem ustawione to na true i dla tego nie działało mi zaznaczanie, ale ja zastąpiłem to takim kodem:

KOD cpp:     UKRYJ  
RichEdit1->SelStart = 0;
RichEdit1->SelLength = RichEdit1->Text.Length();
RichEdit1->SetFocus();


i nie potrzebowałem ustawiać HideSelection, podpatrzyłem ten kod przy wyszukiwaniu słów w RichEdit :D i nieco zmieniłem.
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez Cyfrowy Baron » środa, 16 marca 2011, 12:19

HideSlelectiuon = true nie blokuje zaznaczania, jeżeli użyjesz funkcji SelectAll() to wszystko zostanie zaznaczone, tylko nie będzie tego zaznaczenia widać.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
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 XPFirefox

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez ludwik07 » wtorek, 22 marca 2011, 00:06

Przychodzę z kolejnym głupim pytaniem ;D
Istnieje może coś takiego czym mógłbym sprawdzić nazwę aktualnie wczytanego pliku do RichEdit? Ponieważ dodałem sobie do programu StatusBar, który pokazuje nazwę pliku, rozmiar, ilość znaków i ilość linii, z tym że ilość linii i znaków wrzuciłem sobie do Timera i chciałbym też umieścić nazwę i rozmiar żeby cały czas były odświeżane.

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
void __fastcall TForm1::FileOpenClick(TObject *Sender)
{
  CheckFileSave();
  if (OpenDialog1->Execute())
  {
    RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
    RichEdit1->Modified=FALSE;
    RichEdit1->ReadOnly=OpenDialog1->Options.Contains(ofReadOnly);
    ExtractFileName(OpenDialog1->FileName);

    StatusBar1->Panels->Items[0]->Text="Nazwa: "+ExtractFileName(OpenDialog1->FileName);

    TSearchRec SFile;
    FindFirst(OpenDialog1->FileName, faAnyFile, SFile);
    StatusBar1->Panels->Items[1]->Text="Rozmiar: "+IntToStr(SFile.Size) + "bajtów";
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileSaveAsClick(TObject *Sender)
{
  if (SaveDialog1->Execute())
  {
    RichEdit1->Lines->SaveToFile(SaveDialog1->FileName+".txt");
    RichEdit1->Modified=FALSE;

    StatusBar1->Panels->Items[0]->Text="Nazwa: "+ExtractFileName(SaveDialog1->FileName);

    TSearchRec SFile;
    FindFirst(SaveDialog1->FileName, faAnyFile, SFile);
    StatusBar1->Panels->Items[1]->Text="Rozmiar: "+IntToStr(SFile.Size) + "bajtów";
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckFileSave(void)
{
  if (RichEdit1->Modified)
  {
    switch(MessageBox(NULL, "Zawartość pliku lub okna została zmieniona. Zapisać zmiany?", "Uwaga!",MB_YESNOCANCEL | MB_ICONQUESTION))
    {
      case ID_YES : FileSaveAsClick(this);
      case ID_CANCEL : Abort();
    };
    StatusBar1->Panels->Items[0]->Text="Nazwa:";
    StatusBar1->Panels->Items[1]->Text="Rozmiar:";
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  AnsiString tekst;
  long int liczba_znakow;
  tekst = RichEdit1->Lines->GetText();
  liczba_znakow = tekst.Length();
  long int liczba_linii;
  liczba_linii=RichEdit1->Lines->Count;

  if (IntToStr(liczba_znakow)==0)
  StatusBar1->Panels->Items[2]->Text="Znaki: "+IntToStr(liczba_znakow);
  else
  StatusBar1->Panels->Items[2]->Text="Znaki: "+IntToStr(liczba_znakow-(liczba_linii*2));

  StatusBar1->Panels->Items[3]->Text="Linie: "+IntToStr(liczba_linii);
}
//---------------------------------------------------------------------------
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez Cyfrowy Baron » wtorek, 22 marca 2011, 00:21

ludwik07 napisał(a):Istnieje może coś takiego czym mógłbym sprawdzić nazwę aktualnie wczytanego pliku do RichEdit?


To nie jest możliwe. TRichEdit czy też TMemo przechowują tylko tekst, ale nie przechowują informacji o tym skąd ten tekst pochodzi. Jeżeli do wczytywania danych do TRichEdit używasz zawsze tego samego TOpenDialog a do zapisywania TSaveDialog i nie są one wykorzystywane do żadnych innych celów, to możesz pobrać z tych obiektów informacje o ostatnim wczytanym lub zapisanym pliku z właściwości FileName, gdyż pozostaje ona niezmienna aż do kolejnego użycia tych obiektów. Jeżeli jednak te okna dialogowe są używane również do innych celów, to w chwili wczytywania i zapisywania danych musisz do TRichEdit musisz zapisać nazwę pliku do jakiejś zmiennej. Program musi zmieniać zawartość tej zmiennej zawsze gdy TRcihEdit jest wczytywany lub zapisywany, wtedy bez problemu będziesz mógł odczytać nazwę pliku z tej zmiennej.

Po co ten Timer?! Modyfikuj zawartość StatusBar tylko gdy w programie zachodzi jakieś zdarzenia właśnie w tym zdarzeniu. Przecież program nie pobiera danych z zewnątrz lecz z własnych zasobów. Timer jest tutaj absolutnie zbędny. StatusBar możesz modyfikować w zdarzeniach i funkcjach.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
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 XPFirefox

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez ludwik07 » wtorek, 22 marca 2011, 10:14

OpenDialog i SaveDialog są używane tylko do wczytania i zapisania pliku, więc pewnie będę musiał to tak zostawić, a tego Timera najwyżej usunę ;p (najprościej mi było to wrzucić i sprawdzić czy wszystko działa)
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Usunięcie ostatniej linii w Rich Edit

Nowy postprzez Cyfrowy Baron » wtorek, 22 marca 2011, 11:09

Zauważ jednak, że jeżeli używasz zarówno OpenDialog do wczytywania pliku, do RichEdit i SaveDialog do zapisywania zawartości RichEdit. To OpenDialog przechowuje informację o ostatnim wczytanym pliku a SaveDialog o ostatnim zapisanym pliku. Jeżeli więc otworzysz plik w OpenDialog, to w RichEdit będzie to co pamięta OpenDialog, ale jeżeli zapiszesz RichEdit to w RichEdit będzie to co pamięta SaveDialog, a nie OpenDialog. Sprawdzając co znajduje się w RichEdit musisz wybrać czy sprawdzasz OpenDialog, czy SaveDialog i tutaj masz problem, dlatego najlepszym rozwiązaniem jest zmienna, której zawartość zawsze się zmienia, gdy zostanie użyty OpenDialog i SaveDialog. Pobierając dane z takiej zmiennej zawsze masz aktualne informacje o tym co znajduje się w RichEdit.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
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 XPFirefox


  • 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 45 gości

cron