<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3702256</guid>
        <pubDate>Mon, 16 Jan 2017 08:14:50 +0000</pubDate>
        <title>ComboBox с фильтром</title>
        <link>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3702256</link>
        <description><![CDATA[СергА: да, я понял ваши замечания<br>keyDown и keyUp появились в результате написания кода (поначалу решил, что пригодятся), потом оптимизировал код и не заметил, что их можно просто удалить]]></description>
        <author>СергА</author>
        <category>Delphi: Разработка компонентов</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3702207</guid>
        <pubDate>Mon, 16 Jan 2017 05:00:45 +0000</pubDate>
        <title>ComboBox с фильтром</title>
        <link>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3702207</link>
        <description><![CDATA[DimaBr: После ввода трёх букв АВА, остаётся пустое поле выпадающего списка<br>
<img class='tag-img' src='http://image.prntscr.com/image/f2c6c330d4a646a287780c3ce076a675.gif' alt='user posted image'><br>
<br>
Что делают эти методы ?<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TFiltrCombobox.KeyDown(var Key: Word; Shift: TShiftState);</div><div class="code_line">begin</div><div class="code_line">&nbsp;inherited KeyDown(Key, Shift);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TFiltrCombobox.KeyUp(var Key: Word; Shift: TShiftState);</div><div class="code_line">begin</div><div class="code_line">&nbsp;inherited KeyUp(Key, Shift);</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>DimaBr</author>
        <category>Delphi: Разработка компонентов</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701829</guid>
        <pubDate>Fri, 13 Jan 2017 09:54:21 +0000</pubDate>
        <title>ComboBox с фильтром</title>
        <link>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701829</link>
        <description><![CDATA[СергА: к leo<br>у нас некоторые пользователи запоминают не начальную часть, а середину, поэтому решил сделать так<br>к DimaBr<br>про Self понятно, просто иногда удобно им пользоваться чтобы не вспоминать или не набирать полностью названия полей.<br>по 2-му спасибо за подсказку<br>по остальным пунктам - не заметил ( тоже спасибо :) )]]></description>
        <author>СергА</author>
        <category>Delphi: Разработка компонентов</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701788</guid>
        <pubDate>Fri, 13 Jan 2017 05:22:41 +0000</pubDate>
        <title>ComboBox с фильтром</title>
        <link>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701788</link>
        <description><![CDATA[DimaBr: Замечания.<br>1. Использование self в коде лишнее<br>2. Взаимодействие с фильтром нужно через property Filter<br>3. Методы KeyDown, KeyUp лишние<br>4. При открытом списке вводим первые буквы и видим как список значений уменьшается, а размер выпадающего списка нет]]></description>
        <author>DimaBr</author>
        <category>Delphi: Разработка компонентов</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701665</guid>
        <pubDate>Thu, 12 Jan 2017 07:51:41 +0000</pubDate>
        <title>ComboBox с фильтром</title>
        <link>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701665</link>
        <description><![CDATA[leo: Для поиска строки по первым символам есть стандартное средство: Sorted + AutoComplete + AutoDropDown.<br>А поиск по любому вхождению - это уже экзотика, для которой логичнее добавить к комбобоксу специальную кнопочку для вызова диалога расширенного поиска строки (с опциями и наворотами насколько хватит фантазии и терпения&#092;трудолюбия :) )]]></description>
        <author>leo</author>
        <category>Delphi: Разработка компонентов</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701519</guid>
        <pubDate>Wed, 11 Jan 2017 13:01:11 +0000</pubDate>
        <title>ComboBox с фильтром</title>
        <link>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701519</link>
        <description><![CDATA[Fr0sT: Корявенько, в образцы кода не взял бы. Но принципиально по-другому и не сделаешь - контрол довольно дурацкий]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Разработка компонентов</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701503</guid>
        <pubDate>Wed, 11 Jan 2017 11:52:02 +0000</pubDate>
        <title>ComboBox с фильтром</title>
        <link>https://forum.sources.ru/index.php?showtopic=410172&amp;view=findpost&amp;p=3701503</link>
        <description><![CDATA[СергА: Иногда в выпадающем списке содержится большое количество элементов, в этом случае, для удобства выбора пользователю удобно набрать пару-тройку букв и выбрать из уже небольшого списка подходящих элементов. Идея вобщем не нова и давно уже многими реализована, пост создаю для начинающих программистов, чтобы показать как можно использовать готовые классы и дополнять их новыми возможностями. Заодно готов выслушать критику от опытных программистов.<br>
<br>
Код Combobox&#39;а с фильтром:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit uFiltrComboBox;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">uses Winapi.Windows, Winapi.Messages, Vcl.Controls, System.Classes, Vcl.StdCtrls;</div><div class="code_line">const alphUp=&#39;ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;alphDn=&#39;abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя&#39;;</div><div class="code_line">type</div><div class="code_line">TFiltrCombobox=class(TCustomComboBox)</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; AllList:TStringList;</div><div class="code_line">&nbsp;&nbsp; Filtr:string;</div><div class="code_line">&nbsp;&nbsp; function meUpCase(s:string):string;</div><div class="code_line">&nbsp;&nbsp; procedure upDateList;</div><div class="code_line">&nbsp;&nbsp;protected</div><div class="code_line">&nbsp;&nbsp; procedure KeyDown(var Key: Word; Shift: TShiftState); override;</div><div class="code_line">&nbsp;&nbsp; procedure KeyPress(var Key: Char); override;</div><div class="code_line">&nbsp;&nbsp; procedure KeyUp(var Key: Word; Shift: TShiftState); override;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; constructor Create(AOwner: TComponent); override;</div><div class="code_line">&nbsp;&nbsp; destructor Destroy; &nbsp; override;</div><div class="code_line">&nbsp;&nbsp; procedure setFiltr(filtr:string);</div><div class="code_line">&nbsp;&nbsp; function getFiltr:string;</div><div class="code_line">&nbsp;&nbsp; procedure addToAllList(s:string);</div><div class="code_line">&nbsp;&nbsp; procedure clearAllList;</div><div class="code_line">end;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TFiltrCombobox.Create(AOwner: TComponent);</div><div class="code_line">//var f:textfile;</div><div class="code_line">begin</div><div class="code_line">&nbsp;inherited create(AOwner);</div><div class="code_line">&nbsp;AllList:=TStringList.Create;</div><div class="code_line">&nbsp;self.Filtr:=&#39;&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">{ assignfile(f,&#39;debug.txt&#39;);</div><div class="code_line">&nbsp;rewrite(f);</div><div class="code_line">&nbsp;closefile(f);</div><div class="code_line">}</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TFiltrCombobox.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;AllList.Clear;</div><div class="code_line">&nbsp;AllList.Destroy;</div><div class="code_line">&nbsp;inherited Destroy;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TFiltrCombobox.getFiltr:string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;result:=self.Filtr;</div><div class="code_line">end;</div><div class="code_line">procedure TFiltrCombobox.clearAllList;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;self.AllList.Clear;</div><div class="code_line">&nbsp;&nbsp;self.upDateList;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TFiltrCombobox.addToAllList(s:string);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;self.AllList.Add(s);</div><div class="code_line">&nbsp;&nbsp;self.upDateList;</div><div class="code_line">end;</div><div class="code_line">procedure TFiltrCombobox.KeyDown(var Key: Word; Shift: TShiftState);</div><div class="code_line">begin</div><div class="code_line">&nbsp;inherited KeyDown(Key, Shift);</div><div class="code_line">end;</div><div class="code_line">procedure TFiltrCombobox.KeyUp(var Key: Word; Shift: TShiftState);</div><div class="code_line">begin</div><div class="code_line">&nbsp;inherited KeyUp(Key, Shift);</div><div class="code_line">end;</div><div class="code_line">procedure TFiltrCombobox.KeyPress(var Key: Char);</div><div class="code_line">var s:string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;_text:string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;_selStart,_selLength:integer;</div><div class="code_line">&nbsp;{ &nbsp; f:textfile;</div><div class="code_line">&nbsp;&nbsp; &nbsp;texttofile:string;}</div><div class="code_line">begin</div><div class="code_line">&nbsp;inherited KeyPress(Key);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;_text:=Text; _selStart:=selStart; _selLength:=selLength;</div><div class="code_line">&nbsp;s:=self.Text;</div><div class="code_line">&nbsp;if key=#0 then begin // если нажатие кнопки обработали, то ...</div><div class="code_line">&nbsp;&nbsp;if selLength&#62;0 then delete(s,SelStart+1,selLength);</div><div class="code_line">&nbsp;end</div><div class="code_line">&nbsp;else begin // если нажатие кнопки не обработали, то ...</div><div class="code_line">&nbsp;&nbsp;insert(key,s,SelStart+1);</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ assignfile(f,&#39;debug.txt&#39;);</div><div class="code_line">&nbsp;append(f);</div><div class="code_line">&nbsp;texttofile:=&#39; &quot;&#39;+text+&#39;&quot;&#39;;</div><div class="code_line">&nbsp;writeln(f,&#39;#&#39;,ord(key),texttofile:50,(SelStart+1):10,selLength:10,&#39;&quot;&#39;,s,&#39;&quot;&#39;);</div><div class="code_line">&nbsp;closefile(f);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;self.setFiltr(s);</div><div class="code_line">&nbsp;Perform(CB_SHOWDROPDOWN, 1, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Text:=_text; selStart:=_selStart; selLength:=_selLength;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TFiltrCombobox.setFiltr(filtr:string);</div><div class="code_line">begin</div><div class="code_line">&nbsp;self.Filtr:=meUpCase(filtr);</div><div class="code_line">&nbsp;self.upDateList;</div><div class="code_line">end;</div><div class="code_line">function TFiltrCombobox.meUpCase(s:string):string;</div><div class="code_line">var i,l,ipos:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;l:=length(s);</div><div class="code_line">&nbsp;for i := 1 to l do begin</div><div class="code_line">&nbsp;&nbsp; ipos:=pos(s[i],alphDn);</div><div class="code_line">&nbsp;&nbsp; if ipos&#60;&#62;0 then s[i]:=alphUp[ipos];</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;Result:=s;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TFiltrCombobox.upDateList;</div><div class="code_line">var s2,s,filtrUP:string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;b:boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;b:=(filtr&#60;&#62;&#39;&#39;);</div><div class="code_line">&nbsp;if b then filtrUP:=meUpCase(filtr);</div><div class="code_line">&nbsp;Items.Clear;</div><div class="code_line">&nbsp;for I := 0 to AllList.Count-1 do begin</div><div class="code_line">&nbsp;&nbsp;s:=AllList.Strings[i];</div><div class="code_line">&nbsp;&nbsp;if b then begin</div><div class="code_line">&nbsp;&nbsp; s2:=meUpCase(s);</div><div class="code_line">&nbsp;&nbsp; if (pos(filtrUP,s2)&#60;&#62;0) then Items.Add(s);</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else Items.Add(s);</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Здесь в комментариях оставил код для отладки процесса фильтрации<br>
<br>
Код основного модуля, как его подключать:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit Unit1;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,</div><div class="code_line">&nbsp;&nbsp;Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,uFiltrComboBox;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TForm1 = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormCreate(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Private declarations }</div><div class="code_line">&nbsp;&nbsp; &nbsp;FiltrBox:TFiltrComboBox;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Public declarations }</div><div class="code_line">&nbsp;&nbsp; procedure FillFiltrBox;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Form1: TForm1;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FillFiltrBox;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FiltrBox.addToAllList(&#39;Абакумов&#39;);</div><div class="code_line">&nbsp;&nbsp;FiltrBox.addToAllList(&#39;Авакин&#39;);</div><div class="code_line">&nbsp;&nbsp;FiltrBox.addToAllList(&#39;Авриков&#39;);</div><div class="code_line">&nbsp;&nbsp;FiltrBox.addToAllList(&#39;Авакян&#39;);</div><div class="code_line">&nbsp;&nbsp;FiltrBox.addToAllList(&#39;Чебышев&#39;);</div><div class="code_line">&nbsp;&nbsp;FiltrBox.addToAllList(&#39;Реж&#39;);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;FiltrBox:=TFiltrComboBox.Create(Form1);</div><div class="code_line">&nbsp;FiltrBox.SetBounds(50,50,200,20);</div><div class="code_line">&nbsp;self.InsertControl(FiltrBox);</div><div class="code_line">&nbsp;FillFiltrBox;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div>]]></description>
        <author>СергА</author>
        <category>Delphi: Разработка компонентов</category>
      </item>
	
      </channel>
      </rss>
	