Как пользоваться TFrame

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как пользоваться TFrame

Сообщение Sharfik » 11.05.2023 02:13:35

Есть вопрос по Frame....Есть разница принципиальная, использовать PageControl с внедренными на него TForm или TFrame?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Как пользоваться TFrame

Сообщение Alex2013 » 11.05.2023 07:27:12

Я обычно использую PageControl с TPanel но вообще PageControl заметно менее гибок чем TabControl.(Особенно если страницы создаются динамически и нет желания или возможность поддерживать их содержимое в неактивной форме ) Но даже TabControl все же уступает возможностям которые может предоставить его простой аналог написанный самостоятельно. ( Например если нужно вертикальное расположение селектора страниц с произвольной привязкой (то есть нужна одна часть селекторов вверху, а другая внизу окна или еще что-то в этом духе ) )
Зы
На скрине виден и PageControl ( перекрасить стандартный PageControl отдельный "подвиг") и его вертикальный аналог ( Слева ) + видно отдельно расположенный пункт "Настройки"
Изображение
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: Как пользоваться TFrame

Сообщение Sharfik » 12.05.2023 01:51:33

Вот сделать вертикальное управление ноль проблем. У меня две программы так работают(https://sites.google.com/site/engassistent). Табы отключены и переключение по индексам.
Но:
1) Меня напрягает что классический интерфейс заточен для работы через клавиатуру, и теоретически PageControl наверно как то можно переключать в обход клавой.
2) При падении программы, все окна разлетаются во все стороны делая UnDock.
3) Рамочка! Я не нашел как убрать рамку у PageControl когда табы отключены.

**цеплял формы через ManualDock()
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Как пользоваться TFrame

Сообщение sts » 12.05.2023 09:20:38

Sharfik писал(а):Есть вопрос по Frame....Есть разница принципиальная, использовать PageControl с внедренными на него TForm или TFrame?

Не знаю как в лазарусе, исходники смотреть надо, в делфе бывали глюки, дело в том что есть функция типа GetParentForm для компонента (по памяти пишу) и некоторые вещи не работали так как она возвращала задоченную форму а не ту в которую задочили, что требуется по логике, переход на фрейм решал.
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Как пользоваться TFrame

Сообщение Sharfik » 12.05.2023 23:04:57

Что то такое было, не помню уже точно. Кажется не реагировали TActions на обработку Update в задоченных окнах.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Как пользоваться TFrame

Сообщение Alex2013 » 13.05.2023 00:27:13

Sharfik писал(а):1) Меня напрягает что классический интерфейс заточен для работы через клавиатуру, и теоретически PageControl наверно как то можно переключать в обход клавой.

Не теоретически ( подтверждаю PageControl действительно пусть не очень ловко но клавишами переключается), оданко то же самое умеет и самописная приблуда (подробно описать механику чуть нудно но в принципе главная идея тут в том что "все возможно")
2) При падении программы, все окна разлетаются во все стороны делая UnDock.

Ну у меня там имитация "монолита UWP " реализация и поведение советующие. (то есть UnDock невозможен принципиально )
А еще я кое где вставляю "внешний" ТForm прямо в панель.
Sharfik писал(а):3) Рамочка! Я не нашел как убрать рамку у PageControl когда табы отключены

Можно сделать так-же как и при "перекрашивании забора" перекрыть TPageControl и перерисовать ( Можно прямо поверх стандартной прорисовки мерцать при двойной буферизации по идее не должно )
Зы
"Перекрашивание забора"
Код: Выделить всё
  TPageControl = class(ComCtrls.TPageControl)
  private
    procedure CNDrawItem(var Message: TWMDrawItem); message WM_DRAWITEM;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

procedure TPageControl.CNDrawItem(var Message: TWMDrawItem);
var
  BrushHandle: HBRUSH;
  BrushColor: COLORREF;
  FontHandle: HFONT;
  FontColor: COLORREF;
  FontObject: TLogFont;

  begin
  GetObject(Font.Handle, SizeOf(FontObject), @FontObject);

  with Message.DrawItemStruct^ do
  begin
    BrushColor :=$383838;

if  itemID= self.ActivePageIndex then
    Begin
     BrushColor := RGB(225, 24, 33);
    end ;

    BrushHandle := CreateSolidBrush(BrushColor);
    Windows.FillRect(hDC, rcItem, BrushHandle);
    FontObject.lfItalic := 1;
    FontObject.lfCharSet := FS_CYRILLIC ;// Интересно, а fs_utf8 есть ?
    FontHandle := CreateFontIndirect(FontObject);
    Windows.SelectObject(hDC, FontHandle);
    Windows.SetBkMode(hDC, TRANSPARENT);
    Windows.SetTextColor(hDC,clWhite );
    Windows.DrawTextEx(hDC, PChar(UTF8_CP1251(Page[itemID].Caption)), -1, rcItem, DT_CENTER or
      DT_VCENTER or DT_SINGLELINE, nil);
   Windows.DeleteObject(FontHandle);
  end;
  Message.Result := 1;
end;

procedure TPageControl.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    if not (csDesigning in ComponentState) then
      Style := Style or TCS_OWNERDRAWFIXED;
  end;
end;

Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: Как пользоваться TFrame

Сообщение Sharfik » 06.11.2023 07:07:08

А как обновить фрейм? Если его добавляешь на форму, то он в таком виде и остается, хотя сам pas файл и визуальная часть уже давно изменились. Удалить-Вставить новый как то дико....
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Как пользоваться TFrame

Сообщение Alex2013 » 06.11.2023 23:06:05

Sharfik писал(а):А как обновить фрейм? Если его добавляешь на форму, то он в таком виде и остается, хотя сам pas файл и визуальная часть уже давно изменились. Удалить-Вставить новый как то дико....

У меня "есть и так и эдак" но вообще (ИМХО) надежнее всего делать разные варианты прорисовки фрема без "теневого сохранения" его содержимого. То есть полная динамика прорисовки-заполнения одного фрема вместо поддержки нескольких "фоновых фреймов". Там где нужны стандартные диалоги можно вставить полностью готовую ( и что не маловажно независимую ) форму прямо в панель (ничего "дикого" в её многократном удалении и вставке нет, тем более, что в современных программах "классические диалоги" сохранились разве что в настройках или формах ввода данных в БД ) . Но для основных информационно-медийно-счетных режимов честная "вариативная перерисовка" заметно все упрощает. ( хотя бы тем там нужен единственный набор обработчиков событий которой будет четко отлеживать только текущий режим при полной логической невозможности разных накладок (борьба с обработкой "чужих событий"и уходом фокуса в "другую фазу" (угу "никогда такого не было и вот опять" ... ) это вечный мрачный мрак "скрытых фреймов"))
Зы
Да это не про "дизайн-тайм", но если делать программу более динамической, то любые проблемы с "дизайн-тайм" заметно отходят на второй план. :idea:
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: Как пользоваться TFrame

Сообщение Sharfik » 07.11.2023 02:21:36

Дикость какая то...
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Как пользоваться TFrame

Сообщение Sharfik » 26.11.2023 06:02:04

О!
https://www.cyberforum.ru/lazarus/thread2035342.html
Закрыть визуальное представление формы и открыть ее заново через "Переключение модуль/форма(F12)" обновляет фрейм.
Не все(RxDbGrid не обновляется по столбцам), но хоть что то.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru