Доделаю пример посложнее, близкий к реальности - выложим.
Вообще, Мартин недолюбливает этот тип программ и делал 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.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6