Last try here.

If you have ever bought one of those 40 pound volumes "Delphi Developer's
Guide" by Teixeira and Pacheco (Delphi 4,5,6) you can find the source for
this in the chapter on creating custom components. This is what they call
a "container component". Decending from TCustomControl (or TWinControl, I
tried both), it has an edit box and a button. Not complicated stuff.

Three questions.

1. Why do they free the edit control and the button in the destructor? If
these "contained components" are created with Owner=self, where is the
need to free them?

2. The component works fine. Assume it is named FOO, either in the
designer or in code. The normal way of naming components. Then the test
"if ActiveControl=FOO" always fails. I can see the name property is not
set. Yet it has a name and the IDE handles it fine.

This is a head-scratcher for me. Complete failure to understand something
very basic.

3. This is my third try in this forum. So I am not phrasing the question
well, or I am asking in the wrong place. Yet when I google for component
writing groups or forums, all I can find is dead links. Is anyone aware of
 group that is active, with help for basic component writing?

I found a professional outfit willing to try and answer for some big
bucks. I must go with them unless I can find help here.

Thanks in advance.

=========================================================
unit imMyControl;
{
  Simple test 'container component' appears to work but
  fails to have a name property (or otherwise be detected as ActiveControl).
}
interface

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

type

  //=========================================
  { Later we will want to tweak keystroke handling for masked edits.
  }
  //TImsCustomMaskEdit = class(TCustomMaskEdit)
  //end;

  //=========================================
  { Base class
  }
  TImsCustomMyControl = class(TWinControl)
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;

  private
    FEdit:TEdit;
    FSpeedButton: TSpeedButton;

    procedure ButtonClick(Sender:TObject);
    function  GetText:string;
    procedure SetText(Value:string);

  protected
    procedure WMSize(var Message: TWMSize); message WM_SIZE;

  public
    procedure SetFocus;override;
    property Text:string read GetText write SetText;
  end;

  //=========================================
  { Lookup control
  }
  TImsMyControl = class(TImsCustomMyControl)
  published
    property Align;
    property Enabled;
    property Font;
    property OnEnter;
    property OnExit;
    property Text;
    property TabOrder;
    property TabStop;
    property Visible;
  end;

  procedure Register;

implementation



procedure Register;
begin
  RegisterComponents('TEST', [TImsMyControl]);
end;

//==============================================================================
{
}
constructor TImsCustomMyControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  // An edit contro
  FEdit:=TEdit.Create(self);
  FEdit.Parent:=self;
  FEdit.Height:=21;

  // A button
  FSpeedButton := TSpeedButton.Create(Self);
  FSpeedButton.Left := Width;
  FSpeedButton.Height := 19; // two less than TEdit's Height
  FSpeedButton.Width  := 19;
  FSpeedButton.Caption := 'F';
  FSpeedButton.Parent := Self;
  FSpeedButton.OnClick := ButtonClick;//MyDropDown;

  Width  := Width+FSpeedButton.Width;
  Height := FEdit.Height;
end;

destructor  TImsCustomMyControl.Destroy;
begin
  // Curious. Why free these? Are not owned components to be freed
automagically?
  FEdit.Free;
  FSpeedButton.Free;
  inherited Destroy;
end;

{ Maintain edit control and button in their respective places
}
procedure TImsCustomMyControl.WMSize(var Message: TWMSize);
begin
  inherited;
  FEdit.Width := Message.Width-FSpeedButton.Width;
  FSpeedButton.Left := FEdit.Width;
end;

//==============================================================================
{ Delegate to edit control
}
function TImsCustomMyControl.GetText:string;
begin
  Result:=FEdit.Text;
end;
procedure TImsCustomMyControl.SetText(Value:string);
begin
  FEdit.Text:=Value;
end;
procedure TImsCustomMyControl.SetFocus;
begin
  FEdit.SetFocus;
end;

//==============================================================================
{
}
procedure TImsCustomMyControl.ButtonClick(Sender:TObject);
begin
  FEdit.SetFocus;
  ShowMessage('click');
end;

{ -Compile and install.
  -Drop one on a new form. Compile and run.
  -Try to report the name of the control, or test for it when it is
ActiveControl!
}
end.



Reply via email to