[lazarus] Dynamic GUI
Jesus Reyes
jesusrmx at yahoo.com.mx
Tue May 6 15:19:53 EDT 2003
And I would do this with a TStringGrid Control
--Column[0] Width=0 to store Icon Names.
..
grids.colWidths[0]:=0;
..
--Define one onDrawCell to draw Column[1] icons, and call
defaultDrawCell for any other cells.
...
if col=1 Then begin
grid.Canvas.CopyRect(R,Icon.Canvas,classes.Rect(...));
End else DefaultDrawCell(col,row,rect,state)
..
--Define a TMyBitBtn Editor
TMyBitBtn=Class(TBitBtn)
Private
FGrid: TCustomGrid;
Protected
Procedure msg_SetGrid(Var Msg: TGridMessage); Message GM_SETGRID;
Procedure msg_SetPos(Var Msg: TGridMessage); Message GM_SETPOS;
End;
...
procedure TMyBitBtn.msg_SetGrid(var Msg: TGridMessage);
begin
FGrid:=Msg.Grid;
Msg.Options:=EO_HOOKKEYS or EO_HOOKEXIT;
end;
procedure TMyBitBtn.msg_SetPos(var Msg: TGridMessage);
begin
With Msg.CellRect do begin
If Right-Left>25 Then Left:=Right-25;
SetBounds(Left, Top, Right-Left, Bottom-Top);
End;
end;
--Attach it to the [run] column in the OnSelectEditor grid event and
set TMyBitBtn icon there too.
..
If col=colRun Then begin
Editor:=FMybitbtn
//update FMybitBtn Icon with Cells[0,row] icon name
End;
..
--Define Grid's onSelection to handle clicks on Column[1] and handle
TMyBitBtn clicks there too.
..
if col=1 then fMybitBtnClick1();
..
--Define Grid's OnCellAttr to allow WordWrap on Description column
(can be the same that [run] column), I haven't tested wordwraping but
it should work.
..
if col=colRUN Then
attr.textstyle.(sigleline|wordbreak):=(true|false)
--in the filling part i would set:
grid.BeginUpdate;
doTheFilling/gridResizing
grid.EndUpdate(true);
Regards.
Jesus Reyes A.
--- Shane Miller <smiller1 at stvgb.org> escribió: > A.J.
>
> I would do this (or something like this)
>
> TForm1 = class(TForm)
> private
> { Private declarations }
> public
> { Public declarations }
> MyButtonList : TList; //keeps track of the "buttons" created
> at
> runtime
> Procedure ShowEntry(Command, Name, Description, Icon :
> String);
> end;
>
> TCommandString = class //actually creates the button
> //and handles the onclick.
> private
> fExeCommand: String;
> fButton: TBitBtn;
> FCommand: String;
> FIcon: String;
> FName: String;
> FDescription: String;
> procedure SetCommand(const Value: String);
> procedure SetDescription(const Value: String);
> procedure SetIcon(const Value: String);
> procedure SetName(const Value: String);
> Procedure ButtonClick(Sender : TObject);
> public
> constructor Create(AOwner : TComponent);
> destructor Destroy; override;
> property ExeCommand : String read fExeCommand write
> fExeCommand;
> property Button : TBitBtn read fButton write fButton;
> property Icon : String read FIcon write SetIcon;
> property Command : String read FCommand write SetCommand;
> property Name : String read FName write SetName;
> property Description : String read FDescription write
> SetDescription;
> end;
>
>
> var
> Form1: TForm1;
>
> implementation
>
> Procedure TForm1.ShowEntry(Command, Name, Description, Icon :
> String);
> Var
> MyNewButton : TCommandString;
>
> Begin
> MyNewButton := TCommandString.Create(self);
> MyNewButton.Icon := Icon;
> MyNewButton.Name := Name;
> MyNewButton.Command := Command;
> MyNewButton.Description := Description;
> // MyButtonList is a TList that keeps track of the
> "TCommandString"
> objects.
> // When the form closes, run through the list and free each one.
> MyButtonlist.Add(MyNewButton);
> end;
>
>
>
> {$R *.dfm}
>
> { TCommandString }
>
> procedure TCommandString.ButtonClick(Sender: TObject);
> begin
> //execute the command here
> end;
>
> constructor TCommandString.Create(AOwner : TComponent);
> begin
> inherited create;
> fButton := tBitBtn.Create(AOwner);
> fButton.Parent := aOwner;
> fButton.OnClick := ButtonClick;
>
> end;
>
> destructor TCommandString.Destroy;
> begin
> fButton.free;
> inherited;
> end;
>
> procedure TCommandString.SetCommand(const Value: String);
> begin
> FCommand := Value;
> end;
>
> procedure TCommandString.SetDescription(const Value: String);
> begin
> FDescription := Value;
> end;
>
> procedure TCommandString.SetIcon(const Value: String);
> begin
> FIcon := Value;
> fButton.Glyph.LoadFromFile(Value);
> end;
>
> procedure TCommandString.SetName(const Value: String);
> begin
> FName := Value;
> end;
>
> End;
>
>
> ...main program....
>
> While mysql_row = mysql_fetch_row(mysql_result) do
> ShowEntry(mysql_row[1],mysql_row[2],mysql_row[3],mysql_row[4]);
>
>
> End.
>
> Something like that. Then you would need to place the
> "TCommandString.button" at the appropriate place on your form.
>
> Make sense?
>
> Shane
>
>
> -----Original Message-----
> From: A.J. Venter [mailto:ajventer at direqlearn.org]
> Sent: Tuesday, May 06, 2003 9:44 AM
> To: lazarus
> Subject: RE: [lazarus] Dynamic GUI
>
> I am afraid none of those options would work here.
>
> I want to deliberately prevent the use of hints in this program.
> The reason is that it is intended to be part of a system to create
> a
> Linux Application menu for new users. If a user chooses say
> "Graphics"
> from the main menu, a window should come up informing him of the
> installed Graphics Programs and explaining what each is, and the
> strengths and weaknesses.
> For example, Gimp if you want to edit graphics, FLphoto to view
> large
> collections of images etc.
>
> I tend to agree that Tbitbutton would be ideal for the icon and the
> name, but can tbitbuttons be loaded from file paths ?
> Remember I do not know until runtime what entries will need to be
> displayed, and at that time must basically generate the GUI
> dynamically
> based on the database for this category.
>
> Obviously that rules out RAD and the GUI will need to be coded by
> hand.
> Lets asume that a procedure to show each entry is saved in some
> unit.
> The main program would have to do something like this:
>
> While mysql_row = mysql_fetch_row(mysql_result) do
> ShowEntry(mysql_row[1],mysql_row[2],mysql_row[3],mysql_row[4]);
>
>
> What do you think ?
>
> A.J.
> On Tue, 2003-05-06 at 16:35, Shane Miller wrote:
> > A.J.
> >
> > One option you could do is create a TBitbtn for each using the
> Icon
> as
> > the glyph and the NAME as the text. Then on a mouseover display
> the
> > Description as a hint. This would allow you to put many
> "commands" in
> a
> > small area because the buttons would be pretty small.
> >
> > Otherwise you could use a Listview with the Icon and Text
> displayed
> and
> > the Description again being the hint.
> >
> > A TTreeView would work too. Expanding the item would display the
> > description.
> >
> > If you categorized the commands then you could list them by
> category
> on
> > separate tabs which would allow you to break them into smaller
> parts
> and
> > make them easier to display.
>
=== message truncated ===
_________________________________________________________
Do You Yahoo!?
La mejor conexión a internet y 25MB extra a tu correo por $100 al mes. http://net.yahoo.com.mx
More information about the Lazarus
mailing list