Autor postu zdaje się raczej sądzić, iż komponent
TReplaceDialog udostępnia jakieś funkcje umożliwiające proste, bezwysiłkowe zamienianie tekstu. Tak jednak nie jest. Ten komponent udostępnia tylko okienko dialogowe z kilkoma zmiennymi i zdarzeniami. Wykorzystując zdarzenie
OnReplace można oczywiście zmienić tekst w komórkach tabeli, ale ten komponent jest zasadniczo przystosowany do obiektów typu
TMemo i
TRichEdit, co nie oznacza, że wystarczy je podpiąć pod tego obiekty, a komponent zrobi resztę.
Podaję tutaj prosty przykład zamiany tekstu z uwzględnianiem opcji wielkości liter. Przykład działa prawidłowo, ale może wymagać dopracowania lub zmian, gdyż wyszukiwanie zawsze odbywa się tutaj od początku do końca tabeli, a nie od wybranej komórki. Gdy wyszukiwanie dojdzie do końca zaczyna się od początku, o ile zostanie wciśnięty przycisk
Zamień:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ReplaceDialog1->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)
{
static int 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);
if( !ReplaceDialog1->Options.Contains(frMatchCase) )
compare = CompareText(StringGrid1->Cells[col][row], ReplaceDialog1->FindText);
if( compare == 0 )
{
StringGrid1->Cells[col][row] = ReplaceDialog1->ReplaceText;
StringGrid1->Col = col;
StringGrid1->Row = row;
next = false;
}
else
{
next = true;
if(col >= 9 && row >= 9)
{
col = 0;
row = 0;
return;
}
}
}
}
//---------------------------------------------------------------------------
P.S. CB udało mi się zrobić te podpowiedzi xD
Myślałem nad tym i dałoby się to zrobić za pomocą dwóch list jednej w pamięci, jednej wizualnej i pętli, ale to się nie sprawdzi przy dużej liczbie rekordów. Powinieneś opisać ten problem w oddzielnym wątku. Ten jeden raz zrobię to za Ciebie, być może ktoś będzie miał pomysł jak to zrobić.
Chodzi o zrobienie czegoś podobnego jak podpowiedzi w edytorze środowiska C++builder:
podpowiedz.png
Rzecz w tym, żeby zrobić coś podobnego dla tabeli typu TStringGrid. Zrobienie samego mechanizmu podpowiedzi nie jest problemem, więc kwestia tego, czy to będzie tabela czy inny obiekt jest tutaj nieistotna. Istotne jest to jak wyszukiwać tekst w trakcie pisania.
Mam dajmy na to obiekt typu TEdit - Edit1, mam też listę typu TStringList - ARecords zawierającą rekordy, oraz drugą listę typu TListBox - BResult pustą. Chodzi o to by podczas wpisywania tekstu w Edit1 program szukał na liście ARecords rekordu, którego tekst zaczyna się na litery wpisane już w Edit1, np:Lista ARecords zawiera wpisy:
|
Mercedes Fiat Brava Fiat Coupe Fiat Ducato Polonez |
Po wpisaniu do Edit jeden tekstu: Fia program przeszukuje listę ARecords i filtruje wyniki wyświetlane w liście BResult, czyli umieszcza na tej liście wszystkie rekordy zaczynające się na Fia, a więc:
|
Fiat Brava Fiat Coupe Fiat Ducato |
Gdy np. w Edit1 znajdzie się tekst Fiat C to na liście BResult zostanie wyświetlony rekord Fiat Coupe.
Zadanie da się zrealizować w prosty sposób: po każdym wpisanym znaku program przegląda listę z rekordami i wpisuje na listę wynikową tylko te pasujące. To proste rozwiązanie, ale w przypadku dużej liczy rekordów będzie powstawać duże opóźnienie.
Szukam innego sposobu.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.