unit uIdeMenuNvComponents; interface uses Classes, SysUtils, Dialogs, Forms, Windows, ToolsApi, uIdeMenuObject; type TIdeMenuNvComponents = class(TIdeMenuObject) function ItemName: String; override; function Caption: String; override; function ShortCut: String; override; function Order: Integer; override; procedure Execute(Sender: TObject); override; end; implementation function TIdeMenuNvComponents.ItemName: String; begin Result := 'ToggleNonVisualComponents'; end; function TIdeMenuNvComponents.Caption: String; begin Result := '&Toggle non-visual components'; end; function TIdeMenuNvComponents.ShortCut: String; begin Result := 'Ctrl+H'; end; function TIdeMenuNvComponents.Order: Integer; begin Result := 0; end; procedure TIdeMenuNvComponents.Execute(Sender: TObject); function GetFormEditor: IOTAFormEditor; var Module : IOTAModule; Editor : IOTAEditor; FormEditor: IOTAFormEditor; i : Integer; begin // Standaard resultaat FormEditor := nil; // Bepaal de huidige module Module := (BorlandIDEServices as IOTAModuleServices).CurrentModule; // Als die gevonden is, zoek dan naar de editors ervan if Assigned(Module) then begin // Loop door de module files for i := 0 to Module.GetModuleFileCount - 1 do begin // Probeer een referentie naar de module file editor te krijgen Editor := Module.GetModuleFileEditor(i); // Als referentie niet gevonden kan worden, laat dan maar zitten if not Assigned(Editor) then Break; // Anders, controleer of het ook daadwerkelijk een form editor is. if (Editor.QueryInterface(IOTAFormEditor, FormEditor) = S_OK) then Break; end; end; // Geef resultaat terug en laat alle interface references los Result := FormEditor; Module := nil; Editor := nil; FormEditor := nil; end; function ToggleNVsCallback(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; var cClassName: array[0..255] of Char; begin // Bepaal de class van het "window" FillChar(cClassName, SizeOf(cClassName), #0); GetClassName(hWnd, @cClassName, SizeOf(cClassName)); // Als het een TContainer is dan is het een non-visual component. // Toggle deze. if String(cClassName) = 'TContainer' then begin if not IsWindowVisible(hWnd) then ShowWindow(hWnd, SW_SHOW) else ShowWindow(hWnd, SW_HIDE); end; // Geef aan Windows door dat we door willen gaan met het volgende childwindow Result := True; end; procedure ToggleNVs(Form: TCustomForm); begin // Vraag alle child window handles aan en voer voor elk van de een procedure uit EnumChildWindows(Form.Handle, @ToggleNVsCallback, 0); end; var FormEditor : IOTAFormEditor; Component : IOTAComponent; begin // Verkrijg een referentie naar de form editor FormEditor := GetFormEditor; // Als die er is, ga dan aan de slag if Assigned(FormEditor) then begin // Bepaal het root component (het form) Component := FormEditor.GetRootComponent; // Als dat er is en het is een TCustomForm descendant, toggle daarvan // dan de non-visual components if ( (Assigned(Component)) and (TComponent(Component.GetComponentHandle) is TCustomForm) ) then begin // Voer de toggle uit ToggleNVs(TCustomForm(Component.GetComponentHandle)); end; end; end; end.