Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сворачивание, разворачивание и закрытие компонентов во время выполнения

Delphi , Компоненты и Классы , RTTI

Сворачивание, разворачивание и закрытие компонентов во время выполнения

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 

 This program try to show something at least interesting about those components 
 on the form. You'll see that by the fact they're descendant of TWinControl they 
 can react like a Window. I mean they can be maximized, minimized and so on. 
 If you see a control that not respond to our commands it's because it doesn't 
 descend from TWinControl. I didn't try to deal with them. Well. I believe this 
 program is an open door to great ideas. There's a lot of components that could 
 take advantages of this to manipulate controls on the form. You know a long journey 
 starts on the first step. Here it is. 
 Show me anything great you could do out of these ideas. 
 Good work. 

 Babak Sateli 
 babak_sateli@yahoo.com 

}


 unit MessComps;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, Menus, ExtCtrls;

 type
   TMessing = class(TForm)
     Menu: TMainMenu;
     Options: TMenuItem;
     Minimize: TMenuItem;
     Restore: TMenuItem;
     Hide: TMenuItem;
     Show: TMenuItem;
     N2: TMenuItem;
     Close: TMenuItem;
     Exit_: TMenuItem;
     CloseProgram: TMenuItem;
     Maximize: TMenuItem;
     Memo: TMemo;
     Move: TMenuItem;
     ChangeSize: TMenuItem;
     N1: TMenuItem;
     N3: TMenuItem;
     Target: TMenuItem;
     procedure Procede(Sender: TObject);
     procedure TargetClick(Sender: TObject);
   end;

 var
   Messing: TMessing;
   n: Integer;
   AllOfThem: Boolean = True;

 implementation
 {$R *.DFM}

 procedure TMessing.Procede(Sender: TObject);
 var
   n, Tag: Integer;
   T: TComponent;
   ParentClass: TClass;
   OkToProcede: boolean;
   Comando: Word;
   HasTheFocus: Boolean;
 begin
   // As the menu itens do pratically the same thing we directed them all to here. 
  // Their tag properties are different so we could know who called us. 
  // Save this. We'll need it 
  Tag := (Sender as TMenuItem).Tag;
   case (Sender as TMenuItem).Tag of
     // Oh! You just click options but you're already here. You didn't choose one 
    // yet so exit. 
    0: Exit;
     // Now we have the options. Change comando accordingly to reflect our option. 
    1: COMANDO := SW_MINIMIZE;
     2: COMANDO := SW_MAXIMIZE;
     3: COMANDO := SW_RESTORE;
     4: COMANDO := SW_HIDE;
     5: COMANDO := SW_SHOW;
     6: COMANDO := SC_SIZE;
     7: COMANDO := SC_MOVE;
     8: COMANDO := SC_CLOSE;
     9: Application.Terminate;
   end;
   // Now we know the command we are ready to procede.. 
  // So we start looking for the components this form has. 
  for n := 1 to ComponentCount do
   // Well componentCount starts with 1 
  begin
     // but ComponentsList starts with 0 (zero) so we make some adjustment 
    T := Components[n - 1];
     // Now we have the component in our T variable and can ask a few questions 
    ParentClass := T.ClassParent;
     // We want to know its ClassParent. 
    OkToProcede := ParentClass = TWinControl;
     // if it is descendant of TWinControl then it's ok to procede. 
    while (ParentClass  nil) and (OkToProcede = False) do
     begin
       // Oh no! Not yet. Maybe it descends of a lower class that is 
      // descendant of TWinControl. So we keep going back in its "genealogical" 
      // tree to see if we can find TWinControl back there somewhere or get to nil. 
      OkToProcede := ParentClass = TWinControl;
       ParentClass := ParentClass.Classparent;
     end;
     // if we got to nil and didn't find TWinControl then we have nothing to do 
    // this component doen't accept our kinda of commands. 
    if OkToProcede then
     begin
       // Does it has the focus? 
      HasTheFocus := (T as TWinControl).Focused;
       // If not AllOfThem and not has the focus so we break to the next one. 
      if (not AllOfThem) and (not HasTheFocus) then  Continue;
       if Tag then
         // There no SC_SIZE or SC_MOVE or SC_CLOSE command in here so we have to apart. 
        ShowWindow((T as TWinControl).Handle, COMANDO)
       else
         //  CloseWindow((T as TWinControl).Handle ); Doesn't work. It minimize them. 
        //  But this one bellow works. It's possible to show them after closed but 
        //  the controls loose some of their properties. Methinks it's dangerous 
        (T as TWinControl).Perform(WM_SYSCOMMAND, COMANDO, 0);
     end;
   end;
 end;

 // Changing our target 
