На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Друзья, соблюдайте, пожалуйста, правила форума и данного раздела:
Данный раздел не предназначен для вопросов и обсуждений, он содержит FAQ-заготовки для разных языков программирования. Любой желающий может разместить здесь свою статью. Вопросы же задавайте в тематических разделах!
• Если ваша статья может быть перенесена в FAQ соответствующего раздела, при условии, что она будет оформлена в соответствии с Требованиями к оформлению статей.
• Чтобы остальным было проще понять, указывайте в описании темы (подзаголовке) название языка в [квадратных скобках]!
Модераторы: Модераторы
  
> Форма на основе контрола-контейнера , [Delphi] Диалоговые формы на основе контрола-контейнера, без отдельного DFM
    Форма на основе контрола-контейнера

    Очень часто бывает, что возможностей стандартных диалогов не хватает, но и отдельный файл формы заводить под пару нестандартных контролов неохота. Формировать динамически - большая морока. Можно юзать Winapi диалоги, но с ними свои нюансы, да и удобство обработки событий несравнимо с VCL. Мне пришла в голову идея, как просто накидывать интерфейс диалогов без необходимости заводить файл формы - достаточно кинуть на главную форму контрол-контейнер (panel, pagecontrol, groupbox), сделать его невидимым и создать интерфейс на нём. После чего с помощью нижеприведенной функции сгенерировать форму с контролами, скопированными с этого контейнера.

    ExpandedWrap disabled
      function FormFromControl(Container: TWinControl): TForm;
      var
        CtrlClass: TControlClass;
        Ctrl: TControl;
        ms: TMemoryStream;
        i: Integer;
      begin
        Result := TForm.Create(nil);
        Result.ClientHeight := Container.Height;
        Result.ClientWidth := Container.Width;
       
        ms := TMemoryStream.Create;
       
        for i := 0 to Container.ControlCount - 1 do
        begin
          CtrlClass := TControlClass(Container.Controls[i].ClassType);
          // Enable component to be read
          RegisterClass(CtrlClass);
          // Clone component via stream
          ms.WriteComponent(Container.Controls[i]);
          ms.Position := 0;
          Ctrl := CtrlClass.Create(Result); // To assign Parent before restoring from stream
          Ctrl.Parent := Result;
          ms.ReadComponent(Ctrl);
          ms.Position := 0;
        end;
       
        FreeAndNil(ms);
      end;
       
      // Пример
      procedure TForm1.btnClick(Sender: TObject);
      begin
        with FormFromControl(PageControl1.Pages[0]) do
        begin
          BorderStyle := bsDialog;
          Caption := 'Dialog from PageControl';
          Position := poScreenCenter;
          // assign handlers...
          ShowModal;
          Free;
        end;
      end;


    Для большого количества диалогов можно сделать так:
    1 - завести отдельную форму
    2 - на нее PageControl, для удобства переключения между диалогами в дизайн-тайм
    3 - на каждый TabSheet PageControl-а - Panel или GroupBox, для задания габаритов диалога
    4 - указывать эти Panel или GroupBox в качестве параметров FormFromControl
      Цитата Fr0sT @
      Для большого количества диалогов можно сделать так:
      1 - завести отдельную форму
      2 - на нее PageControl, для удобства переключения между диалогами в дизайн-тайм
      ...

      А какой тогда смысл создавать новую форму и копировать на нее контролы, если можно использовать существующую, просто установив активную страницу PageControl-а и скрыв ярлычки остальных страниц? Не устраивает рамка (и визульный стиль)? Можно древний TNotebook времен Win 3.1 использовать ;)
        leo, сценарий использования такой - есть форма с интерфейсом, возможно даже главная, и некоторые действия юзера запускают диалоги. Естественно, для этого нужны отдельные окна (вариант с попап-рамкой а-ля диалоги на веб-страницах тоже подходит, но это муторно).
          А нет решений попроще?
            Проще - по форме на каждый диалог.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0213 ]   [ 16 queries used ]   [ Generated: 19.03.24, 06:35 GMT ]