[Lazarus] help needed making an ide extension

Marc Santhoff M.Santhoff at web.de
Thu Aug 13 00:06:34 CEST 2015


On Mi, 2015-08-12 at 23:17 +0200, Mattias Gaertner wrote:
> On Wed, 12 Aug 2015 21:16:22 +0200
> Marc Santhoff <M.Santhoff at web.de> wrote:
> 
> >[...]
> > 1. Is it correct that to make an extension basically all I have to do is
> > write the code that
> > - adds a menu entry for starting the code
> > - save it as a lazarus package and check "register in ide" (or the
> > like ;)
> > and that's the basis for doing something useful?
> 
> Yes, see for example examples/exploremenu.

Good example.

I do not fully understand the creation mechanism. I see an extra
register procedure in "frmexploremenu.pas" that actually sets the menu
entry. I thought a constructor of the extension class would be called.
But since it is a modal form that is done by execution of the menu code.

Instead there is a notify event "FormCreate()", where is that one
called? Is it done that way by convention? Did I miss some piece of
documentation?

> > 2. When I want the user to select a form for the ide expert to work on,
> > a list of available forms is needed. Is iterating over all the projects
> > files and getting the form of a file the right way to go?
> 
> It depends on what you mean with "available".
> For example a project can also access the forms of packages.

Available means all forms the user has created in his own lazarus
project. He will want to place components there and forms from foreign
packages are r/o, me thinks. Except when actively working on an opened
package.

Hmm, you're right, not easy to distinguish which is which.

> > Additionally if yes:
> > 
> > The code there:
> > 
> > http://wiki.lazarus.freepascal.org/Extending_the_IDE#Get_unit.2C_designer.2C_form_of_a_file
> > 
> > looks OK, but doesn't it open all the files of a project?
> 
> It opens all forms of the project.

OK, not what I want. What strategy can be used to get a list of forms in
the users project without having to open them all?

> > And does 
> > 
> > // get form
> > aForm:=aDesigner.Form;
> > 
> > give NIL if the file has no form?
> 
> aDesigner will be nil.

OK.

> > 3. How do I create a new component on a form?
> > For doing so one would need at least a reference to the active form and
> > second a reference to the active component to use as parent.
> 
> Adding a component can be complex.
> See designer/designer.pp TDesigner.MouseUpOnControl AddComponent.

Uff. Lots of safety belts, some tricky looking code for calculating
bounds, but in general it answers my question.

Seems to be necessary to inform the IDE about changing the form.
 
> > Afterwards, will the new component created and have owner, parent and
> > essential properties set and then added, like I would do in any other
> > program creating components in code at runtime or is there another way
> > (sth. like "IDEDoCreateComponetntAndAdd(newcomponent.class)")?
> 
> Maybe such a function can be added to the IDEIntf.

In principle making something like "designer/designer.pp
TDesigner.MouseUpOnControl AddComponent" publicly available would
suffice.

> Can you give some more details what you are trying to achieve?

I'm only learning how to do basic actions. Playing around, that is.

Currently it is planned to show a list of available forms and let the
user select one. Then he would select the parent component for one or
more new components to insert. All done from a modal form, and if
feasible it will evolve to some sort of multi step "wizard" or
"assistant" dialog triggering complex actions.

Many thanks,
Marc

-- 
Marc Santhoff <M.Santhoff at web.de>





More information about the Lazarus mailing list