Обсуждение развития MSEide + MSEgui

Вопросы программирования и использования MSEide + MSEgui.

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

Сообщение debi12345 » 12.03.2007 08:20:26

Доделаю пример посложнее, близкий к реальности - выложим.
Вообще, Мартин недолюбливает этот тип программ и делал MDI через "не хочу", исключительно по настоянию трудящихся. Сделано на базе "docking forms".

Насчет "посложнее" - хорошая идея оказалась ;) Кое-какие нюансы выплыли ! И крутые невизуальные компоненты для реализации этих нюансов.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 » 12.03.2007 21:16:26

debi12345 писал(а):
GrayEddy писал(а):Как реализовать поддержку MDI? Неясно, как подступиться. Хорошо бы осветить эту тему подробно.

Тестовый проект готов - но выложить пока не могу. NAROD.RU недоступен.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение GrayEddy » 12.03.2007 23:38:50

Спасибо. Буду(ем) ждать. :wink:
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение debi12345 » 13.03.2007 08:14:08

GrayEddy писал(а):Спасибо. Буду(ем) ждать. :wink:

http://brefi.narod.ru/mdi_example.tar.gz
Спрашивайте - если что !
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Attid » 13.03.2007 15:50:08

http://brefi.narod.ru/mdi_example.tar.gz
Спрашивайте - если что !


