Форум: "Начинающим";
Текущий архив: 2017.11.12;
Скачать: [xml.tar.bz2];
Внизкак отловить необходимость погасить кнопку в ячейке StringGrid Найти похожие ветки
← →
TheEd (2015-12-14 12:43) [0]Уважаемые мастера, что-то совсем туплю:
Есть СирингГрид, по SelectCell располагаю кнопку с тремя точками для возможности вызвать свой редактор в нужном месте. Так вот, надо бы погасить её, когда клик происходит вне грида или на ячейках, которые нередактируемые. Со вторым справился, а вот выловить первое пытался через OnExit.
Он срабатывает только при клике на компоненте, который может иметь фокус. Если к примеру кликнуть на SpeedButton"е, то активным останется грид, и ничего не изменится.
Есть ли возможность выяснить, что пользователь "ушел" с грида?
← →
Кщд © (2015-12-14 12:56) [1]у TStribgGrid событий - штук 30 всего.
неужели сложно открыть документацию и прочитать?
← →
sniknik © (2015-12-14 13:12) [2]> на ячейках, которые нередактируемые
у них что не срабатывает SelectCell? в чем проблема проверить на редактируемую или нет ячейку переход?
> выяснить, что пользователь "ушел" с грида
без смены "фокуса"? как? фокус это показатель где "стоит" пользователь.
← →
TheEd (2015-12-15 06:57) [3]
> у TStribgGrid событий - штук 30 всего.
> неужели сложно открыть документацию и прочитать?
>
>
Абсолютно нетрудно. Тем более что из этих 30 могли бы помочь максимум 1-2 (OnExit и криво с таймером через OnMouseOver замутить можно).
> > на ячейках, которые нередактируемые
> у них что не срабатывает SelectCell? в чем проблема проверить
> на редактируемую или нет ячейку переход?
Это то я как раз отрабатываю - тут всё ок. Вопрос был в другом - клик на другом компоненте...
← →
TheEd (2015-12-15 07:07) [4]
> > выяснить, что пользователь "ушел" с грида
> без смены "фокуса"? как? фокус это показатель где "стоит"
> пользователь.
>
>
Сам так думал. Вот пример (создаём пустое приложение, кладём на форму TButton и TSpeedButton):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
SpeedButton1: TSpeedButton;
procedure Button1Exit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Exit(Sender: TObject);
begin
Button1.Caption := "OnExit was just now!";
end;
end.
Форма:
object Form1: TForm1
Left = 279
Top = 110
Width = 222
Height = 118
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object SpeedButton1: TSpeedButton
Left = 112
Top = 24
Width = 49
Height = 22
Caption = "Click me!"
end
object Button1: TButton
Left = 24
Top = 24
Width = 75
Height = 25
Caption = "Button1"
TabOrder = 0
OnExit = Button1Exit
end
end
Так вот, по клику на SpeedButton"не ничего не произойдёт! TButton будет подсвечен и иметь фокус! В мануалах, помнится я встречал - что TSpeedButton не имеет фокуса (не делфийских, а на форумах). И много какие компоненты его не имеют...
Так что печалька :(
← →
sniknik © (2015-12-15 10:00) [5]> В мануалах, помнится я встречал
после имени компонента ставишь точку и пытаешься набрать Focused/CanFocus ... есть? значит компонент с фокусом. и посмотри от чего наследуются TButton и TSpeedButton. где определены Focused/CanFocus, узнаешь сразу о всех, без написания примеров.
← →
TheEd (2015-12-15 11:15) [6]Та ёлки палки, ребята, я это знаю, но вопрос в другом: на форме куча компонентов, не имеющих фокуса и юзверь может кликать и на них...
Соответственно OnExit не сработает. Хук на мышу ставить и проверять где кликонули - это то что пока в голову приходит, но чувствую что кривовато это. Вот поэтому и спрашиваю - кто сталкивался (задача вроде тривиальная - поэтому даже не в компоненты поместил запрос а в "Начинающим") просто дайте толчок мысли, дальше сам догребу :)))
← →
sniknik © (2015-12-15 11:52) [7]> Хук на мышу ставить и проверять где кликонули
проще у формы ловить, KeyPreview поставить и ловить.
> чувствую что кривовато это.
как и "задача", не меняя фокус никто никуда не "выходит"... курсор там остается выделение, и т.д. меняя активность формы (переходя между приложениями) также вернешься не в спидбатон, а в грид (не кликая мышью, а клавишами).
т.е. по логике/система так считает/т.д. ты в нем (гриде) остаешься, а по "задаче" вышел... неувязочка получается.
← →
Кщд © (2015-12-15 12:42) [8]>TheEd (15.12.15 11:15) [6]
Та елки-палки, если хочется, чтобы контрол терял фокус при наступлении события (которое система не считает основанием для смены фокуса), то нужно прописать снятие фокуса при наступлении этого события САМОСТОЯТЕЛЬНО.
← →
sniknik © (2015-12-15 16:52) [9]> прописать снятие фокуса
нельзя (ИМХО, насколько помню, проверять не буду). только перенести на что-то другое, причем на что то видимое и позволяющее "фокус".
опять ИМХО, но лучше отказаться от этого нелепого желания (сделать вопреки системе).
← →
backuper (2015-12-15 21:57) [10]
> нельзя (ИМХО, насколько помню, проверять не буду). только
> перенести на что-то другое, причем на что то видимое и позволяющее
> "фокус".
можно, если не понимать буквально смену фокуса, а выполнять код который изначально вешали на смену фокуса.
← →
TheEd (2015-12-16 07:18) [11]Если вернуться в самое начало, то самоцель не убить фокус, а спрятать кнопку редактирования значения в ячейке грида, когда происходит собитие, даже похожее на уход с грида, например клик на чужом SpeedButtone...
В принципе тему можно закрыть - буду пока хуком обходить ситуацию...
Всем спасибо!
← →
Кщд © (2015-12-16 13:08) [12]>sniknik © (15.12.15 16:52) [9]
>опять ИМХО, но лучше отказаться от этого нелепого желания (сделать вопреки системе).
без сомненья
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2017.11.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c