Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

ShellExecute Windows' Find In Files

Posted on 2000-03-14
11
508 Views
Last Modified: 2008-02-20
Howdy

I want to know how to ShellExecute a Windows "Find In Files" dialog, optionally loading it with all it's constituent goodies along the way (i.e. 'file types', 'date created', 'containing keywords' from the advanced tab, etc.).

Lucky for you, I don't need to access the results! I just need to set it up for my users.

Fond Regards,
Edo
0
Comment
Question by:Edo082297
11 Comments
 
LVL 17

Accepted Solution

by:
inthe earned 100 total points
ID: 2616910
hi,
i did this once for another question.its a bit rusty but gives you the idea:

Procedure DoFind(FName,FText,FDir:String; FCheck:boolean);
var
h,cbh,wh,wh1,wh2,wh3,wh4:hwnd;
begin   {get a instance of find or start one}
wh := 0;
wh:= FindWindow('#32770','Find: All Files');
if wh = 0 then shellexecute(application.handle,'find','','','',sw_normal);
repeat
 wh:= FindWindow('#32770',nil);
 wh1:=getwindow(wh,GW_CHILD);
 cbh:=FindWindowex(h,0,nil,'Include &subfolders');{checkbox}
 wh2:=FindWindowex(wh1,0,'ComboboxEx32',nil);
 wh3:=FindWindowex(wh2,0,'Combobox',nil);
 wh4:=FindWindowex(wh3,0,'Edit',nil);
 Application.ProcessMessages;
 until wh4 <> 0;
{start fname}
h:= FindWindow('#32770',nil);
h:=getwindow(h,GW_CHILD);
h:=FindWindowex(h,0,'Combobox',nil);
h:=FindWindowex(h,0,'Edit',nil);
if h<>0 then SendMessage(h,WM_SETTEXT,0,Integer(FName))
        else showmessage('Error writing File name!');
       { end fname} {start FText}
h:= FindWindow('#32770',nil);
h:=getwindow(h,GW_CHILD);
h:=FindWindowex(h,0,'Edit',nil);
if h<>0 then SendMessage(h,WM_SETTEXT,0,Integer(FText))
        else showmessage('Error writing Containing Text!');
        {end ftext} {start FDir}
h:= FindWindow('#32770',nil);
h:=getwindow(h,GW_CHILD);
h:=FindWindowex(h,0,'ComboboxEx32',nil);
h:=FindWindowex(h,0,'Combobox',nil);
SendMessage(h,WM_COMMAND,CBN_SELCHANGE,0);
h:=FindWindowex(h,0,'Edit',nil);
if h<>0 then begin
SendMessage(h,WM_RBUTTONDOWN,0,0);
 SendMessage(h,WM_KEYDOWN,0,0);
 SendMessage(h,WM_SETTEXT,0,Integer(FDir));
SendMessage(h,WM_KEYUP,0,0);
SendMessage(h,WM_RBUTTONUP,0,0);
end
  else showmessage('Error writing File name!');
  {end fdir}  {start FCheck}
  h:= FindWindow('#32770',nil);
h:=getwindow(h,GW_CHILD);
h:=FindWindowex(h,0,nil,'Include &subfolders');
if FCheck = TRUE  then
 SendMessage(h,BM_SETCHECK,BST_CHECKED,0)
else
 SendMessage(h,BM_SETCHECK,BST_UNCHECKED,0);
 {end fcheck} {start click find}
 h:= FindWindow('#32770',nil);
h:=FindWindowex(h,0,nil,'F&ind Now');
if h<>0 then begin
SendMessage(h,WM_LBUTTONDOWN,0,0);
SendMessage(h,WM_LBUTTONUP,0,0);
end
 else showmessage('Error Doing Find!');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DoFind('*.pas','Procedure','E',True);
end;

ps
not sure how well that work on different language than english pc's.
0
 
LVL 17

Expert Comment

