Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Не могу передать фокус из StayOnTop формы в вызывающую   Найти похожие ветки 

 
msguns ©   (2005-06-15 11:16) [0]

MDI - приложение.
MDIChild для просмотра длинных текстов в таблицах БД создает формочку с мемо, куда копирует содержимое поля текущей записи отображаемой в гриде таблицы (по AfterScroll), при этом FormStyle созданной формочки fsStayOnTop. Т.е. при перемещении в гриде MDIChild, содержимое окна меняется.
Когда жмется редактирование (на гл.панели или PopupMenu грида), то фокус передается формочке и TMemo.ReadOnly := false, т.е. можно редактировать текст. По завершению редактирования (кнопка на формочке) новый текст пишется в БД, мемо переводится в ReadOnly и надо, чтобы курсор возвращался назад в грид. А он не возвращается ! TDBGrid.SetFocus не помогает !

Пробовал передавать фокус просто MDIChild, эффект тот же - фокус остается в формочке. Спасибо за любую помощь !


 
dmitry501 ©   (2005-06-15 11:25) [1]

msguns ©   (15.06.05 11:16)
временно скрыть формочку, перевести фокус, показать..


 
TUser ©   (2005-06-15 11:42) [2]

А эти помогают?

SetForegroundWindow
WM_ACTIVATE
WM_CLICK (гриду :))


 
msguns ©   (2005-06-15 12:06) [3]

>dmitry501 ©   (15.06.05 11:25) [1]
не помогает.

>TUser ©   (15.06.05 11:42) [2]
>SetForegroundWindow

fsStayOnTop !

>WM_ACTIVATE

не помогает.

>WM_CLICK (гриду :))

Ошибка компилляции

Вот текст обработчика "запись в БД"

procedure TfrmTextWin.actEditPostExecute(Sender: TObject);
var
 res: boolean;
begin
 if not CheckControls then
   begin
    ShowMessage("Ошибки в введенной информации");
    exit;
   end;
 if PFondName<>nil then
    res := TfrmListFond(ParentForm).Update_FondName(PFondName)
 else
    res := TfrmListFond(ParentForm).Update_FondPart(PFondPart);
 if not res then exit;
 Self.SetFocus;  
 EditFlag := false;
 SwitchFormOption; // Перевод формочки в режим просмотра

//  Hide;
//  Show;

//  ParentForm.SetFocus;

//  SendMessage(TfrmListFond(ParentForm).grFondsNames.Handle,WM_ACTIVATE,0,0);

//  if Assigned(PFondName) then
//     TfrmListFond(ParentForm).grFondsNames.SetFocus
//  else
//     TfrmListFond(ParentForm).grFondsParts.SetFocus;
end;


 
КаПиБаРа ©   (2005-06-15 12:14) [4]

Может CM_ACTIVATE поможет


 
msguns ©   (2005-06-15 12:32) [5]

>КаПиБаРа ©   (15.06.05 12:14) [4]
>Может CM_ACTIVATE поможет

нет.

