Текущий архив: 2003.02.06;
Скачать: CL | DM;
Внизфокус Найти похожие ветки
← →
den_dnepr (2003-01-29 11:09) [0]я создал свой компонент....(текст в коде где глючит я выделил)
unit ListSearch;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,ExtCtrls, DBTables;
var
SearchQ: Tquery;
SearchLB:TListBox;
type
TListSearch = class(TEdit)
private
{ Private declarations }
FTableName,FKeyField,FResultField, FDatabaseName, FFilter: String;
FFiltered: Boolean;
FResult: Integer;
procedure Change; override;
procedure KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure OnKeyDownLB(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ShowListBox;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
constructor Create(aowner:Tcomponent);override; //Конструктор
// имя базы данных
property T_DatabaseName: String read FDatabaseName write FDatabaseName;
property T_TableName: String read FTableName write FTableName;
property T_KeyField: String read FKeyField write FKeyField;
property T_ResultField: String read FResultField write FResultField;
property T_Filter: String read FFilter write FFilter;
property T_Filtered: Boolean read FFiltered write FFiltered;
function ShowResult: integer;
// property DataA:String read FDataB write FDataB;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Samples", [TListSearch]);
end;
constructor TListSearch.Create(aowner:Tcomponent);
begin
inherited create(aowner);
// создаем query
SearchQ:=TQuery.Create(self);
// создаем ListBox и устанавливаем его параметры
SearchLB:=TListBox.Create(self);
SearchLB.Parent:=aowner as tform;
SearchLB.MultiSelect:=true;
SearchLB.OnKeyDown:=OnKeyDownLB;
SearchLB.visible:=false;
// задаем обработчик события onKeyDown для елемента TEdit
onKeyDown:=KeyDown;
end;
function TListSearch.ShowResult;
begin
result:= searchq.fieldbyname(FResultField).asinteger
end;
// отображает ListBox под эелеинтом TEdit
procedure TListSearch.ShowListBox;
begin
SearchLB.Top:=top+ height;
SearchLB.Left:=left;
SearchLB.Width:=width;
SearchLB.Visible:=true;
end;
// обработка события Change для Edit
procedure TListSearch.Change;
var i: integer;
begin
if FDatabaseName="" then exit;
SearchQ.DatabaseName:=FDatabaseName;
ShowListBox;
SearchQ.Filtered:=FFiltered;
SearchQ.Filter:=FFilter;
searchQ.close;
searchQ.sql.clear;
searchQ.sql.add("select "+FKeyField +","+FResultField +" from "+FTableName+" where "+FKeyField+" LIKE ""+trim(Text)+"%"");
searchQ.open;
searchQ.First;
// заполняем список листбокса выбранными значениями с кваери
SearchLB.Items.Clear;
for i:=1 to searchq.RecordCount do
begin
SearchLB.Items.Add(searchq.fieldbyname(FKeyField).asstring);
searchQ.Next;
end;
// выделяем первую строку в лист боксе
if SearchLB.Items.Count>0 then SearchLB.Selected[0]:=true;
end;
procedure TListSearch.KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// при нажатии на ввод в едите
if key=13 then
begin
if SearchLB.Items.Count=0 then text:="";
Text:=SearchLB.Items.Strings[SearchLB.ItemIndex];
SelectAll;
SetFocus;
SearchLB.Visible:=false;
end;
// при нажатии стрелки вниз передаем фокус листбоксу
if key=40 then
begin
SearchLB.SetFocus;
if SearchLB.Items.Count>2 then
begin
SearchLB.Selected[0]:=false;
SearchLB.Selected[1]:=true;
end;
end;
end;
procedure TListSearch.OnKeyDownLB(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
//inherited OnKeyDown;
// при нажатии ввода в лист бокса передаем текст и фокус в едит
if key=13 then
begin
Text:=SearchLB.Items.Strings[SearchLB.ItemIndex];
SelectAll;
// SetFocus;
SearchLB.Visible:=false;
end;
// при нажатии ESC
if key=27 then
begin
SetFocus;
SearchLB.Visible:=false;
end; end;
end.
как передать фокус на самого компонента во нутри него? я делаю setfocus или self.setfocus когда он один то все нормально, а когда их два то глючат фокус передается не на него а на соседний такой же компонент...(текст в коде где глючит я выделил)
← →
Игорь Шевченко (2003-01-29 11:32) [1]Не могу сказать ничего определенного, но может, так:
if key=13 then begin
Text:=SearchLB.Items.Strings[SearchLB.ItemIndex];
SearchLB.Visible:=false;
SelectAll;
end;
// при нажатии ESC
if key=27 then begin
SearchLB.Visible:=false;
SetFocus;
end;
Страницы: 1 вся ветка
Текущий архив: 2003.02.06;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.011 c