Доделаю пример посложнее, близкий к реальности - выложим.
Вообще, Мартин недолюбливает этот тип программ и делал MDI через "не хочу", исключительно по настоянию трудящихся. Сделано на базе "docking forms".
Насчет "посложнее" - хорошая идея оказалась
Модератор: Модераторы
Доделаю пример посложнее, близкий к реальности - выложим.
Вообще, Мартин недолюбливает этот тип программ и делал MDI через "не хочу", исключительно по настоянию трудящихся. Сделано на базе "docking forms".
debi12345 писал(а):GrayEddy писал(а):Как реализовать поддержку MDI? Неясно, как подступиться. Хорошо бы осветить эту тему подробно.
GrayEddy писал(а):Спасибо. Буду(ем) ждать.
http://brefi.narod.ru/mdi_example.tar.gz
Спрашивайте - если что !
Miha писал(а):Если задать очень длинный caption для tsubform1fo, типа
subfo.frame.caption := 'very very very very very very very very very very very very very very very long caption';
чтобы текст заголовка был шире формы, правая граница формы "уезжает",
ну и ведет себя форма неадекватно.
кликаю по кнопочке со стрелочкой вниз кнопачки проподают =(
debi12345 писал(а):У меня просто появляется горизонтальный скроллбар (как и должно быть ). А у вас ?
Можно поподробнее ?
Alexander писал(а):Да, Мартин в очередной раз сделал удивительную вещь !
Никогда не видел ещё, чтобы mdi окно становилось самостоятельным, и
обратно.
Надо текст урезать по ширине.
Alexander писал(а):И ещё мелочь. Хотел нарисовать свои картинки для кнопок
"поверх/ниже остальных" но не понял куда их надо вставлять. И вообще
интересно как этот процесс выглядит ? Я имею ввиду чтобы стрелки указывали не вверх/вниз, а вглубь/на себя.
//-----------------
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.
//---------------------
Так как сейчас (из Линукса ) не могу залить новую версию проекта на "народ.хрю"
Miha писал(а):завиртуалить функцию tdockcontroller.setmdistate, дабы иметь возможность ее заоверридить, событие OnMDIStateChanged не годится, т.к. не хочется забивать событие в объекте предке.
Alexander писал(а):Так как сейчас (из Линукса ) не могу залить новую версию проекта на "народ.хрю"
А почему ? Я запросто - через MC.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1