Vyhledávání do mema - need help – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vyhledávání do mema - need help – Delphi – Fórum – Programujte.comVyhledávání do mema - need help – Delphi – Fórum – Programujte.com

 

Dan Stahar0
Newbie
27. 8. 2006   #1
-
0
-

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).??

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
27. 8. 2006   #2
-
0
-

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.?

Nahlásit jako SPAM
IP: ...–
Dan Stahar0
Newbie
29. 8. 2006   #3
-
0
-

už je to vyřešené! ten návod funguje! :D

Nahlásit jako SPAM
IP: ...–
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žit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Podobná vlákna

Vyhledávání — založil al

Vyhledávání — založil x-flyer

Vyhledávání v polích — založil slecna_czertik

Popup na vyhledavani — založil ondrasimuss

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý