Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.0.6Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

 for col:= 1 to M.Columns do BEGIN

  for row:= 1 to M.Rows do write(M[row, col]:5:1);

  writeln;

 END;

 M.Free;

END.

Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ db-Ρ„Π°ΠΉΠ»Π° Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния

uses DB, DBTables, StdCtrls;

procedure TForm1.Button1Click(Sender: TObject);

var

 tSource, TDest: TTable;

begin

 TSource:= TTable.create(self);

 with tsTSource do begin

  DatabaseName:= 'dbdemos';

  TableName:= 'customer.db';

  open;

 end;

 TDest:= TTable.create(self);

 with TDest do begin

  DatabaseName:= 'dbdemos';

  TableName:= 'MyNewTbl.db';

  FieldDefs.Assign(TSource.FieldDefs);

  IndexDefs.Assign(TSource.IndexDefs);

  CreateTable;

 end;

 TSource.close;

end;

Доступ

ΠžΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ доступ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ

Данная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ BDE Π²Π½Π°Ρ‡Π°Π»Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ Π½Π°Ρ‡Π½Π΅Ρ‚ с Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ появляСтся информация ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΎΠ½Π° ΠΊΡΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²ΠΎ врСмя всСго сСанса (ΠΏΠΎΠΊΠ° TDatabase.Connection ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True) происходит практичСски ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡΡˆΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запускС прилоТСния, Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ BDE Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ псСвдоним ΠΈ установитС BDE CACHE = TRUE ΠΈ BDE CACHE DIR = 'C:\temp' ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•:

ΠŸΡ€ΠΈ любом ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ структуры Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π’Π°ΠΌ придСтся ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ кэш Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Имя Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится кэш, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ, посмотрСв Π² любом тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Ρ„Π°ΠΉΠ» SCache.INI.

Поиск

Поиск Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅

Каким способом ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ поиск подходящих Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π²ΠΎΠ΄Π°? Π’Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ курсор (Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ) Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящСму Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… символов Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹.

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ΄ писался ΠΏΠΎΠ΄ Delphi 1. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½ΠΎ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Для поиска Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ†Π° дСрТится ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ. ИндСкс Π΄ΠΎΠ»ΠΆΠ΅Π½, СстСствСнно, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ полю, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ элСмСнтом управлСния EditBox. Π’ случаС измСнСния содСрТимого EditBox, Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ FindNearest Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ TTable. ВозвращаСмая Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° снова присваиваСтся свойcΡ‚Π²Ρƒ Text элСмСнта EditBox.

Π― ΠΏΡ€ΠΈΠ²Π΅Π» лишь ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ. ЀактичСски Π²ΠΎ врСмя измСнСния значСния я Π²ΠΊΠ»ΡŽΡ‡Π°Π» Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ 1/3 сСкунды ΠΈ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnTimer ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ» ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ поиска (с Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°). Π­Ρ‚ΠΎ позволяло ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ Π±Π΅Π· Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ тСкст Π±Π΅Π· нСобходимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ поиск Π² расчСтС Π½Π° вновь Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ символ (поиск проводился Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² 1/3 сСкунды).

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ наТатия клавиши backspace ΠΈΠ»ΠΈ добавлСния символа Π² любоС мСсто строки.

ВмСсто возвращСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² элСмСнту EditBox (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСзаписываСт Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ элСмСнту управлСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ ListBox. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ нСсколько Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρ‚Π°ΠΊ:

procedure Edit1OnChange(…);

var i:integer;

begin

 if not updating then exit; {сдСлайтС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅Ρ‰Π΅ – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ срабатывании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°}

 updating:= false;

 Table1.FindNearest([Edit1.text]);

 ListBox1.clear;

 i:= 0;

 while (i < 5) and (not (table1.eof)) do begin

  listbox.items.add(Table1.fields[0].asString);

  inc(i);

  table1.next;

 end;

 listbox1.itemindex:= 0;

end;

Быстрый поиск Π² Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Π― ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ Π½Π° Π’Π°Ρˆ суд ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ быстрого поиска ΠΏΠΎ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Данная тСхнология ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ поиск ΠΏΠΎ полям, прСобразуя ΠΈΡ… значСния Π² строки (всС значСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ числа). Π”Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ самым быстрым, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π° ΠΏΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΎΠ½ΠΎ оказываСтся быстрСС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… мною Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ (ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ²Π΅Π·Π΅Ρ‚ большС). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ поля Ρ€Π°Π²Π½ΠΎ 4.509375354, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поиска Ρ€Π°Π²Π½ΠΎ 7, Π² этом случаС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° засчитаСт "ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅". Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΡƒΠ΄ΠΎΠ±Π½Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ поиск Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΠ»Π΅. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли Ρƒ Вас ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π΄Π²Π° поля с адрСсами. Π­Ρ‚ΠΎ моя пСрвая "ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ" Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠ΅, с Ρ‡Π΅ΠΌ я столкнулся, изучая Delphi, стала Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ поиска Π² любоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π΅ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. А Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ поиск – Π²Π΅Ρ‰ΡŒ Ρ‚ΠΎΠΆΠ΅ сугубо спСцифичСская, ΠΊΠ°ΠΊ ΠΈ любоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠ±ΠΎΡ€ΠΎΡ‚ΡŒ свой страх ΠΏΠ΅Ρ€Π΅Π΄ "ΠΊΡ€ΡƒΡ‚Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ" ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой поисковый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΠ²ΡˆΠΈΠΉ мСня (ΠΈ, надСюсь, Π΄Ρ€ΡƒΠ³ΠΈΡ…) своСй ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ "ΠΌΡƒΠ»ΡŒΡ‚ΠΈ"-поиска ΠΏΠΎ нСскольким полям. Π― надСюсь, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π΅ΠΌ программистам, ΠΊΡ‚ΠΎ часто сталкиваСтся с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ. ВСхнология довольно Π»Π΅Π³ΠΊΠ° для понимания, Π½ΠΎ Ссли Ρƒ Вас Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ вопросы, ΠΏΠΎΡˆΠ»ΠΈΡ‚Π΅ ΠΌΠ½Π΅ письмо элСктронной ΠΏΠΎΡ‡Ρ‚ΠΎΠΉ, я Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ Π’Π°ΠΌ ΠΏΠΎΠΌΠΎΡ‡ΡŒ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Π² ΠΊΠΎΠ΄, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»Π΅ΠΉ (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π½Π΅ составит ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ). Если ΠΊΡ‚ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, поТалуйста, ΠΏΠΎΡˆΠ»ΠΈΡ‚Π΅ это ΠΌΠ½Π΅, я Π±ΡƒΠ΄Ρƒ вСсьма Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½. Бпасибо.

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 SearchBackwardthen 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.

ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ†ΠΈΡ

Π₯ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒ OnCalcFields

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ OncalcFields гСнСрится ΠžΠ§Π•ΠΠ¬ часто ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ большоС количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° с Π½Π΅ΠΊΠΈΠΌ вычисляСмым ΠΏΠΎΠ»Π΅ΠΌ, ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ вызываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄: