Дефолтная кнопка и TDBLookupComboBox
От: Pvl__  
Дата: 19.07.06 14:28
Оценка:
Как сделать чтобы когда TDBLookupComboBox раскрыт, при нажатии на ENTER не срабатывала бы дефолтная кнопка а combobox просто свернулся?
Re: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 19.07.06 14:41
Оценка:
Здравствуйте, Pvl__, Вы писали:

P__>Как сделать чтобы когда TDBLookupComboBox раскрыт, при нажатии на ENTER не срабатывала бы дефолтная кнопка а combobox просто свернулся?


У меня в Delphi7 все работает нормально, именно так как вы хотите
Re[2]: Дефолтная кнопка и TDBLookupComboBox
От: Pvl__  
Дата: 19.07.06 14:54
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Здравствуйте, Pvl__, Вы писали:


P__>>Как сделать чтобы когда TDBLookupComboBox раскрыт, при нажатии на ENTER не срабатывала бы дефолтная кнопка а combobox просто свернулся?


D>У меня в Delphi7 все работает нормально, именно так как вы хотите


Увы, но Deplhi 6
Re[3]: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 19.07.06 15:05
Оценка:
Здравствуйте, Pvl__, Вы писали:

P__>Здравствуйте, Danchik, Вы писали:


D>>Здравствуйте, Pvl__, Вы писали:


P__>>>Как сделать чтобы когда TDBLookupComboBox раскрыт, при нажатии на ENTER не срабатывала бы дефолтная кнопка а combobox просто свернулся?


D>>У меня в Delphi7 все работает нормально, именно так как вы хотите


P__>Увы, но Deplhi 6


Delphi 5 тоже работает. Проверьте у себя на маленьком тестовом проэкте. Может что то намутили...
Re[4]: Дефолтная кнопка и TDBLookupComboBox
От: Pvl__  
Дата: 19.07.06 15:17
Оценка:
Здравствуйте, Danchik, Вы писали:


D>Delphi 5 тоже работает. Проверьте у себя на маленьком тестовом проэкте. Может что то намутили...


Специально по этому поводу сделал отдельный проект состоящий из стандартных TForm, TButton, TDBLookupComboBox, TOraQuery и датасета.
Re[5]: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 19.07.06 15:29
Оценка:
Здравствуйте, Pvl__, Вы писали:

P__>Здравствуйте, Danchik, Вы писали:



D>>Delphi 5 тоже работает. Проверьте у себя на маленьком тестовом проэкте. Может что то намутили...


P__>Специально по этому поводу сделал отдельный проект состоящий из стандартных TForm, TButton, TDBLookupComboBox, TOraQuery и датасета.


What can i say... Debug, блин, смотрите кто нажал кнопочку. Желательно подключить сурцы исходников VCL.
В комбобоксе явно написан нужный код (ключевое болдом):
procedure TDBLookupComboBox.CMDialogKey(var Message: TCMDialogKey);
begin
  if (Message.CharCode in [VK_RETURN, VK_ESCAPE]) and FListVisible then
  begin
    CloseUp(Message.CharCode = VK_RETURN);
    Message.Result := 1;
  end else
    inherited;
end;

Ну и посмотрите, например, почему сюда не попадает.
Или другой варинт, закинте мне на мыло ваш тестовый проэктик sdanyliv(тяв)gmail(тчк)com
Может и найду ваши грабли...
Re[6]: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 19.07.06 16:45
Оценка: 3 (1)
[Skip]

Получил я вашу тестовую программу. Да действительно проблема есть
Решается она банально. Кнопка первая ловит сообщение CM_DIALOGKEY, а до комбобокса оно не доходит. Вывод: нужно сделать так чтобы Combo получал ее первым. Самое простое Cut Button, Paste Button тогда она будет создаваться позже и соответственно не будет перехватывать это сообщение рашьше Combo. Или просто в DFM перенесите Button пониже Combo. Мерзко но работает
Re[7]: Дефолтная кнопка и TDBLookupComboBox
От: Pvl__  
Дата: 19.07.06 16:48
Оценка:
Здравствуйте, Danchik, Вы писали:

D>[Skip]


D>Получил я вашу тестовую программу. Да действительно проблема есть

D>Решается она банально. Кнопка первая ловит сообщение CM_DIALOGKEY, а до комбобокса оно не доходит. Вывод: нужно сделать так чтобы Combo получал ее первым. Самое простое Cut Button, Paste Button тогда она будет создаваться позже и соответственно не будет перехватывать это сообщение рашьше Combo. Или просто в DFM перенесите Button пониже Combo. Мерзко но работает

Ужос какой этот делфи!
Re[8]: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 19.07.06 16:56
Оценка:
Здравствуйте, Pvl__, Вы писали:

P__>Здравствуйте, Danchik, Вы писали:


D>>[Skip]


D>>Получил я вашу тестовую программу. Да действительно проблема есть

D>>Решается она банально. Кнопка первая ловит сообщение CM_DIALOGKEY, а до комбобокса оно не доходит. Вывод: нужно сделать так чтобы Combo получал ее первым. Самое простое Cut Button, Paste Button тогда она будет создаваться позже и соответственно не будет перехватывать это сообщение рашьше Combo. Или просто в DFM перенесите Button пониже Combo. Мерзко но работает

P__>Ужос какой этот делфи!


Тсс, боги обидятся
Вы бы в MFC еще больше офигели
Re[9]: Дефолтная кнопка и TDBLookupComboBox
От: Pvl__  
Дата: 20.07.06 13:42
Оценка:
Здравствуйте, Danchik, Вы писали:

[Skip]

Проблема всё же не решена. Оказывается, что мне надо наследоваться от пустой формы с кнопкой, а в этом случае этот способ не прокатывает. Удалять наследуемую кнопку нельзя, а опускание её в dfm'e ничего не даёт как бы низко я её не там опускал .
Я вам пошлю тестовый проект, посмотрите как нибудь на досуге пожалусто
Re[10]: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 20.07.06 14:44
Оценка:
Здравствуйте, Pvl__, Вы писали:

P__>Здравствуйте, Danchik, Вы писали:


P__>[Skip]


P__>Проблема всё же не решена. Оказывается, что мне надо наследоваться от пустой формы с кнопкой, а в этом случае этот способ не прокатывает. Удалять наследуемую кнопку нельзя, а опускание её в dfm'e ничего не даёт как бы низко я её не там опускал .

P__>Я вам пошлю тестовый проект, посмотрите как нибудь на досуге пожалусто

Еcmь в этом форуме такие кнопочки с циферками, если нажмете, может и напрягуся. А так, лень, чесна
Что то человеку делаеш, а он тебе ни спасибо ни досвидания...
Re: Дефолтная кнопка и TDBLookupComboBox
От: ekamaloff Великобритания  
Дата: 21.07.06 04:25
Оценка:
Здравствуйте, Pvl__, Вы писали:

P__>Как сделать чтобы когда TDBLookupComboBox раскрыт, при нажатии на ENTER не срабатывала бы дефолтная кнопка а combobox просто свернулся?


Есть наитупейшее, но думаю, что рабочее решение:

procedure TMyForm.MyComboBoxDropDown(Sender: TObject);
begin
    MyButton.Default := False;
end;

procedure TMyForm.MyComboBoxCloseUp(Sender: TObject);
begin
    MyButton.Default := True;
end;


Еще один возможный воркэраунд:

procedure TMyForm.MyButtonClick(Sender: TObject);
begin
    if not MyComboBox.ListVisible then
        ///...
end;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[11]: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 21.07.06 11:44
Оценка:
[Skip]

Ну что же, вот вам мое универсальное решение. Все ваши формы придется порождать от предложенного мною шаблона
Потестите, скажете свое мнение

unit fmPatternForm;

interface

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

type
  TPatternForm = class(TForm)
  private
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
  protected
    procedure InternalPreBrodcast(Parent : TWinControl; var Message);
    function IsFirstRun(Control : TControl): Boolean; virtual;
  end;

var
  PatternForm: TPatternForm;

implementation

{$R *.dfm}

procedure TPatternForm.CMDialogKey(var Message: TCMDialogKey);
begin
  with Message do
    if (CharCode = VK_RETURN) or (CharCode = VK_ESCAPE) then
    begin
      InternalPreBrodcast (Self, Message);
      if Message.Result <> 0 then
        Exit;
    end;
  inherited;
end;

procedure TPatternForm.InternalPreBrodcast(Parent : TWinControl; var Message);
var
  K : Integer;
  aControl : TControl;
begin
  for K := 0 to Parent.ControlCount - 1 do
  begin
    aControl := Parent.Controls[K];
    if IsFirstRun (aControl) then
      aControl.WindowProc(TMessage(Message))
    else
      if aControl is TWinControl then
        InternalPreBrodcast (TWinControl (aControl), Message);
    if TMessage(Message).Result <> 0 then
      Exit;
  end;
end;

function TPatternForm.IsFirstRun(Control : TControl): Boolean;
  function InheritsFrom (ClassName : string) : Boolean;
  var
    aClassType : TClass;
  begin
    { check hierarchy }
    aClassType := Control.ClassType;
    repeat
      Result := SameText (aClassType.ClassName, ClassName);
      if Result then
        Exit;

      aClassType := aClassType.ClassParent;
    until aClassType = nil;
  end;

begin
  // place here identification of controls that need closing
  Result :=
    InheritsFrom ('TDBLookupComboBox')
    or InheritsFrom ('TComboBox');
end;

end.


Удачи!
Re[12]: Дефолтная кнопка и TDBLookupComboBox
От: ekamaloff Великобритания  
Дата: 21.07.06 11:59
Оценка: 3 (1)
Здравствуйте, Danchik, Вы писали:

D>
D>  function InheritsFrom (ClassName : string) : Boolean;
D>  var
D>    aClassType : TClass;
D>  begin
D>    { check hierarchy }
D>    aClassType := Control.ClassType;
D>    repeat
D>      Result := SameText (aClassType.ClassName, ClassName);
D>      if Result then
D>        Exit;

D>      aClassType := aClassType.ClassParent;
D>    until aClassType = nil;
D>  end;
D>


А че это такое? Чем is не угодил? Чтобы не включать юниты DBCtrls и т.п.? Так они все равно будут включены в форме наследнике, так ччто выигрыша в размере exe это точно не даст. Если включение этих юнитов не нравится концепиуально тогда вообще правильней было сделать виртуальный метод, который должны были бы перекрывать наследники и определять, требуется ли отдавать на обработку заданному контролу мессагу или нет
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[13]: Дефолтная кнопка и TDBLookupComboBox
От: Danchik Украина  
Дата: 21.07.06 12:07
Оценка: 3 (1)
Здравствуйте, ekamaloff, Вы писали:

[Skip]

E>А че это такое? Чем is не угодил? Чтобы не включать юниты DBCtrls и т.п.? Так они все равно будут включены в форме наследнике, так ччто выигрыша в размере exe это точно не даст. Если включение этих юнитов не нравится концепиуально тогда вообще правильней было сделать виртуальный метод, который должны были бы перекрывать наследники и определять, требуется ли отдавать на обработку заданному контролу мессагу или нет


Это на будущее (идею можна развить), просто я сам не люблю когда шаблоны забиты непонятными uses. Потом замахиваешся отделять...
Да виртуальный метод это следующий шаг Ну не буду же я тут налету создавать всю концепцию

Ладно, дабы не позорится:
unit fmPatternForm;

interface

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

type
  TPatternForm = class(TForm)
  private
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
  protected
    procedure InternalPreBrodcast(Parent : TWinControl; var Message); virtual;
    function IsFirstRun(Control : TControl): Boolean; virtual;
  public
    class function InheritsFrom(Component : TComponent; ClassName : string): Boolean;
  end;

implementation

{$R *.dfm}

procedure TPatternForm.CMDialogKey(var Message: TCMDialogKey);
begin
  with Message do
    if (CharCode = VK_RETURN) or (CharCode = VK_ESCAPE) then
    begin
      InternalPreBrodcast (Self, Message);
      if Message.Result <> 0 then
        Exit;
    end;
  inherited;
end;

class function TPatternForm.InheritsFrom(Component : TComponent; ClassName : string): Boolean;
var
  aClassType : TClass;
begin
  { check hierarchy }
  aClassType := Component.ClassType;
  repeat
    Result := SameText (aClassType.ClassName, ClassName);
    if Result then
      Exit;

    aClassType := aClassType.ClassParent;
  until aClassType = nil;
end;

procedure TPatternForm.InternalPreBrodcast(Parent : TWinControl; var Message);
var
  K : Integer;
  aControl : TControl;
begin
  for K := 0 to Parent.ControlCount - 1 do
  begin
    aControl := Parent.Controls[K];
    if IsFirstRun (aControl) then
      aControl.WindowProc(TMessage(Message))
    else
      if aControl is TWinControl then
        InternalPreBrodcast (TWinControl (aControl), Message);
    if TMessage(Message).Result <> 0 then
      Exit;
  end;
end;

function TPatternForm.IsFirstRun(Control : TControl): Boolean;
begin
  // place here identfication of controls that need closing
  Result :=
    InheritsFrom (Control, 'TDBLookupComboBox')
    or InheritsFrom (Control, 'TComboBox');
end;

end.
Re[14]: Дефолтная кнопка и TDBLookupComboBox
От: Pvl__  
Дата: 21.07.06 16:49
Оценка:
Здравствуйте, Danchik, Вы писали:

D>[Skip]


Да уж, затычка немаленькая по размеру... Что ж, ушел разбираться. Всем спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.