Nazdar!
Narazil jsem při programování v Delphi na jeden problém : potřebuju ze string gridu vytáhnout data a porovnat je s editem. Přitom ale potřebuju, aby se z obou textů odfiltrovaly spoky jako třeba a, dvojtečka, čárka atd. a aby se označily jako souhlasné i ty, u kterých je shodná i jen jedna položka. Nejlepší asi bude, když to napíšu takhle:
tohle je edit a v něm zadáno:
........................
. kočka a pes .
........................
tady je stringgrid 1x5 políček a je v něm:
.......................
. kočka a pes .
.......................
. pes a kočka .
.......................
. kočka a její kocour .
.......................
. pes a jeho pán .
.......................
. pán a jeho kocour .
.......................
a já z toho potřebuju po stisku tlačítka do mema vytáhnout 1. až 4. řádek protože je tam vždycky aspoň 1 slovo (kromě spojek, o kterejch sem psal na začátku) shodný. Takže by to vypadalo takhle:
memo
.......................................................
. kočka a pes .
. pes a kočka .
. kočka a její kocour .
. pes a jeho pán .
. .
. .
. .
.......................................................
Zatím jsem to řešil pomocí tří textových souborů, ale mám tam nějakou chybku (nejspíš při načítání ze souborů nebo při porovnávání, protože v souborech jsem to zkoumal a tam je to správně) a tak se mi to s**e (například když do editu zadám "pes a kočka a pán" tak se vypíšeto samé jako když tam zadám jenom "pes a kočka"). Má to sloužit jako vyhledávání k domácí videotéce. Zdroják přiložim na konec. Byl bych fakt vděčnej za jakejkoliv help, nemoh sem nic najít na Netu ani v nápovědě Delphi. Pokud by k tomu byl potřeba celej zdroják, klidně pošlu. Dopředu díky . Zdraví
Daniel Stahr, [email]Daniel.Stahr@seznam.cz[/email]
procedure TForm1.Button3Click(Sender: TObject);
var i, n,o,p,q, a, min, max,b,m:integer;
c:char;
t:string;
f, g:textfile;
slova:array[1..50,1..2] of string;
search:boolean;
begin
memo1.Visible:=true;
label6.Show;
memo1.Clear ;
case radiogroup1.ItemIndex of
1:begin
for i:=1 to x-1 do
begin
search:=true;
with stringgrid2 do //zápis do souborů
begin
assignfile(f,'helper_reader.txt');
rewrite(f);
t:=cells[3,i];
writeln(f,t);
closefile(f);
assignfile(f,'helper_reader.txt');
assignfile(g,'helper_saver.txt');
reset(f);
rewrite(g);
t:='';
while not (Eoln(f)) do
begin
read(f,c);
if c=' ' then
begin
if (t='a') or (t=' ') or (t='') or(t=':') or (t=',') then t:='' else
begin
writeln(g,t);
t:='';
end;
end
else t:=t+c;
end;
if (t <>' ') and (t<>'a') and (t<>'') and (t<> ',') and (t<>':') then writeln(g,t);
closefile(f);
closefile(g);
assignfile(f,'helper_reader.txt');
rewrite(f);
t:= Edit11.Text;
writeln(f,t);
closefile(f);
assignfile(f,'helper_reader.txt');
assignfile(g,'helper_search.txt');
reset(f);
rewrite(g);
t:='';
while not (Eoln(f)) do
begin
read(f,c);
if c=' ' then
begin
if (t='a') or (t=':') or (t= ',') or (t=' ') or (t='') then t:='' else
begin
writeln(g,t);
t:='';
end;
end
else t:=t+c;
end;
if (t <>' ') and (t<>'a') and (t<>'') and (t<> ',') and (t<>':') then writeln(g,t);
closefile(f);
closefile(g);
assignfile(f, 'helper_saver.txt');
assignfile(g, 'helper_search.txt');
reset(f);
reset(g);
n:=1;
while not (Eof(f)) do//např
begin
t:='';
while not (Eoln(f)) do
begin
read(f,c);
t:=t+c;
end;
slova[n,2]:=t;
n:=n+1;
readln(f);
end;
closefile(f);
o:=1;
while not (Eof(g)) do
begin
t:='';
while not (Eoln(g)) do
begin
read(g,c);
t:=t+c;
end;
slova[o,1]:=t;
o:=o+1;
readln(g);
end;
closefile(g);
q:=1;
p:=1;
repeat
begin
if search then
begin
if (slova[q,2]=slova[p,1]) then
begin
memo1.lines.Add(cells[2,i] + ', ' + cells[3,i] + ', ' + cells[4,i] + ', ' + cells[5,i] + ', ' + cells[6,i] );
n:=p+1;
search:=false;
end
else
begin
if q=o+1 then
begin
q:=1;
p:=p+1;
end
else q:=q+1;
end;
end;
end;
until n=p+1;
end;
end;
end;
pozn. x je počet řádků stringgridu -1. 1 řádek stringgridu je vždycky prázdnej(ten na konci).??
Fórum › Delphi
Vyhledávání do mema - need help
Mno, cele jsem to necetl, ale co se tyce toho prvniho, tedy naplneni mema, tak by ti mohlo pomoct nasledujici reseni. Pozn. SG je StringGrid. Procedura Tokenizer rozdeli retezec na tokeny(casti textu podle zadanych oddelovacu), FillSG je jen pro ilustraci, funkce InArray hleda v poli Arr vyskzt slova Str v pripade nalezeni vraci true.
const N = 20;
type TArray = array [1..N] of String;
// Rozdeli retezec na tokeny podle zadanych znaku
procedure Tokenizer(const Str, del: String; var Arr: TArray);
var last, pos, p: integer;
begin
last:= 1;
while(IsDelimiter(del, Str, last)and(last <= Length(Str))) do inc(last); // preskoci oddelovace na zacatku
pos := last;
while not(IsDelimiter(del, Str, pos))and(pos <= Length(Str)) do inc(pos);
p:=1;
while(pos <= Length(Str))or(last <= Length(Str)) do
begin
ShowMessage(Copy(Str, last, pos-last));
Arr[p]:=Copy(Str, last, pos-last);
last:=pos;
while(IsDelimiter(del, Str, last)and(last <= Length(Str))) do inc(last);
pos := last;
while not(IsDelimiter(del, Str, pos))and(pos <= Length(Str)) do inc(pos);
inc(p);
end;
end;
procedure TForm1.FillSG(); // pouze pro demonstraci
begin
SG.Cells[0,0] := 'kocka a pes';
SG.Cells[0,1] := 'pes a kocka';
SG.Cells[0,2] := 'kocka a jeji kocour';
SG.Cells[0,3] := 'pes a jeho pan';
SG.Cells[0,4] := 'pan a jeho kocour';
end;
{$R *.dfm}
function InArray(const Arr: TArray; const Str: string): boolean;
var p: byte;
begin
for p:=1 to Length(Arr) do
if (Arr[p] = Str) then
begin
InArray := TRUE;
exit;
end;
InArray := FALSE;
end;
procedure TForm1.Button1Click(Sender: TObject);
var text, con: Tarray;
p,j: integer;
// spojky ktere v textu nechces
begin
con[1] := 'a'; con[2] := 'ale'; con[3]:='ani';
Tokenizer(Edit1.Text, ' ,:!.', text); // rozdeleny text z editu
//a jde se hledat
for p:=0 to SG.RowCount-1 do
begin
for j:=1 to Length(text) do
if not(InArray(con, text[j])) then
begin
if( nil <> StrPos(PChar(SG.Cells[0,p]), PChar(text[j]) )) then
begin
Memo1.Lines.Add(SG.Cells[0,p]);
break;
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FillSG;
end;
Jak vidis, neni to nijak slozite, jen na tu fci Tokenizer - jinak totiz davam prednost C++, takze ten, kdo zna lepe Delphi Ti mozna poradi uz nejakou hotovou funkci na rozdelovani retezce.?
už je to vyřešené! ten návod funguje! :D
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 3 hosté
Podobná vlákna
Lazarus - uložení aktivního mema do souboru — založil Laz
Vyhledávání — založil al
Vyhledávání — založil x-flyer
Popup na vyhledavani — založil ondrasimuss
Vyhledávání v polích — založil slecna_czertik