Here is one way to make such a component. It's pretty crude, but I hope contains enough basic ideas to get you started on the right track.
unit ImageAndEdit;
{$mode objfpc}{$H+}
interface
uses
Classes, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;
type
TPosition = (poAbove, poBelow);
{ TImageAndEdit }
TImageAndEdit = class(TCustomControl)
strict private
FEditPosition: TPosition;
FImage: TImage;
FEdit: TEdit;
FSpacing: integer;
procedure SetEditPosition(AValue: TPosition);
procedure SetSpacing(AValue: integer);
procedure PositionChildren;
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
published
property EditBox: TEdit read FEdit;
property Image: TImage read FImage;
property EditPosition: TPosition read FEditPosition write SetEditPosition default poAbove;
property Spacing: integer read FSpacing write SetSpacing default 6;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Misc',[TImageAndEdit]);
end;
{ TImageAndEdit }
procedure TImageAndEdit.SetEditPosition(AValue: TPosition);
begin
if FEditPosition=AValue then
Exit;
FEditPosition:=AValue;
PositionChildren;
end;
procedure TImageAndEdit.SetSpacing(AValue: integer);
begin
if FSpacing=AValue then
Exit;
FSpacing:=AValue;
PositionChildren;
end;
procedure TImageAndEdit.PositionChildren;
var
w, h, t: integer;
begin
w:=ClientWidth;
h:=ClientHeight;
t:=23 + FSpacing;
case FEditPosition of
poAbove: begin
FEdit.SetBounds(0, 0, w, 23);
FImage.SetBounds(0, t, w, h-t);
end;
poBelow: begin
FImage.SetBounds(0, 0, w, h-t);
FEdit.SetBounds(0, h-23, w, 23);
end;
end;
end;
procedure TImageAndEdit.Paint;
begin
Canvas.Brush.Color:=Color;
Canvas.FillRect(ClientRect);
inherited Paint;
end;
constructor TImageAndEdit.Create(AOwner: TComponent);
var
wi, hi: integer;
begin
inherited Create(AOwner);
FSpacing:=6;
FEditPosition:=poAbove;
FImage:=TImage.Create(Self);
FImage.SetSubComponent(True);
FEdit:=TEdit.Create(Self);
FEdit.SetSubComponent(True);
FImage.GetPreferredSize(wi, hi);
FImage.SetInitialBounds(0, 0, wi, hi);
FEdit.SetInitialBounds(0, 0, wi, 23);
SetInitialBounds(0, 0, wi, 23+FSpacing+hi);
PositionChildren;
FEdit.Parent:=Self;
FImage.Parent:=Self;
end;
end.