Re[4]: OnChange
От: _pk_ Россия  
Дата: 03.12.04 20:18
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Что-то с трудом верится... Давайте-ка посмотрим полный код компонента и как компонент используется, а уже потом будем думать


TSearchEdit = class(TCustomEdit)
private
  FGrid: TCustomDBGridEx;
  FColumn: TColumnEx;
  procedure SetColumn(const Value: TColumnEx);
  procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS;
  procedure InternalChange(Sender: TObject);
protected
  procedure CreateParams(var AParams: TCreateParams); override;
  procedure Locate;
  procedure KeyPress(var Key: Char); override;
public
  constructor Create(AOwner: TCustomDBGridEx); reintroduce; virtual;
  property Column: TColumnEx read FColumn write SetColumn;
end;
    
{ TSearchEdit }

constructor TSearchEdit.Create(AOwner: TCustomDBGridEx);
begin
  inherited Create(AOwner);
  OnChange := InternalChange;
  FGrid := AOwner;
  FreeNotification(FGrid);
  Parent := FGrid;
  BorderStyle := bsNone;
end;

procedure TSearchEdit.CreateParams(var AParams: TCreateParams);
begin
  inherited;
  AParams.Style := AParams.Style or WS_BORDER;
end;

procedure TSearchEdit.InternalChange(Sender: TObject);
begin
  Locate;
end;

procedure TSearchEdit.KeyPress(var Key: Char);
begin
  inherited;
  if Key = Chr(VK_ESCAPE) then
  begin
    Key := #0;
    PostMessage(FGrid.Handle, WMU_KILLME, 0, 0);
  end;
end;

procedure TSearchEdit.Locate;
begin
  with FGrid.DataLink.DataSet do
    if Active then
      try
        Locate(Column.FieldName, Text, [loCaseInsensitive, loPartialKey]);
      except
      end;
end;

procedure TSearchEdit.SetColumn(const Value: TColumnEx);
var R: TRect;
begin
  if FColumn = Value then
    Exit;
  FColumn := Value;
  R := FGrid.CellRect(FColumn.Index + 1, 0);
  Left := R.Left - 1;
  Top := R.Top - 1;
  Height := R.Bottom - R.Top + 2;
  Width := R.Right - R.Left + 2;
  Text := FColumn.Field.AsString;
  SetFocus;
end;

procedure TSearchEdit.WMKillFocus(var Message: TMessage);
begin
  inherited;
  PostMessage(FGrid.Handle, WMU_KILLME, 0, 0);
end;
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.