by:inthe
ID: 2616926
this one is a bit better:
(fdir dont work though i spent ages on this before with no success so hope someone else has an idea.

Procedure DoFind(FName,FText,FDir:String; FCheck:boolean);
var
h,Eh,Eh2,cbh,Ih,Bh,wh,wh1,wh2,wh3,wh4:hwnd;
begin   {get a instance of find or start one}
wh:= FindWindow('#32770','Find: All Files');
if wh = 0 then shellexecute(application.handle,'find','','','',sw_normal);
repeat   {tests to get some time mainly and check if window exists}
 wh:= FindWindow('#32770',nil);
 wh1:=getwindow(wh,GW_CHILD);
 cbh:=FindWindowex(h,0,'Button',nil);{checkbox Include &subfolders}
 wh2:=FindWindowex(wh1,0,'ComboboxEx32',nil);
 wh3:=FindWindowex(wh2,0,'Combobox',nil);
 wh4:=FindWindowex(wh3,0,'Edit',nil);
 Application.ProcessMessages;
 until wh4 <> 0;
h:= FindWindow('#32770',nil);
Wh1:=getwindow(h,GW_CHILD);
CBh:=FindWindowex(Wh1,0,'Combobox',nil);
Eh:=FindWindowex(CBh,0,'Edit',nil);
if Eh<>0 then SendMessage(Eh,WM_SETTEXT,0,Integer(FName))
        else showmessage('Error writing File name!');
Eh2:=FindWindowex(Wh1,0,'Edit',nil);
if Eh2<>0 then SendMessage(Eh2,WM_SETTEXT,0,Integer(FText))
        else showmessage('Error writing Containing Text!');
Wh2:=FindWindowex(Wh1,0,'ComboboxEx32',nil);
Wh3:=FindWindowex(Wh2,0,'Combobox',nil);

      SendMessage(Wh3,WM_RBUTTONDOWN,0,0);
       SendMessage(Wh3,WM_KEYDOWN,0,0);
       SendMessage(Wh3,WM_COMMAND,CBN_SELCHANGE,0);
Wh4:=FindWindowex(Wh3,0,'Edit',nil);
if Wh4<>0 then begin
 SendMessage(Wh4,WM_SETTEXT,0,Integer(FDir));
         SendMessage(Wh4,WM_KEYUP,0,0);
       SendMessage(Wh4,WM_RBUTTONUP,0,0);
        end
  else showmessage('Error writing File name!');
Ih:=FindWindowex(Wh1,0,'Button',nil);  //Include &subfolders
if FCheck = TRUE  then
 SendMessage(Ih,BM_SETCHECK,BST_CHECKED,0)
else
 SendMessage(Ih,BM_SETCHECK,BST_UNCHECKED,0);
Bh:=FindWindowex(Wh,0,'Button',nil);   //F&ind Now
if Bh<>0 then begin
SendMessage(Bh,WM_LBUTTONDOWN,0,0);
SendMessage(Bh,WM_LBUTTONUP,0,0);
end
 else showmessage('Error Doing Find!');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DoFind('*.pas','Procedure','E',True);
end;
0
 
LVL 2

Expert Comment

by:hubdog
ID: 2617850
unit FindDialogs;

{**********************************************************}
{                                                          }
{  TFindFilesDialog & TFindComputerDialog Unit             }
{  Copyright ?999 Workshell Software.                     }
{                                             }
{  Version 1.0                                       }
{                                                          }
{                                                          }
{  Web      -> http://www.workshell.uni.cc/                }
{  E - Mail -> finddlgs@kinsella.u-net.com                 }
{                                                          }
{**********************************************************}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ShlObj;

type
  TFindFilesDialog = class(TComponent)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    function Execute: Boolean;
    function ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
  published
    { Published declarations }
  end;

type
  TFindComputerDialog = class(TComponent)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    function Execute: Boolean;
    function ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
  published
    { Published declarations }
  end;

procedure Register;

implementation

function SHFindFiles(pidlRoot: PItemIDList; pidlSavedSearch: PItemIDList): Boolean;
 stdcall; external 'Shell32.dll' index 90;

function SHFindComputer(pidlRoot: PItemIDList; pidlSavedSearch: PItemIDList): Boolean;
 stdcall; external 'Shell32.dll' index 91;

function TFindFilesDialog.Execute: Boolean;
begin
Result := SHFindFiles(nil,nil);
end;

function TFindFilesDialog.ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
begin
Result := SHFindFiles(pidlRoot,pidlSavedSearch);
end;

function TFindComputerDialog.Execute: Boolean;
begin
Result := SHFindComputer(nil,nil);
end;

function TFindComputerDialog.ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
begin
Result := SHFindComputer(pidlRoot,pidlSavedSearch);
end;

procedure Register;
begin
  RegisterComponents('Dialogs', [TFindFilesDialog,TFindComputerDialog]);
end;

end.

good luck
hubdog
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 2

Expert Comment

by:hubdog
ID: 2617861
unit FindDialogs;

{**********************************************************}
{                                                          }
{  TFindFilesDialog & TFindComputerDialog Unit             }
{  Copyright ?999 Workshell Software.                     }
{                                             }
{  Version 1.0                                       }
{                                                          }
{                                                          }
{  Web      -> http://www.workshell.uni.cc/                }
{  E - Mail -> finddlgs@kinsella.u-net.com                 }
{                                                          }
{**********************************************************}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ShlObj;

type
  TFindFilesDialog = class(TComponent)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    function Execute: Boolean;
    function ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
  published
    { Published declarations }
  end;

type
  TFindComputerDialog = class(TComponent)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    function Execute: Boolean;
    function ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
  published
    { Published declarations }
  end;

procedure Register;

implementation

function SHFindFiles(pidlRoot: PItemIDList; pidlSavedSearch: PItemIDList): Boolean;
 stdcall; external 'Shell32.dll' index 90;

function SHFindComputer(pidlRoot: PItemIDList; pidlSavedSearch: PItemIDList): Boolean;
 stdcall; external 'Shell32.dll' index 91;

function TFindFilesDialog.Execute: Boolean;
begin
Result := SHFindFiles(nil,nil);
end;

function TFindFilesDialog.ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
begin
Result := SHFindFiles(pidlRoot,pidlSavedSearch);
end;

function TFindComputerDialog.Execute: Boolean;
begin
Result := SHFindComputer(nil,nil);
end;

function TFindComputerDialog.ExecuteEx(pidlRoot, pidlSavedSearch: PItemIDList): Boolean;
begin
Result := SHFindComputer(pidlRoot,pidlSavedSearch);
end;

procedure Register;
begin
  RegisterComponents('Dialogs', [TFindFilesDialog,TFindComputerDialog]);
end;

end.

good luck
hubdog
0
 
LVL 2

Expert Comment

by:hubdog
ID: 2617862
I think that is what you need .
0
 
LVL 12

Expert Comment

by:rwilson032697
ID: 2617938
Listening
0
 
LVL 17

Expert Comment

by:inthe
ID: 2617939
doesnt that component just do same as this:
shellexecute(handle,'find','','','',sw_normal);

how to load all the "filename", "text to find" etc with this component?
0
 
LVL 2

Expert Comment

by:hubdog
ID: 2618417
sorry,I find I am stupid.
I didn't read the question carefully.

hubdog
0
 
LVL 1

Author Comment

by:Edo082297
ID: 2644126
Hey Inthe

The code doesn't really work -- it gets stuck ad infinitum in the repeat...until loop. It also doesn't write to the windows. I will play around with it and see if I can get it to work. There were also compilation hints (unnecessary variables declared).

I'm afraid I have to score this as average; it's not up to your usually very high standards (we worked on the math parser a couple of years ago, remember?).

Fond Regards, buddy.

Edo

PS I would have rejected this answer and posted this as a comment but EE seems to have changed their policy in this regard...
0
 
LVL 17

Expert Comment

by:inthe
ID: 2645542
i know im sorry its pretty buggy ;~(

you should have been able to just reject it ..

maybe it is possible to execute a saved find ..
(do a find then do "file" - "save search" on the menu..
0
 
LVL 2

Expert Comment

by:hubdog
ID: 2646906
hi,friends
  I guess the better method of setuping the options of search file dialog maybe uses interface ISearchCommandExt imported from microsoft shell controls and automation type library.But when I use cosearchcommand.create to get the interface,there is a error message "class not registered".:(
  I don't know how to make it work.But maybe someone can do it .

good luck
hubdog
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question