プログラミング学習でファイル検索ソフトを目標で作っています。
それでファイル検索するとき、エクスプローラの検索機能のようにスペースで離した複数条件でファイル検索をしようと色々やってみてるのですがうまくいきません。
Delphi等プログラム初心者なので、アドバイスよろしくお願いします。
単数ならできるんですね?
それを複数回繰り返せばいいんでは?
単数の条件検索はできていると思います。
でも、Edit内でスペースで離した任意の数で分割する方法と、分割した数の繰り返しの仕方かよくわかりません。
もう少しアドバイスお願いします
僕もあまり詳しくないのですが、
TEditの内容を文字列として処理して、空白を処理するといけると思います。
文字列処理関数を調べて見てください。
「スペースで離した任意の数で分割」は、以下のようなコードでできますよ。
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.CommaText := 'aaa bbb ccc';
showmessage(sl[0]);
showmessage(sl[1]);
showmessage(sl[2]);
finally
sl.Free;
end;
end;
こあさん、deldelさん参考になりました。
別の方法でコードを作っていましたが、連続したスペースの処理などうまくいきませんでしたし結構長いコードになっていたので、大変参考になりました。
それともう一つ、検索を複数回繰り返して条件を満たすやり方のアドバイスももう少しお願いします。
TStringList の LoadFromFile でファイルを読み込み、
上記のコードの例ですと、
if (Pos(sl[0], リスト.Text) <> 0) and
(Pos(sl[1], リスト.Text) <> 0) and
(Pos(sl[2], リスト.Text) <> 0) then
全部ある!!
という感じでできませんかねぇ?(試してませんが・・・)
まるごと貼っちゃいますが、こういうことでいいのかな。
もしかしてテキストファイル内の文字列検索?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure TntFormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure TntFormDestroy(Sender: TObject);
private
{ Private 宣言 }
FMaskList: TStringList;
function Match(const FileName: String): Boolean;
procedure Find(const S: String);
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
Masks, FileCtrl;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FMaskList := TStringList.Create;
FMaskList.CommaText := '*.pas *.dfm';
end;
function TForm1.Match(const FileName: String): Boolean;
var
I: Integer;
begin
for I := 0 to FMaskList.Count - 1 do
if MatchesMask(FileName, FMaskList[I]) then
begin
Result := True;
Exit;
end;
Result := False;
end;
procedure TForm1.Find(const S: String);
var
SR: TSearchRec;
begin
if FindFirst(S + '\*.*', faAnyFile, SR) = 0 then
begin
repeat
if (SR.Name <> '.') and (SR.Name <> '..') then
if (SR.Attr and faDirectory) <> 0 then
Find(S + '\' + SR.Name)
else if Match(S + '\' + SR.Name) then
Memo1.Lines.Add(S + '\' + SR.Name);
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
begin
if SelectDirectory('フォルダの選択', '', S) then
begin
if IsDelimiter('\', S, Length(S)) then
SetLength(S, Length(S) - 1);
Find(S);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FMaskList.Free;
end;
end.
deldelさん、ありがとうございます。
教えていただいたコードを組み込むことで条件通りのファイルを表示させることができました。
TStringListに保存された数にあわせて
(Pos(sl[0], リスト.Text) <> 0) and
の部分を増やしていくとなるとなると、どういうコードにすればいいですか?
風来坊さん、ありがとうございます。
やりたかったことは、風来坊さんが書いていただいた様な事です。
大変参考になりました。
教えていただいたやり方を参考に、色々試して学んでいきます。
解決しているところ、恐縮なのですが
http://delfusa.main.jp/delfusalibrary/20060527212010/WordDecompose/WordDecompose.pas
WordCountとか、WordGetとか、Split関数を
使ってみてくれると、文字列分解が楽かと思います。
ツイート | ![]() |