Solved

dbgrid focus error

Posted on 2008-10-07
10
690 Views
Last Modified: 2010-04-21
hi all,

i have this strange error which seems to be a delphi bug. I have a mdi application. Main form has a treeview and a button. mdichild form has a dbgrid. When i run the application i click on the button in main form to open mdi child form. then i click dbgrid in mdi child form. then i click the treeview on the main form. when i want to go back to dbgrid on mdi child form this error comes. the dbgrid wont get focus. so i need to minimize mdi child form or click another component on the form, then i can click on dbgrid. Please see attach code to be clear. I have reported this problem to Quality Central (#67627), and for sure i wont get the answer anytime soon.

I also had this problem when i use delphi 7. But i can solve it simply by adding "PostMessage(Handle, WM_ACTIVATE, WA_INACTIVE, 0);" on FormActive event. But this wont work in delphi 2007.

Please experts help me solve this problem.

Thanks in advance and sorry for my poor english.

Reynaldi
--------------- Main Form .dfm ---------------------------
 
 

object Form1: TForm1

  Left = 0

  Top = 0

  Caption = 'Form1'

  ClientHeight = 419

  ClientWidth = 672

  Color = clBtnFace

  Font.Charset = DEFAULT_CHARSET

  Font.Color = clWindowText

  Font.Height = -11

  Font.Name = 'Tahoma'

  Font.Style = []

  FormStyle = fsMDIForm

  OldCreateOrder = False

  Position = poDesktopCenter

  PixelsPerInch = 96

  TextHeight = 13

  object TreeView1: TTreeView

    Left = 0

    Top = 29

    Width = 121

    Height = 390

    Align = alLeft

    Indent = 19

    TabOrder = 0

    Items.NodeData = {

      01050000001B0000000000000000000000FFFFFFFFFFFFFFFF00000000000000

      000131001B0000000000000000000000FFFFFFFFFFFFFFFF0000000000000000

      0132001B0000000000000000000000FFFFFFFFFFFFFFFF000000000000000001

      33001B0000000000000000000000FFFFFFFFFFFFFFFF00000000000000000134

      001B0000000000000000000000FFFFFFFFFFFFFFFF0000000000000000013500}

  end

  object ToolBar1: TToolBar

    Left = 0

    Top = 0

    Width = 672

    Height = 29

    ButtonHeight = 21

    ButtonWidth = 48

    Caption = 'ToolBar1'

    ShowCaptions = True

    TabOrder = 1

    object ToolButton1: TToolButton

      Left = 0

      Top = 0

      Caption = 'Button 1'

      ImageIndex = 0

      OnClick = ToolButton1Click

    end

  end

end
 
 
 
 
 

--------------- Main Form .Pas ---------------------------
 
 

unit Unit1;
 

interface
 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ComCtrls, ToolWin;
 

type

  TForm1 = class(TForm)

    TreeView1: TTreeView;

    ToolBar1: TToolBar;

    ToolButton1: TToolButton;

    procedure ToolButton1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;
 

var

  Form1: TForm1;
 

implementation
 

uses

  unit2;
 

{$R *.dfm}
 

procedure TForm1.ToolButton1Click(Sender: TObject);

var

  frm: TForm2;

begin

  frm := TForm2.Create(self);

end;
 

end.
 
 
 
 
 
 
 

--------------------------- mdi child .dfm --------------------------------
 
 
 

object Form2: TForm2

  Left = 0

  Top = 0

  Caption = 'Form2'

  ClientHeight = 216

  ClientWidth = 243

  Color = clBtnFace

  Font.Charset = DEFAULT_CHARSET

  Font.Color = clWindowText

  Font.Height = -11

  Font.Name = 'Tahoma'

  Font.Style = []

  FormStyle = fsMDIChild

  OldCreateOrder = False

  Visible = True

  OnClose = FormClose

  OnCreate = FormCreate

  PixelsPerInch = 96

  TextHeight = 13

  object DBGrid1: TDBGrid

    Left = 8

    Top = 40

    Width = 225

    Height = 168

    DataSource = DataSource1

    TabOrder = 0

    TitleFont.Charset = DEFAULT_CHARSET

    TitleFont.Color = clWindowText

    TitleFont.Height = -11

    TitleFont.Name = 'Tahoma'

    TitleFont.Style = []

  end

  object Edit1: TEdit

    Left = 8

    Top = 8

    Width = 121

    Height = 21

    TabOrder = 1

    Text = 'Edit1'

  end

  object ds1: TClientDataSet

    Aggregates = <>

    Params = <>

    Left = 168

    Top = 8

    object ds1field1: TStringField

      FieldName = 'field1'

    end

  end

  object DataSource1: TDataSource

    DataSet = ds1

    Left = 200

    Top = 8

  end

end
 
 
 
 
 

-------------------------- mdi child .pas ---------------------------------------
 
 

unit Unit2;
 

interface
 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, DB, DBClient, StdCtrls, Grids, DBGrids;
 

type

  TForm2 = class(TForm)

    DBGrid1: TDBGrid;

    Edit1: TEdit;

    ds1: TClientDataSet;

    ds1field1: TStringField;

    DataSource1: TDataSource;

    procedure FormCreate(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private

    { Private declarations }

  public

    { Public declarations }

  end;
 

implementation
 

{$R *.dfm}
 
 
 

procedure TForm2.FormCreate(Sender: TObject);

begin

  ds1.CreateDataSet;

  ds1.Open;

  ds1.InsertRecord(['1']);

  ds1.InsertRecord(['2']);

  ds1.InsertRecord(['3']);

  ds1.InsertRecord(['4']);

  ds1.InsertRecord(['5']);

end;
 
 

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  action := cafree;

end;
 
 
 
 

end.

Open in new window

0
Comment
Question by:reynaldio
10 Comments
 
LVL 13

Expert Comment

by:rfwoolf
ID: 22663148
"this error comes"
>>What is the error?
0
 
LVL 2

Author Comment

by:reynaldio
ID: 22663205
hi rfwoolf,

sorry for not being clear. the problem is that dbgrid wont get focus. i can click any other control on the form, but not dbgrid. this problem only occurs with mdi application.

thanks
0
 
LVL 37

Expert Comment

by:Geert Gruwez
ID: 22666877
set the parent of the child control to the mdi form


procedure TForm1.ToolButton1Click(Sender: TObject);

var

  frm: TForm2;

begin

  frm := TForm2.Create(self);

  frm.parent := Self;

end;

Open in new window

0
 
LVL 2

Author Comment

by:reynaldio
ID: 22668091
hi all,

Geert_Gruwez -> i implemented your code but i get this error "cannot focus a disabled or invinsible windows". What is this?

Thanks
0
 
LVL 37

Expert Comment

by:Geert Gruwez
ID: 22676547
any other code you have added besides the code you posted
for the problematic form ?
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 2

Author Comment

by:reynaldio
ID: 22679399
hi,

no other codes. and i only use standard component. and it only happen with mdi application.
i also had this problem in delphi 7, But i can solve it simply by adding "PostMessage(Handle, WM_ACTIVATE, WA_INACTIVE, 0);" on FormActive event. But this wont work in delphi 2007.

thanks.
0
 
LVL 37

Expert Comment

by:Geert Gruwez
ID: 22684784
if you don't set the parent of the form to the mdiform
then it's not an mdichild form

mdichild means it's a child of an mdiform or the parent must be set

the mdichild behave erratic otherwise

i created a new mdi application with the delphi wizard
no problems (after i added the frm.parent := self)
0
 
LVL 2

Author Comment

by:reynaldio
ID: 22700441
This is how i create mdichild

frm := TMdiChild.Create(Self); --> self is mdi parent
frm.parent := self; --> this raise an error

but if i remove, "frm.parent", the mdi works fine except for the problem i mention above.

Thanks,

Reynaldi
0
 
LVL 11

Accepted Solution

by:
calinutz earned 500 total points
ID: 25488888
0
 
LVL 2

Author Closing Comment

by:reynaldio
ID: 31503993
Thanks alot, that saved my day
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

895 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now