procedure TMessing.TargetClick(Sender: TObject);
 begin
   if (Sender as TMenuItem).Tag = 40 then
   begin
     (Sender as TMenuItem).Caption := 'Target: the focused one';
     (Sender as TMenuItem).Tag := 41;
     AllofThem := False;
   end
    else
   begin
     (Sender as TMenuItem).Caption := 'Target: all components';
     (Sender as TMenuItem).Tag := 40;
     AllofThem := True;
   end;
 end;

 end.

Привет! Я переведу текст на русский язык:

Код - это приложение Delphi, демонстрирующее использование различных компонентов на форме, таких как меню, кнопки и текстовые поля. Программа включает в себя несколько функций:

  1. Меню: Программа имеет меню с несколькими опциями, включая "Опции", "Уменьшить", "Восстановить", "Скрыть", "Показать", "Изменить размер", "Переместить" и "Закрыть". Эти опции могут использоваться для управления состоянием окна или размером формы.
  2. Список компонентов: Программа перебирает все компоненты на форме и проверяет, являются ли они потомками TWinControl. Если компонент является потомком TWinControl, он может реагировать на команды, такие как уменьшить, восстановить, скрыть, показать, изменить размер или переместить.
  3. Целевой компонент: Программа включает в себя два пункта меню - "Целевой компонент: фокусированный" и "Целевой компонент: все компоненты". Эти опции позволяют пользователю указать, какой компонент должен быть затронут программой.

Вот несколько предложений по улучшению кода:

  1. Организация кода: Код слишком длинный и может быть организован в отдельные процедуры или функции для лучшей читаемости.
  2. Обработка ошибок: В коде нет обработки ошибок, что означает, что если возникнет неожиданная ситуация (например, компонент не является потомком TWinControl), программа может рухнуть или поведаться неожиданно.
  3. Комментарии к коду: Хотя есть некоторые комментарии к коду, они могли бы быть более подробными и полезными для человека, который не знаком с кодом.
  4. Имена переменных: Некоторые имена переменных, такие как n, Tag и OkToProcede, не очень описательны. Лучше использовать более значимые имена, которые указывают на то, что каждый переменная представляет.
  5. Воспроизведение кода: Программа имеет некоторые повторяющиеся части кода, которые могли бы быть извлечены в отдельные процедуры или функции для более простой поддержки.

Вот пример улучшения кода:

type
  TMessing = class(TForm)
    // ...
  end;

procedure TForm1.Procede(Sender: TObject);
var
  Component: TComponent;
  HasFocus: Boolean;
begin
  // Перебираем все компоненты на форме
  for i := 0 to ComponentCount - 1 do
  begin
    Component := Components[i];
    if Component is TWinControl then
    begin
      // Проверяем, имеет ли компонент фокус
      HasFocus := (Component as TWinControl).Focused;
      // Выполняем действие в зависимости от команды и состояния фокуса
      case Sender.Tag of
        1: ShowWindow((Component as TWinControl).Handle, SW_MINIMIZE);
        2: ShowWindow((Component as TWinControl).Handle, SW_MAXIMIZE);
        // ...
      end;
    end;
  end;
end;

procedure TForm1.TargetClick(Sender: TObject);
begin
  if (Sender as TMenuItem).Tag = 40 then
  begin
    (Sender as TMenuItem).Caption := 'Целевой компонент: все компоненты';
    (Sender as TMenuItem).Tag := 40;
    AllOfThem := True;
  end
  else
  begin
    (Sender as TMenuItem).Caption := 'Целевой компонент: фокусированный';
    (Sender as TMenuItem).Tag := 41;
    AllOfThem := False;
  end;
end;

Обратите внимание, что это только пример и может не компилироваться или работать неправильно без дополнительных изменений.

Созданная программа демонстрирует управление компонентами на форме, таких как сворачивание, разворачивание и закрытие, а также изменение размера и перемещения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: RTTI ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-05 20:17:12/0.028918027877808/1