Уйти с формочки можно только одним способом - кликнуть мышой на MDIChild. Программно "кликнуть" не получается ;((


 
КаПиБаРа ©   (2005-06-15 13:05) [6]

SetActiveWindow(Application.MainForm.Handle);
Ну и потом активировать грид и т.д.


 
msguns ©   (2005-06-15 16:27) [7]

>КаПиБаРа ©   (15.06.05 13:05) [6]
>SetActiveWindow(Application.MainForm.Handle);

Эффект тот же. Имхо, что-то тут в самом классе TForm при условии StayOnTop..


 
КаПиБаРа ©   (2005-06-16 06:25) [8]

msguns ©   (15.06.05 16:27) [7]
Странно. У меня работает


 
msguns ©   (2005-06-16 09:18) [9]

>КаПиБаРа ©   (16.06.05 06:25) [8]
>Странно. У меня работает

В Главную (MDIForm) фокус передается, а вот в дочь (MDIChild) - нет


 
msguns ©   (2005-06-21 16:57) [10]

Создал элементарное приложение:
1.MDIForm с одним винконтролом на панели управления и двумя кнопками: Открыть форму-"дочку" и Открыть форму StayOnTop от текущей "дочки"
2.MDIChild с несколькими контролами для того, чтобы было кому принимать фокус.
3.fsStayOnTop форма с единственным контролом TMemo (тип не существеннен). Есть 2 кнопки: "Передать фокус своей мамке" и "Передать фокус в указанную "Дочку"

Можно создать сколько угодно "дочек" и от каждой из них по одной (не более !) форме fsStayOnTop. Если передача фокуса выполняется из fsStayOnTop напрямую, то фокус не передается вообще. Если сначала фокус в контрол MDIForm, а затем уже в соотв. "дочку", то работает ! НО !!! Если форма, куда требуется передать фокус, была открыта последней, фокус остается в контроле Гл.формы !!! Что за суматоха, не пойму. Пробовал разобраться с реализацией класса TForm, но утонул ;((

Киньте же, будьте любезны, если не круг, то хотя бы соломину утопающему !


 
Игорь Шевченко ©   (2005-06-21 18:35) [11]


> Создал элементарное приложение:


Код приведи ?


 
msguns ©   (2005-06-22 10:49) [12]

Main:

{ ПРОБЛЕМА: ПЕРЕДАЧА ФОКУСА ИЗ fsStayOnTop формы в создавшую
ее дочернюю форму в MDI-интерфейсе.
Имеется:
 - Главная форма (unit1) с одним визуальным контролом на панеле управления
 - Произвольное кол-во эксземпляров дочерней формы TfrmChild,
    каждая из которых открывает одно окно (форму) TfrmTopic и передает ему фокус
Задача:
 - Передать фокус из TfrmTopic в создавшее ее MDIChild-окно.
 - Передать фокус из TfrmTopic в указанное MDIChild-окно.
}

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, ToolWin, ComCtrls, ActnList, ImgList, StdCtrls;

type
 TMainForm = class(TForm)
   ControlBar1: TControlBar;
   ToolBar1: TToolBar;
   ToolButton1: TToolButton;
   ActionList1: TActionList;
   ImageList1: TImageList;
   actOpenChild: TAction;
   ToolButton2: TToolButton;
   actTopForm: TAction;
   cmbMain: TComboBox;
   pnMain: TPanel;
   Label1: TLabel;
   Label2: TLabel;
   lbObjName: TLabel;
   Label3: TLabel;
   lbFormName: TLabel;
   procedure actOpenChildExecute(Sender: TObject);
   procedure actTopFormExecute(Sender: TObject);
   procedure cmbMainEnter(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   ChildNdx: integer;
   procedure ShowActiveControl;
   procedure PassFocusTo_Child_From_Topic(Child: TWinControl);
 end;

const
 CM_CREATE_TOPICWINDOW = WM_USER+201;
 CM_CLOSE_TOPICWINDOW = WM_USER+202;

var
 MainForm: TMainForm;

implementation

uses Unit2;

{$R *.dfm}

procedure TMainForm.ShowActiveControl;
begin
 lbFormName.Caption := Screen.ActiveForm.Caption;
 lbObjName.Caption := "?";
 if Screen.ActiveControl<>nil then
    lbObjName.Caption := Screen.ActiveControl.Name;
 pnMain.Update;
end;

procedure TMainForm.PassFocusTo_Child_From_Topic(Child: TWinControl);
begin
//  cmbMain.SetFocus;
//  ShowMessage(TfrmChild(Child).Caption);
 TfrmChild(Child).SetFocus;
end;

procedure TMainForm.actOpenChildExecute(Sender: TObject);
begin
 ChildNdx := ChildNdx+1;
 with TfrmChild.Create(Self) do Show;
end;

procedure TMainForm.actTopFormExecute(Sender: TObject);
begin
 if ActiveMDIChild<>nil then
   PostMessage(ActiveMDIChild.Handle,CM_CREATE_TOPICWINDOW,0,0);
end;

procedure TMainForm.cmbMainEnter(Sender: TObject);
begin
 ShowActiveControl;
end;

end.


 
msguns ©   (2005-06-22 10:52) [13]

"Дочка":

unit Unit2;

interface

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

type
 TfrmChild = class(TForm)
   Panel1: TPanel;
   edCtrlA: TEdit;
   edCtrlB: TEdit;
   edCtrlC: TEdit;
   cmbCtrlA: TComboBox;
   cmbCtrlB: TComboBox;
   lsbCtrl: TListBox;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormDeactivate(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure edCtrlAEnter(Sender: TObject);
   procedure FormActivate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   TopicWindow: HWnd;
   procedure Call_CreateTopicWindow(var Msg: TMessage); message CM_CREATE_TOPICWINDOW;
   procedure Call_CloseTopicWindow(var Msg: TMessage); message CM_CLOSE_TOPICWINDOW;
 end;

var
 frmChild: TfrmChild;

implementation

uses Topic;

{$R *.dfm}

procedure TfrmChild.Call_CreateTopicWindow(var Msg: TMessage);
begin
 if TopicWindow<>0 then
   begin
    ShowMessage("Нельзя создать более одного окна");
    exit;
   end;
 with TfrmTopic.Create(Self) do
   begin
    ParentWindow := Self;
    TopicWindow := Handle;   // Поставить отметку о наличии топик-окна
    Top := lsbCtrl.ClientOrigin.Y+2;
    Left := lsbCtrl.ClientOrigin.X+2;
    Show;
   end;
end;

procedure TfrmChild.Call_CloseTopicWindow(var Msg: TMessage);
begin
 TopicWindow := 0;
end;

procedure TfrmChild.FormCreate(Sender: TObject);
begin
//  TopicWindow := nil;
end;

procedure TfrmChild.FormShow(Sender: TObject);
begin
 Caption := Caption+IntToStr(MainForm.ChildNdx);
 edCtrlA.SetFocus;
end;

procedure TfrmChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

procedure TfrmChild.FormDeactivate(Sender: TObject);
begin
 MainForm.ShowActiveControl;
end;

procedure TfrmChild.edCtrlAEnter(Sender: TObject);
begin
 MainForm.ShowActiveControl;
end;

procedure TfrmChild.FormActivate(Sender: TObject);
begin
 MainForm.ShowActiveControl;
end;

end.


 
msguns ©   (2005-06-22 10:53) [14]

StayOnTop:

unit Topic;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls, Buttons, Unit1, Unit2;

type
 TfrmTopic = class(TForm)
   Panel1: TPanel;
   edCtrlA: TEdit;
   edCtrlB: TEdit;
   meCtrl: TMemo;
   Panel2: TPanel;
   spbReturnToParent: TSpeedButton;
   spbPassFocus: TSpeedButton;
   Label1: TLabel;
   cmbTargetForms: TComboBox;
   procedure FormCreate(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure FormActivate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure spbReturnToParentClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   ParentWindow: TfrmChild;
 end;

var
 frmTopic: TfrmTopic;

implementation

{$R *.dfm}

procedure TfrmTopic.FormCreate(Sender: TObject);
begin
//  
end;

procedure TfrmTopic.FormShow(Sender: TObject);
begin
 //
end;

procedure TfrmTopic.FormActivate(Sender: TObject);
var
 i: integer;
begin
 with cmbTargetForms do
   begin
    Clear;
    Text := "";
    for i := 0 to MainForm.MDIChildCount-1 do
      if MainForm.MDIChildren[i].Caption<>TForm(Self.Owner).Caption then
         Items.Add(MainForm.MDIChildren[i].Caption);
    ItemIndex := Items.Count-1;
   end;
end;

procedure TfrmTopic.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
 TfrmChild(Owner).TopicWindow := 0;
end;

procedure TfrmTopic.spbReturnToParentClick(Sender: TObject);
begin
//  TForm(Owner).SetFocus;   // Не хочэ, тварюка !
//   MainForm.SetFocus;
  ShowMessage("Хочу передать фокус в "+ParentWindow.Caption);
  MainForm.PassFocusTo_Child_From_Topic(ParentWindow);

end;

end.


 
Игорь Шевченко ©   (2005-06-22 14:13) [15]

Вот чего я сделал:

Главная:

unit main;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Menus;

type
 TfMain = class(TForm)
   MainMenu: TMainMenu;
   File1: TMenuItem;
   Exit1: TMenuItem;
   Child1: TMenuItem;
   New1: TMenuItem;
   procedure New1Click(Sender: TObject);
 end;

var
 fMain: TfMain;

implementation

uses Child;

{$R *.DFM}

procedure TfMain.New1Click(Sender: TObject);
begin
 with TfChild.Create (Application) do
   Show;
end;

end.


Дочка:

unit Child;

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

type
 TfChild = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
 end;

var
 fChild: TfChild;

implementation

uses OnTop;

{$R *.DFM}

procedure TfChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

procedure TfChild.Button1Click(Sender: TObject);
begin
 with TfOnTop.Create(Application, Self) do
   Show;
end;

end.


Всегда сверху:

unit OnTop;

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

type
 TfOnTop = class(TForm)
   btnReturnFocus: TButton;
   procedure btnReturnFocusClick(Sender: TObject);
 private
   FCaller: TfChild;
 public
   constructor Create (AOwner: TComponent; ACaller: TfChild); reintroduce;
 end;

var
 fOnTop: TfOnTop;

implementation

{$R *.DFM}

{ TfOnTop }

constructor TfOnTop.Create(AOwner: TComponent; ACaller: TfChild);
begin
 FCaller := ACaller;
 inherited Create (AOwner);
end;

procedure TfOnTop.btnReturnFocusClick(Sender: TObject);
begin
 PostMessage (Application.MainForm.ClientHandle, WM_MDIACTIVATE,
   FCaller.Handle, 0);
 PostMessage (FCaller.Handle, WM_SETFOCUS, Handle, 0);
end;

end.


Работает. Может, и тебе поможет метод ?


 
msguns ©   (2005-06-22 14:41) [16]

Класс !!!
Вся штука была в этом: ClientHandle

А можно расшифровать для особо "одаренных" в чем фокус клиентского хэндла для гл.формы ? Из хэлпа что-то ничего не высосал.

Кстати, попробую сейчас передавать фокус в произвольную "дочку"

Спасибо большое ;)))


 
Игорь Шевченко ©   (2005-06-22 14:47) [17]

msguns ©   (22.06.05 14:41) [16]


> А можно расшифровать для особо "одаренных" в чем фокус клиентского
> хэндла для гл.формы ?


Можно конечно. Дело в том, что все дочерние MDI-формы являются на самом деле дочками окна MDIClient, чем Handle и появляется в свойстве TForm.ClientHandle. И любое управление дочками происходит через посылку сообщений этому самому окну. Как только ты объявляешь стиль главной формы fsMDIForm, так при создании окна этой формы создается дополнительно окно MDIClient (оно занимает всю область главного окна, исключая меню, и прочие там статус-бары).


> Спасибо большое


Удачи. В случае чего, можешь меня по почте теребить, адрес тебе известен :)


 
msguns ©   (2005-06-22 15:26) [18]

>Игорь Шевченко ©   (22.06.05 14:47) [17]
>Удачи. В случае чего, можешь меня по почте теребить, адрес тебе известен :)

Списибо вторично. Уж не взыщи - при нужде потереблю ;)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.051 c
3-1116975309
Киря
2005-05-25 02:55
2005.07.11
Проблема с экспортом отчета fastReport в Word, Excel


8-1110034346
Narik
2005-03-05 17:52
2005.07.11
Как прокрутить видео файл компонента MediaPlayer


4-1115894651
misyachniy
2005-05-12 14:44
2005.07.11
Как правильно организовать задержку при обращении к USB?


1-1119385411
KOLIG
2005-06-22 00:23
2005.07.11
Вставка символов в компонент RichEdit


11-1098430854
Владимир Кладов
2004-10-22 11:40
2005.07.11
Fast Type Expert





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский