![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Как сделать так, чтобы в Grid выводился весь результат запроса, а не только по последнему слову?
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ADODB, DB, Grids, DBGrids;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DataSource2: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function StringToWords(T: string; List: Tstrings = nil): integer;
var
i, z: integer;
s: string;
c: Char;
procedure Check;
begin
if (s > '') and (List <> nil) then
begin
List.Add(S);
z := z + 1;
end;
s := '';
end;
begin
i := 0;
z := 0;
s := '';
if t > '' then
begin
while i <= Length(t) + 1 do
begin
c := t[i];
if (c in ['a'..'z']) or (c in ['A'..'Z']) or (c in ['а'..'я']) or
(c in ['А'..'Я']) and (c <> ' ') then
s := s + c
else
Check;
i := i + 1;
end;
end;
result := z;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Source, Dest, k1,k2,k3: Tstrings;
i,k,j: integer;
begin
Source := TstringList.Create;
Dest := TstringList.Create; // список слов фразы
k1 := TstringList.Create; // все окончания
k2 := TstringList.Create; // список окончаний
k3 := TstringList.Create;
k1.Add('ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|ему|ому|их|ых|ую|юю|ая|яя|ою|ею');
Source.Add('приветливый малыш с умом чудесным');
//Source.Add(Edit1.Text);
Edit1.Text:= 'приветливый малыш с умом чудесным';
for i := 0 to Source.Count - 1 do
begin
StringToWords(Source[i], Dest);
StringToWords(k1[i],k2);
Application.ProcessMessages;
end;
for i := 0 to k1.Count - 1 do
begin
StringToWords(k1[i],k2);
Application.ProcessMessages;
end;
{ for i := 0 to Dest.Count - 1 do
begin
ShowMessage(Dest[i]);
end; }
//*******КОНЕЦ ОБРАБОТКИ СЛОВ
for i:=0 to Dest.Count - 1 do
for k:=0 to k2.Count - 1 do
if StringReplace(Dest[i],k2[k],'',[rfIgnoreCase])<>Dest[i] then
begin
Memo1.Lines.Add(StringReplace(Dest[i],k2[k],'',[rfIgnoreCase]));
// ShowMessage(InttoStr(i));
Dest.Strings[i]:=StringReplace(Dest[i],k2[k],'',[rfIgnoreCase]);
end;
// ShowMessage(Dest.Text);
Edit2.Text:=Dest.DelimitedText;
// exit;
// end;
//********* организация запроса к БД
for i:=0 to Dest.Count - 1 do
begin
with Form1.ADOQuery1 do
// for k:=0 to k2.Count - 1 do
//ShowMessage(InttoStr(Length(Dest[i])));
if Length(Dest[i])>1 then begin
//k3[j]:=Dest[i]+k2[j];
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT Name');
ADOQuery1.SQL.Add('FROM WORDS');
//ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+k2[k])]));
ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+'%')]));
//ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(s[i]+'%')]));
ADOQuery1.Open;
while not Form1.ADOQuery1.eof do
begin
Memo1.Lines.Add(Form1.ADOQuery1.Fields[0].Text);
ADOQuery1.Next;
end;
end;
end;
//exit;
end;
end. |
|
#2
|
||||
|
||||
|
1. Я например не телепат, что-бы догадаться что у вас выводиться в грид. В коде программы явного указания на это нет.
2. Если предположить, что для грида используется ADOQuery1, то неочень понятен сам вопрос, т.к. в грид и выводится весь результат. 3. Поскольку вы еще и выводите в мемо все значения из первого столбца запроса, то может вы хотите выводить все столбцы? В общем нечетко сформулированный вопрос породил кучу встречных. Что-же вы хотите? ![]() |
|
#3
|
|||
|
|||
|
У меня есть БД, даю фразу, она разбивается на слова, я ищу слова ч/з ADOQuery1 в этой БД, в TDBGrid выводятся результаты, но выводится результат только по последнему слову, а надо что бы по всем словам фразы.
Вот как раз в Memo1 выводятся все слова, а вот с TDBGrid так не получается. Там же цикл используется, и получается для TDBGrid с новой итерацией происходит новый запрос и в результате только по последнему слову вывод идёт, а мне надо по всем словам...как это сделать? уже мозг не варит... Вроде всё понятно. Если что спрашивайте. |
|
#4
|
||||
|
||||
|
Понятно, но если вы так сделаете, то и в мемо будут выводиться тоже по всем словам данные, т.к. в обоих случаях используется один источник AdoQuery1.
Как я понял искрмыми словами является массив Dest? значит надо в условие отбора включить все значения из этого массива, т.е. вместо: Код:
ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+'%')]));Код:
for i := 0 to Dest.Count-1
do begin
if i = 0
then ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+'%')]))
else ADOQuery1.SQL.Add(Format(' or Name LIKE %s',[QuotedStr(Dest[i]+'%')]))
end; |
|
#5
|
|||
|
|||
|
это не то, цикл там есть, зачем ещё один?
|
|
#6
|
||||
|
||||
|
А попробуйте и посмотрите, что после цикла получается в ADOQuery1.SQL.Text
|