Процедура большая, сразу пугать людей не хочу=) думаю мало кто захочет вникать в код новичка
Благодарен за любые советы!MyList2: TStringListUTF8; Объявлена как глобальная переменная, в ней хранится DisplayName
- Код: Выделить всё
procedure TfMian.mBeginSerchClick(Sender: TObject);
var
MyList: TStringListUTF8; // для хранения названий ключей реестра
MyRegistry: TRegistry;
s: string;
i : integer;
// p: Integer;
FiltrStr: string;
Str: string;
N:integer; // для записи в базу списка
begin
Cursor:= crHourGlass;
bSearch.Visible:=False; //скрываем кнопку начать поиск
// // очищаем старое содержимое
SQLQuery1.Close; // очиска таблицы в базе, в которую
SQLQuery1.SQL.Text := 'delete from install'; // записывается список программ
SQLQuery1.ExecSQL;
SQLTransaction1.CommitRetaining;
//
MyList2:=TStringListUTF8.Create;
MyRegistry:=TRegistry.Create(KEY_WOW64_64KEY);
MyList:=TStringListUTF8.Create;
with MyRegistry do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\');
GetKeyNames(MyList);
CloseKey;
for i:=0 to MyList.Count-1 do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'+
MyList[i]);
Str:=ReadString('DisplayName');
if Str<>'' then
MyList2.Add(CP1251ToUTF8(ReadString('DisplayName')));
CloseKey;
end;
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\');
GetKeyNames(MyList);
CloseKey;
for i:=0 to MyList.Count-1 do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+
MyList[i]);
Str:=ReadString('DisplayName');
if Str<>'' then
MyList2.Add(CP1251ToUTF8(ReadString('DisplayName')));
CloseKey;
end;
end;
//
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('insert into install(text)'); // Запись полученного списка прог в базу
SQLQuery1.SQL.Add('Values (:pText)');
for N := 0 to MyList2.Count - 1 do
begin
SQLQuery1.ParamByName('pText').AsString := MyList2[N];
SQLQuery1.ExecSQL;
end;
SQLTransaction1.CommitRetaining;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Text:='select text from install';
SQLQuery1.Open;
SQLQuery1.First;
MyList2.clear; // пытался из базы получать список прог
while not SQLQuery1.Eof do
begin
MyList2.Add(SQLQuery1.FieldByName('text').AsString);
SQLQuery1.Next;
end;
SQLQuery1.Close;
//пробую удалить кавычки
MyList2.Text := StringReplace(MyList2.Text, '"', '', [rfReplaceAll, rfIgnoreCase]);
with MyList2.Create do
try
MyList2.StrictDelimiter := true;
s := '';
for i := 0 to MyList2.Count - 1 do if Trim(MyList2.Strings[i]) <> '' then
s := s + Format('%s(name LIKE "%s")', [IfThen(i = 0, '', ' OR '), MyList2.Strings[i]]);
s := 'SELECT * FROM program WHERE ' + s + ' ORDER BY id';
finally
// Free;
end;
// всё, в s хранится запрос, его и используй для получения данных из БД
// Showmessage(s);
MyList.Free;
SQLQuery1.Close;
SQLQuery1.Active:=false;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add(s);
SQLQuery1.Active:=true;
SQLQuery1.Open;
//заполняем заголовки колонок и меняем ширину колонок
DBGrid1.Columns[1].Title.Caption:='Название';
DBGrid1.Columns[2].Title.Caption:='Тип ПО';
DBGrid1.Columns[3].Title.Caption:='Лицензия';
DBGrid1.Columns[4].Title.Caption:='Стоимость';
DBGrid1.Columns[5].Title.Caption:='Замена';
DBGrid1.Columns[1].Width:= 200;
DBGrid1.Columns[2].Width:= 150;
DBGrid1.Columns[3].Width:= 110;
DBGrid1.Columns[4].Width:= 90;
DBGrid1.Columns[5].Width:= 150;
end;
Код работает, если кто нибудь захочет посмотреть, дам ссылку на исходный код.
У меня как раз и используется конструкция like ''%N%'. Трудно объяснить, проблема другая. Из DisplayName я получаю название программы уже с версией, и соответственно это уже не like '%ГИС%', а like '%2ГИС 3.16.3.0%'.