CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - ReplaceDialog - użycie

ReplaceDialog - użycie

dział ogólny

Re: ReplaceDialog - użycie

Nowy postprzez Cyfrowy Baron » niedziela, 31 października 2010, 11:54

Fakt! Za szybko pisałem kod. Poprawiam:

KOD cpp:     UKRYJ  
String ReplaceContext(String Text, String FindText, String ReplaceText)
{
 String Result;
 int x = Text.Pos(FindText);
 
 if(x <= 0) return Text;

 Result = Text.Delete(x, FindText.Length());
 Result = Result.Insert(ReplaceText, x);

 return Result;
}
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: ReplaceDialog - użycie

Nowy postprzez polymorphism » niedziela, 31 października 2010, 12:24

No, teraz OK. Choć Twój kod nie przewiduje wariantu, gdzie w stringu jest kilka wystąpień szukanego tekstu:
KOD cpp:     UKRYJ  

int x;

if(FindText == ReplaceText)return Text;

Result = Text;

while(x = Result.Pos(FindText))
{
        Result = Result.Delete(x, FindText.Length()).Insert(ReplaceText, x);
}

return Result;

Minusem tego kodu jest to, że string jest przeszukiwany od początku co iterację, no ale niestety, taki "wspaniały" jest ten VCL-owy string (do tego dochodzi jeszcze brak metody replace).
C++ Reference - opis wszystkich klas STL-a i funkcji C.

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

Re: ReplaceDialog - użycie

Nowy postprzez Cyfrowy Baron » niedziela, 31 października 2010, 12:28

Można to znacznie uprościć:

KOD cpp:     UKRYJ  
String ReplaceContext(String Text, String FindText, String ReplaceText)
{
 String Result;
 int x = Text.Pos(FindText);
 
 if(x <= 0) return Text;

 Result = StringReplace(Text, FindText, ReplaceText, TReplaceFlags() << rfReplaceAll);

 return Result;
}
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: ReplaceDialog - użycie

Nowy postprzez Cyfrowy Baron » niedziela, 31 października 2010, 12:36

Po namyśle.
Sprawdzanie czy łańcuch znaków zawiera poszukiwany tekst jest zbędne, gdyż funkcja StringReplace już to robi, wystarczy wiec:

KOD cpp:     UKRYJ  
String ReplaceContext(String Text, String FindText, String ReplaceText)
{
 return StringReplace(Text, FindText, ReplaceText, TReplaceFlags() << rfReplaceAll);
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
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: ReplaceDialog - użycie

Nowy postprzez polymorphism » niedziela, 31 października 2010, 12:39

Można to znacznie uprościć:

No tak, pisałem już o tym, to znaczy o tej funkcji, wcześniej. Odnosiłem się do Twojego kodu.
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 XPFirefox

Re: ReplaceDialog - użycie

Nowy postprzez Cyfrowy Baron » niedziela, 31 października 2010, 12:41

Rzeczywiście! Wcześniej umknęło mi to.
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: ReplaceDialog - użycie

Nowy postprzez Pitek » niedziela, 31 października 2010, 16:04

Niezmiernie wam Panowie DZIĘKUJĘ! Za pomoc a co ważne za zrozumienie ;) . Jeszcze się uczę i dużo przede mną dlatego bardzo sobie cenię przykłady z opisem. Staram się z nich wyciągnąć jak najwięcej, analizując je.

Jeszcze raz wielkie DZIĘKI! 8-)

Mam jeszcze taki mały problem z tym kodem otóż gdy wyszukuje tekst np. warszawa bez uwzględniania wielkości liter a w tabeli jest jako Warszawa to owszem wyszukuje ten tekst (ponieważ podświetla komórki w których się on znajduje), jednak nie zamienia ich na podany tekst.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: ReplaceDialog - użycie

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

Z którym kodem dokładnie masz ten problem?! :evil:
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: ReplaceDialog - użycie

Nowy postprzez Pitek » niedziela, 31 października 2010, 18:31

Szczerze mówiąc to właśnie nie wiem który kod mógłby generować ten problem ale sądząc po zachowaniu programu myślę że jest to ten który zamienia tekst czyli ReplaceContext jednak może być zupełnie inaczej, kod którego użyłem:

KOD cpp:     UKRYJ  
int CompareContext(String Str1, String Str2, bool MatchCase)
{
  if(MatchCase == false)
  {
    Str1 = Str1.LowerCase();
    Str2 = Str2.LowerCase();
  }

  int x = Str1.Pos(Str2);

  if(x > 0) return 0;

  return 1;
}
//---------------------------------------------------------------------------

KOD cpp:     UKRYJ  
String ReplaceContext(String Text, String FindText, String ReplaceText)
{
 return StringReplace(Text, FindText, ReplaceText, TReplaceFlags() << rfReplaceAll);
}


a używam :

KOD cpp:     UKRYJ  
int compare;
  if(ReplaceDialog1->Options.Contains(frMatchCase))
  {
   compare = CompareContext(StringGrid1->Cells[col][row], ReplaceDialog1->FindText, true);
  }

  if(!ReplaceDialog1->Options.Contains(frMatchCase))
  {
   compare = CompareContext(StringGrid1->Cells[col][row], ReplaceDialog1->FindText, false);
  }

KOD cpp:     UKRYJ  
if(compare == 0)
  {
   StringGrid1->Cells[col][row] = ReplaceContext(StringGrid1->Cells[col][row],
        ReplaceDialog1->FindText,
        ReplaceDialog1->ReplaceText);
   StringGrid1->Col = col;
   StringGrid1->Row = row;
   next = false;
  }
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: ReplaceDialog - użycie

Nowy postprzez Cyfrowy Baron » niedziela, 31 października 2010, 19:39

Po pierwsze funkcja Pos nie uwzględnia wielkości liter, dlatego trzeba poprawić funkcję CompareContext:

KOD cpp:     UKRYJ  
int CompareContext(String Str1, String Str2, bool MatchCase)
{
  if(!MatchCase)
  {
    Str1 = Str1.LowerCase();
    Str2 = Str2.LowerCase();
  }

  int x = Str1.Pos(Str2);
  String tmp = Str1.SubString(x, Str2.Length());

  if(CompareStr(tmp, Str2) != 0) return 1;

  if(x > 0) return 0;

  return 1;
}


Po drugie funkcja StringReplace uwzględnia wielkość liter dlatego trzeba również poprawić funkcję ReplaceContext:

KOD cpp:     UKRYJ  
String ReplaceContext(String Text, String FindText, String ReplaceText, bool MatchCase)
{
  if(!MatchCase)
  {
    Text        = Text.LowerCase();
    FindText    = FindText.LowerCase();
    ReplaceText = ReplaceText.LowerCase();
  }

  return StringReplace(Text, FindText, ReplaceText, TReplaceFlags() << rfReplaceAll);
}


Wywołanie funkcji:

KOD cpp:     UKRYJ  
  int compare;
  if( ReplaceDialog1->Options.Contains(frMatchCase) )
   compare = CompareContext(StringGrid1->Cells[col][row],
                            ReplaceDialog1->FindText, true);

  if( !ReplaceDialog1->Options.Contains(frMatchCase) )
   compare = CompareContext(StringGrid1->Cells[col][row],
                            ReplaceDialog1->FindText, false);

  if( compare == 0 )
  {
   StringGrid1->Cells[col][row] = ReplaceContext(StringGrid1->Cells[col][row],
                                                ReplaceDialog1->FindText,
                                                ReplaceDialog1->ReplaceText,
                                                ReplaceDialog1->Options.Contains(frMatchCase));

   StringGrid1->Col = col;
   StringGrid1->Row = row;
   next = false;
  }


Poza tym zmienne statyczne:

KOD cpp:     UKRYJ  
 static int col = -1, row = 0;


zamieniłbym na zmienne prywatne:

Plik nagłówkowy np. Unit.h
KOD cpp:     UKRYJ  
private:
        int col, row;


W zdarzeniu OnShow dla ReplaceDialog1 zerowałbym te zmienne:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ReplaceDialog1Show(TObject *Sender)
{
 col = -1, row = 0;
}


do zdarzenia OnReplace dla ReplaceDialog1 dodałbym kod zerujący wyszukiwanie, gdy zmianie ulegnie wyszukiwany tekst w oknie dialogowym, czyli to zdarzenie mogłoby wyglądać tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)
{
 static String changeText = "";
 String tmpChangeText = ReplaceDialog1->FindText;

 if(CompareStr(changeText, tmpChangeText) != 0)
 {
  changeText = tmpChangeText;
  col = -1;
  row = 0;
 }

 bool next = true;
 while(next)
 {
  if(col < 9)
  {
   ++col;
  }
  else
  {
   col = 0;
   ++row;

   if(row > 9) row = 0;
  }

  int compare;
  if( ReplaceDialog1->Options.Contains(frMatchCase) )
   //compare = CompareStr( StringGrid1->Cells[col][row], ReplaceDialog1->FindText);
   compare = CompareContext(StringGrid1->Cells[col][row],
                            ReplaceDialog1->FindText, true);

  if( !ReplaceDialog1->Options.Contains(frMatchCase) )
   //compare = CompareText(StringGrid1->Cells[col][row], ReplaceDialog1->FindText);
   compare = CompareContext(StringGrid1->Cells[col][row],
                            ReplaceDialog1->FindText, false);

  if( compare == 0 )
  {
   StringGrid1->Cells[col][row] = ReplaceContext(StringGrid1->Cells[col][row],
                                                ReplaceDialog1->FindText,
                                                ReplaceDialog1->ReplaceText,
                                                ReplaceDialog1->Options.Contains(frMatchCase));

   StringGrid1->Col = col;
   StringGrid1->Row = row;
   next = false;
  }
  else
  {
   next  = true;
   if(col >= 9 && row >= 9)
   {
    col = 0;
    row = 0;
    return;
   }
  }
 }
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
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: ReplaceDialog - użycie

Nowy postprzez Pitek » niedziela, 31 października 2010, 21:07

Bardzo dziękuję!!!
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: ReplaceDialog - użycie

Nowy postprzez polymorphism » niedziela, 31 października 2010, 22:32

Po drugie funkcja StringReplace uwzględnia wielkość liter

Uwzględnia, ale nie musi - jest flaga rfIgnoreCase.
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 XPFirefox

Re: ReplaceDialog - użycie

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 listopada 2010, 08:23

Celna uwaga. Zupełnie o tym zapomniałem, to aż tak dużo nie zmienia, funkcja ReplaceContext może pozostać w takiej postaci jak podałem, może też być tak:

KOD cpp:     UKRYJ  
String ReplaceContext(String Text, String FindText, String ReplaceText, bool MatchCase)
{
  if(!MatchCase)
     return StringReplace(Text, FindText, ReplaceText, TReplaceFlags() << rfReplaceAll << rfIgnoreCase);

  return StringReplace(Text, FindText, ReplaceText, TReplaceFlags() << rfReplaceAll);
}
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

Poprzednia strona

  • 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ść