Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > при получении фокуса листбоксом конпка становилась


Автор: Drizhenko 19.1.2006, 07:58
Есть листбокс и кнопка. Как сделать чтобы при получении фокуса листбоксом конпка становилась доступной (enabled=true), а при потери фокуса - недоступной.

Автор: RN3QGA 19.1.2006, 09:02
Если правильно понял то можно попробывать обработать события для ListBox OnEnter и OnExit .

Автор: ShadeSt 19.1.2006, 09:29
Вот только я не пойму зачем это надо?? Ведь на кнопку в таком случае никогда не нажать
Код

procedure TForm1.ListBox1Enter(Sender: TObject);
begin
  Button1.Enabled := True;
end;

procedure TForm1.ListBox1Exit(Sender: TObject);
begin
  Button1.Enabled := False;
end;

Автор: Drizhenko 19.1.2006, 11:13
Точно. Нажать нельзя. В обще нужно так сделать если в листбоксе ничего не выбрано, то на кнопку нельзя нажать. Не могу понять в какое событие это запихать.

Автор: Rennigth 19.1.2006, 11:20
немного лень тестировать на какие события это вешать, но впринципе это должно работать:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure ListBox1Enter(Sender: TObject);
    procedure ListBox1Exit(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    function GetBtnEnabled: Boolean;
  public
    property BtnEnabled: Boolean read GetBtnEnabled;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetBtnEnabled: Boolean;
begin
  Result := ListBox1.ItemIndex <> -1;
end;

procedure TForm1.ListBox1Enter(Sender: TObject);
begin
  Button1.Enabled := BtnEnabled;
end;

procedure TForm1.ListBox1Exit(Sender: TObject);
begin
  Button1.Enabled := BtnEnabled;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Button1.Enabled := BtnEnabled;
end;

end.

Автор: Snowy 19.1.2006, 11:33
Код

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
  Button1.Enabled := (ListBox1.ItemIndex >= 0);
end;

Автор: Alexeis 19.1.2006, 12:32
Я думаю что лучше будет перекрыть методы Tlistbox
GetSelected
SetSelected
в новом наследнике.
тогда можно будет отследить все програмные измениения (внутренние).

Кроме надо будет еще обрабатывать onClick для слежения за пользовательскими изменениями.

для слежения за изменениями из внешней програмы
надо отлавливать сообщения
LB_SETSEL
LB_SETCURSEL
тогда уже нет необходимости в переопределении
GetSelected
SetSelected

Приемущество этого метода по сравнению с методом Snowy соостоит в том что не осуществляются постоянные проверки.

метод Rennigth не контролирует програмные изменения


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)