Здравствуйте уважаемые подписчики!
Ко мне пришло одно письмо с темой "малость не врубился".
Для полной ясности приведу весь текст:
задавал вопрос об использовании отдельных функций из DLL в своих проектах, ни ответа (ну да это понятно) ни вопроса?
Я прошу прощения у всех тех, кто не получает ответов и не видит своего вопроса в рассылке.
Я понимаю каждого из них. При получении вопросов я их просматриваю и выбираю в следующий раздел "Вопрос-ответ" в рассылку таким образом:
небольшая часть свежих, которые нужно срочно решить, остальные - те, которые уже давно ждут ответа.
На данный момент у меня базе 76 вопросов, которые я еще не давал в рассылку.
Я прошу своих подписчиков отнестить снисходительнее к запросам своих "соседей".
Да и помимо того мне не хотелось бы превращать свалку вопрос-ответов.
Уж лучше тогда рассылку назвать "Вопросы и ответы....".
Я этого умышленно не делаю, поскольку, я считаю, будет теряться смысл остальной части вопросов и ответов.
Вы не пытались съесть большой торт одним залпом?
Ну первые несколько раз у Вас это выйдет, но потом - будет очень хорошо, если только стошнит.
Точно также и с вопросами, и ответами.
Желаю хорошего дня и хорошего настроения.
Ведущий рассылки.
Быстрый поиск в базах данных
unit Finder;
interface
uses DB, DBTables, SysUtils;
function GrabMemoFieldAsPChar(TheField : TMemoField): PChar;
function DoFindIn(TheField : TField; SFor : String): Boolean;
function FindIt(TheTable : TDataSet; TheFields : array of integer;
SearchBackward : Boolean;
FromBeginning : Boolean; SFor : String): Boolean;
{применение функции FindIt - if FindIt(NotesSearchT,
[NotesSearchT.FieldByName('Leadman').Index],False, True,
SearchText.Text) then DoSomething; }implementation
function GrabMemoFieldAsPChar(TheField : TMemoField): PChar;
begin
with TBlobStream.Create(TheField, bmRead) do begin
GetMem(Result, Size + 1);
FillChar(Result^, Size + 1, #0);
Read(Result^, Size);
Free;
end;
end;
function DoFindIn(TheField : TField; SFor : String): Boolean;
var
PChForMemo : PChar;
begin
Result:=False;
case TheField.DataType of
ftString : begin
if (Pos(SFor, UpperCase(TheField.AsString)) > 0) then
Result := True;
end;
ftInteger: begin
if (Pos(SFor, TheField.AsString) > 0) then Result:=True;
end;
ftBoolean: begin
if SFor = UpperCase(TheField.AsString) then
Result := True;
end;
ftFloat : begin
if (Pos(SFor, TheField.AsString) > 0) then Result := True;
end;
ftCurrency:begin
if (Pos(SFor, TheField.AsString) > 0) then Result := True;
end;
ftDate..
ftDateTime:begin
if (Pos(SFor, TheField.AsString) > 0) then Result := True;
end;
ftMemo : begin
SFor[Ord(SFor[0])+1] := #0;
PChForMemo:=GrabMemoFieldAsPChar(TMemoField(TheField));
StrUpper(PChForMemo);
if not (StrPos(PChForMemo,@SFor[1])=nil) then Result:=True;
FreeMem(PChForMemo,StrLen(PChForMemo + 1));
end;
end;
end;
function FindIt(TheTable : TDataSet; TheFields : array of integer;
SearchBackward : Boolean;
FromBeginning : Boolean; SFor : String): Boolean;
var
i, HighTheFields, LowTheFields : integer;
BM : TBookmark;
begin
TheTable.DisableControls;
BM := TheTable.GetBookmark;
try
LowTheFields := Low(TheFields);
HighTheFields := High(TheFields);
SFor := UpperCase(SFor);
Result := False;
if FromBeginning then TheTable.First;
if SearchBackward then begin
TheTable.Prior;
while not TheTable.BOF do begin
for i := LowTheFields to HighTheFields do begin
if DoFindIn(TheTable.Fields[TheFields[i]],SFor) then begin
Result := True;
Break;
end;
end;
if Result then Break else TheTable.Prior;
end;
end else begin
TheTable.Next;
while not TheTable.EOF do begin
for i:=LowTheFields to HighTheFields do begin
if DoFindIn(TheTable.Fields[TheFields[i]],SFor) then begin
Result:=True;
Break;
end;
end;
if Result then Break else TheTable.Next;
end;
end;
finally
TheTable.EnableControls;
if not Result then TheTable.GotoBookmark(BM);
TheTable.FreeBookmark(BM);
end;
end;
end.