Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a non visual component without any icon on the form?

Tags:

delphi

I would like to create a non visual component (like TTimer for example) that I can drop on the form and that I can set up directly from the Object Inspector, but I don't want to see its icon on the form (it'd just obstruct anything). For example TFloatAnimation works like this but I don't understand how.

like image 854
zeus Avatar asked Dec 18 '25 19:12

zeus


1 Answers

The GExperts library (http://www.gexperts.org/) has a plug-in which can toggle the visibility of non-visual components on a form, and it is apparently not Delphi-version-specific but it is not exactly trivial.

The method which does this is

    procedure THideNonVisualCompsExpert.ToggleNonVisualVisible(Form: TCustomForm);
    const
      NonVisualClassName = 'TContainer';
    var
      VisibleState: Boolean;
      FormHandle: THandle;
      CompHandle: THandle;
      WindowClass: string;
      FirstCompFound: Boolean;
      WinControl: TWinControl;
      ChildControl: TWinControl;
      i: Integer;
    begin
      Assert(Assigned(Form));
      Assert(Form.Handle > 0);
      FirstCompFound := False;
      WinControl := Form;
      if InheritsFromClass(WinControl.ClassType, 'TWinControlForm') then
      begin
        for i := WinControl.ComponentCount - 1 downto 0 do
        begin
          if WinControl.Controls[i] is TWinControl then
          begin
            ChildControl := WinControl.Controls[i] as TWinControl;
            if InheritsFromClass(ChildControl.ClassType, 'TCustomFrame') then
            begin
              WinControl := ChildControl;
              Break;
            end;
          end;
        end;
      end;

      FormHandle := GetWindow(WinControl.Handle, GW_CHILD);
      CompHandle := GetWindow(FormHandle, GW_HWNDLAST);
      VisibleState := False;
      GxOtaClearSelectionOnCurrentForm;

      while (CompHandle <> 0) do
      begin
        WindowClass := GetWindowClassName(CompHandle);
        if AnsiSameText(WindowClass, NonVisualClassName) then
        begin
          if not FirstCompFound then
          begin
            VisibleState := not IsWindowVisible(CompHandle);
            FirstCompFound := True;
          end;
          if VisibleState then
            ShowWindow(CompHandle, SW_SHOW)
          else
            ShowWindow(CompHandle, SW_HIDE);
        end;
        CompHandle := GetWindow(CompHandle, GW_HWNDPREV);
      end;
    end;

in the unit GX_HideNonVisualComps.Pas.

As written, it toggles the visibility of all the non-visual components on the target form, but looking at the code of the ToggleNonVisualVisible method it looks like it ought to be possible (but I have not tried) to adapt it to operate on a selected component class and force instances of the class to a non-visible state. Once you have done that, you would probably need to experiment with how and when to invoke the method at design-time; if I was doing it, I would probably start with somewhere like the target component's Loaded method.

(I would feel more comfortable posting this "answer" as a comment but obviously it would be too long)

like image 77
MartynA Avatar answered Dec 20 '25 12:12

MartynA



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!