tsubform1fo, дизайн тайм
кликаю по кнопочке со стрелочкой вниз кнопачки проподают =(
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Miha » 15.03.2007 22:36:35

Если задать очень длинный caption для tsubform1fo, типа
subfo.frame.caption := 'very very very very very very very very very very very very very very very long caption';
чтобы текст заголовка был шире формы, правая граница формы "уезжает", ну и ведет себя форма неадекватно.
Аватара пользователя
Miha
новенький
 
Сообщения: 16
Зарегистрирован: 07.01.2006 15:04:42

Сообщение debi12345 » 16.03.2007 08:21:33

Miha писал(а):Если задать очень длинный caption для tsubform1fo, типа
subfo.frame.caption := 'very very very very very very very very very very very very very very very long caption';
чтобы текст заголовка был шире формы, правая граница формы "уезжает",

У меня просто появляется горизонтальный скроллбар (как и должно быть ). А у вас ?

ну и ведет себя форма неадекватно.

Можно поподробнее ?
(у себя, на проекте "mdiexample", никаких аномалий не заметил - хотя "помучал" форму неслабо).

кликаю по кнопочке со стрелочкой вниз кнопачки проподают =(

Пофиксено.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Miha » 16.03.2007 18:30:14

debi12345 писал(а):У меня просто появляется горизонтальный скроллбар (как и должно быть ). А у вас ?

http://my-files.ru/Img_mdi_example1.gif
Аватара пользователя
Miha
новенький
 
Сообщения: 16
Зарегистрирован: 07.01.2006 15:04:42

Сообщение Alexander » 17.03.2007 02:46:18

Да, Мартин в очередной раз сделал удивительную вещь !
Никогда не видел ещё, чтобы mdi окно становилось самостоятельным, и
обратно.

Можно поподробнее ?


Точно есть такая проблема,
видна при проектировании и есть при запуске:

Изображение

Надо текст урезать по ширине.

И ещё мелочь. Хотел нарисовать свои картинки для кнопок
"поверх/ниже остальных" но не понял куда их надо вставлять. И вообще
интересно как этот процесс выглядит ? Я имею ввиду чтобы стрелки указывали не вверх/вниз, а вглубь/на себя.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 816
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение debi12345 » 19.03.2007 09:27:37

Alexander писал(а):Да, Мартин в очередной раз сделал удивительную вещь !
Никогда не видел ещё, чтобы mdi окно становилось самостоятельным, и
обратно.

У Мартина - просто удивительная способность все продумывать и находить "выходы" и "лазейки". В данном случае он считает, что MDI - всего лишь частный случай от "docking", и, как результат - используется весь docking-сервис.

Надо текст урезать по ширине.

Там нужно использовать "caption" другого элемента. См. (тема "FAQs" ) обновленный пример.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 » 21.03.2007 19:12:15

Alexander писал(а):И ещё мелочь. Хотел нарисовать свои картинки для кнопок
"поверх/ниже остальных" но не понял куда их надо вставлять. И вообще
интересно как этот процесс выглядит ? Я имею ввиду чтобы стрелки указывали не вверх/вниз, а вглубь/на себя.

Ответ:
Эти символы - не картинки, они рисуются командами отрисовки линий - чтобы масшабироваться под переменный шаг сетки.
Чтобы нарисовать свой вариант кнопоки - создайте класс-наследник от tgridframe, в нем перепишите метод drawgripbutton, а также перепишите tdoskform.internalcreateframe.

Так как сейчас (из Линукса ) не могу залить новую версию проекта на "народ.хрю" , то смотрите измененный юнит здесь :

Код: Выделить всё
//-----------------

unit subform1;
{$ifdef FPC}{$mode objfpc}{$h+}{$INTERFACES CORBA}{$endif}

interface

uses
msegui,mseclasses,mseforms,msedock,msedataedits,msegraphics,msegraphutils,classes;

type

// наш самопальный класс управления обрамлением,
// содержащий видоизмененную процедуру
// рисования кнопок
  mygripframety = class (tgripframe)
  protected
// и сама эта процедура
   procedure drawgripbutton(
    const acanvas: tcanvas;
    const kind: dockbuttonrectty;
    const arect: rectty;
    const acolorglyph,acolorbutton: colorty
   ); override;
  end;

tsubform1fo = class(tdockform)
   tstringedit1: tstringedit;
   procedure subformactivated(const sender: TObject);
   procedure subformdestroyed(const sender: TObject);
  protected
// перезаписываем, чтобы для рисования
// обрамления использовать наш код
   procedure internalcreateframe; override;   
end;
 
var
mygripframe: mygripframety;
   
implementation

uses
subform1_mfm,
mainform,
mseshapes
;

// Вспомогательная функция - чтобы сузить зону рисования
// крестиков в пределах кнопок ( для красоты )
//
function scalerect(const arect: rectty; ascale: extended = 1; acenter: boolean = true):rectty;
begin
with arect do begin
  result.cx:= round(cx * ascale);
  result.cy:= round(cy * ascale);
  if acenter then begin
   result.x:= round(x + cx*(1 - ascale)/2);
   result.y:= round(y + cy*(1 - ascale)/2);
  end;
end;
end;

procedure tsubform1fo.subformactivated(const sender: TObject);
begin
mainfo.subformactivated(self);
end;

procedure tsubform1fo.subformdestroyed(const sender: TObject);
begin
mainfo.listchanged;
end;

// рисуем кнопочки
procedure mygripframety.drawgripbutton(
    const acanvas: tcanvas;
    const kind: dockbuttonrectty;
    const arect: rectty;
    const acolorglyph,acolorbutton: colorty
);
var
lw: integer;
begin
with acanvas,arect do begin
// ширину линий нкжно будет
// восстановить перед выходом
  lw:= linewidth;

// анализируем, запрос на рисование
// какой кнопки поступил

  case kind of

// кнопка закрытия субформы   
   dbr_close: begin
// будет на кровавом фоне
    fillrect( arect, cl_red);   
// жирными линиями
    linewidth:= 3;   
// для большой кнопки - нарисовать заметный контур   
    if grip_size >= 8 then begin
     draw3dframe(acanvas, arect,1,defaultframecolors);
// рисуем жирный желтый крест на алом фоне
     drawcross(inflaterect(scalerect(arect,0.8),-2),cl_yellow);
// маленькую кнопку рисовать сразу
    end else begin
// рисуем жирный желтый крест на алом фоне
     drawcross(scalerect(arect,0.8),cl_yellow);
    end;
// все остальные кнопки доверяем рисовать MSEgui   
   end;
   else begin
// вызов "drawgripbutton" родного обрамления субформы
    inherited;
   end;
   
  end;
// восстанавливаем ширину линий
  linewidth:= lw;
end;
end;

// при создании обрамления - связывем его 
// с нашим классом управления обрамлением
procedure tsubform1fo.internalcreateframe;
begin
mygripframety.create(iframe(self),dragdock);
end;

end.
//---------------------
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Alexander » 21.03.2007 20:00:21

Спасибо, классно !

Так как сейчас (из Линукса ) не могу залить новую версию проекта на "народ.хрю"


А почему ? Я запросто - через MC.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 816
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение Miha » 21.03.2007 22:28:13

Я продвинулся в изготовлении "рыбы" для MDI http://mihafpc.narod.ru/MDISample.tar.gz
Просьба к debi12345 заказать у Мартина завиртуалить функцию tdockcontroller.setmdistate, дабы иметь возможность ее заоверридить, событие OnMDIStateChanged не годится, т.к. не хочется забивать событие в объекте предке.
Аватара пользователя
Miha
новенький
 
Сообщения: 16
Зарегистрирован: 07.01.2006 15:04:42

Сообщение debi12345 » 22.03.2007 08:45:42

Miha писал(а):завиртуалить функцию tdockcontroller.setmdistate, дабы иметь возможность ее заоверридить, событие OnMDIStateChanged не годится, т.к. не хочется забивать событие в объекте предке.

Сделано, плюс еще несколько методов.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 » 22.03.2007 08:48:53

Alexander писал(а):
Так как сейчас (из Линукса ) не могу залить новую версию проекта на "народ.хрю"

А почему ? Я запросто - через MC.

Не пойму в чем прикол. перепробовал уже несколько способов -с разными настройками.

Короче, новый пример с "своими" кнопками залит на :
http://brefi.narod.ru/mdi_example2.tar.gz
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Пред.След.

Вернуться в MSEide + MSEgui

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

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

Рейтинг@Mail.ru