-
Доброго времени суток.
D2010, KOLMCK - последний
Есть такая структура контролов:
PanelMain (align=top) PanelL (align=left; Parent=PanelMain) PanelC (align=client; Parent=PanelMain) PanelCT (align=top; Parent=PanelC) PanelCC (align=client) PanelCCR1 (align=right) PanelCCR2 (align=right) PanelCCC (align=client)
Имеется PanelCC.OnResize в которой PanelCCR1 и PanelCCR2 делаются видимыми или невидимыми в зависимости от PanelCC.Width>PanelCCR1.Width + PanelCCR2.Width + 8, ну и само собой PanelССС.Width должна быть остатком от PanelCC.Width-(PanelCCR1.Width + PanelCCR2.Width) - Align должен это делать.
Так вот: При максимизации формы PanelCCC не выравнивается по Align! Если их PanelCCR1 и PanelCCR2 делать caLeft - то всё норм. Оконная процедура присвоена, вызывается, но не всегда. Менял OLD_ALIGN/NEW_ALIGN, делал вручную в OnResize, без толку.
Более того, OnResize почему-то вызывается перед Align (только при максимизации формы)
Кто сталкивался и чем лечил?
PS: понимаю, что можно перехватить WM_MAXIMIZE/WM_RESTORE, но это не выход.
PPS: заранее 10х
-
Ах да, забыл. Это всё в динамическом фрейме, коих главная форма делает несколько.
-
а динамический фрейм - это PanelMain?
-
ЧЯДНТ? ---------------------------------------------- UNIT1.pas ---------------------
unit Unit1;
interface
uses Windows, Messages, KOL , mirror, Classes, Controls, mckCtrls, mckObjs, Graphics ;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, mirror;
type
PForm1 = ^TForm1;
TForm1 = object(TObj)
Form: PControl;
TForm1 = class(TForm)
KOLProject1: TKOLProject;
KOLForm1: TKOLForm;
procedure KOLForm1FormCreate(Sender: PObj);
private
public
end;
var
Form1 : PForm1 : TForm1 ;
procedure NewForm1( var Result: PForm1; AParent: PControl );
implementation
uses Unit2;
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var Fr: PForm2;
i: Integer;
begin
for i := 1 to 3 do
begin
newForm2(Fr, Form);
Fr.Form.Parent := Form;
Fr.Form.Visible := TRUE;
end;
end;
end.
-------------------------------------- UNIT2.pas ---------------------------
unit Unit2;
interface
uses Windows, Messages, KOL , mirror, Classes, Controls, mckCtrls, mckObjs, Graphics ;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
PForm2 = ^TForm2;
TForm2 = object(TObj)
Form: PControl;
TForm2 = class(TForm)
KOLFrame1: TKOLFrame;
PanelL: TKOLPanel;
PanelC: TKOLPanel;
PanelCT: TKOLPanel;
PanelCC: TKOLPanel;
PanelCCR1: TKOLPanel;
PanelCCR2: TKOLPanel;
PanelCCC: TKOLPanel;
private
public
end;
var
Form2 : PForm2 : TForm2 ;
procedure NewForm2( var Result: PForm2; AParent: PControl );
implementation
end. --------------------------------------------- нормально: http://savepic.net/4155072.png--------------------------------------------- после максимизации: http://savepic.net/4138688.png--------------------------------------------- Delphi 7, Windows XP. Запуск откомпилированного exe в Win7 - результат тот же. 1) Проверьте, что не используете TKOLTabPage вместо панели. 2) Что не используете Anchor'ы А вообще, такое количество вложенных панелей наводит на мысль, что может быть Anchor'ы вместо панелей может быть как раз бы были лучше. 3) Если не помогает, или модель не соответствует приложенной, выложите свой вариант кода.
-
Владимир, если они Align=Top|Bottom - всё норм. Косяк если Left. Между ними ещё сплиттер, который работает прекрасно, если его двигать - косяка не наблюдается. Аттаченные процедуры вызываются нормально, но при максимизации как будто пропадает кусок кода... Чуть позже выложу исходник.
-
Cobalt, фреймы - PanelL и PanelC в данном примере. PanelMain - это контейнер для фреймов на главной форме. Т.е. PanelL имеет такую же структуру что и PanelC.
-
Владимир, вот сорцы тестовой программки, где можно наблюдать сие. ---------------------- _main_1.inc
procedure NewMain( var Result: PMain; AParent: PControl );
begin
Result := PMain.Create;
New( Result, Create );
Result.Form := NewForm( AParent, #77#97#105#110 ).TabulateEx.SupportMnemonics;
Applet := Result.Form;
Result.Form.Add2AutoFree( Result );
Result.Form.Font.FontHeight := -11;
Result.Form.Border := 0;
Result.pnlMain := NewPanel( Result.Form, esNone ).SetAlign ( caClient ).SetBorder( 0);
Result.pnlMain.OnResize := Result.KOLFormResize;
Result.KOLFormFormCreate( Result );
end; ---------------------- _frame_1.inc
procedure NewFrame( var Result: PFrame; AParent: PControl );
const ToolbarButtonsArray_tbDrv: array[0..0] of PKOLChar = ('');
const ToolbarImgIndexesArray_tbDrv: array[0..0] of Integer = (0);
const ToolbarButtonsArray_tbBR: array[0..1] of PKOLChar = (PKOLChar( #85#112 ), PKOLChar( #46#92 ));
const ToolbarImgIndexesArray_tbBR: array[0..1] of Integer = (8, -2);
const ToolbarButtonsArray_tbLV: array[0..2] of PKOLChar = ('+!', '-!', '-!');
const ToolbarImgIndexesArray_tbLV: array[0..2] of Integer = (3, 0, 2);
begin
Result := PFrame.Create;
New( Result, Create );
Result.Form := NewPanel( AParent, esNone ).MarkPanelAsForm;
Result.Form.DF.FormAddress := @ Result.Form;
Result.Form.DF.FormObj := Result;
Result.Form.SetClientSize( 362, 270 );
Result.Form.Border := 0;
Result.ilSys32 := NewImageList( Result.Form );
Result.ilSys32.LoadSystemIcons( False );
Result.pnlFrame := NewPanel( Result.Form, esTransparent ).SetAlign ( caClient ).SetBorder( 2);
Result.pnlT := NewPanel( Result.pnlFrame, esTransparent ).SetAlign ( caTop ).SetSize( 0, 44 ).SetBorder( 0);
Result.pnlTL := NewPanel( Result.pnlT, esTransparent ).SetAlign ( caLeft ).SetSize( 53, 0 ).SetBorder( 0);
Result.tbDrv := NewToolbar( Result.pnlTL, caBottom, [tboTransparent], 0, [ ], [] ).SetAlign ( caBottom ).AutoSize( TRUE ).SetBorder( 0);
Result.tbDrv.Transparent := True;
Result.tbDrv.TBAutoSizeButtons := TRUE;
ToolbarAddButtons( Result.tbDrv, ToolbarButtonsArray_tbDrv, ToolbarImgIndexesArray_tbDrv, 0 );
Result.tbDrv.Perform( TB_SETBUTTONSIZE, 0, 0 or $10000 );
Result.tbDrv.Perform( TB_SETIMAGELIST, 0, Result.ilSys32.Handle );
Result.pnlTC := NewPanel( Result.pnlT, esTransparent ).SetAlign ( caClient ).SetBorder( 0);
Result.pnlTCB := NewPanel( Result.pnlTC, esTransparent ).SetAlign ( caBottom ).SetSize( 0, 17 ).SetBorder( 0);
Result.pnlTCBR1 := NewPanel( Result.pnlTCB, esTransparent ).SetAlign ( caRight ).SetSize( 64, 0 ).SetBorder( 0);
Result.tbBR := NewToolbar( Result.pnlTCBR1, caBottom, [tboTransparent], THandle( -5 ), [ ], [] ).SetAlign ( caBottom ).AutoSize( TRUE ).SetBorder( 0);
Result.tbBR.Transparent := True;
Result.tbBR.TBAutoSizeButtons := TRUE;
ToolbarAddButtons( Result.tbBR, ToolbarButtonsArray_tbBR, ToolbarImgIndexesArray_tbBR, 0 );
Result.tbBR.Perform( TB_SETBUTTONSIZE, 0, 0 or $10000 );
Result.pnlTCBR2 := NewPanel( Result.pnlTCB, esTransparent ).SetAlign ( caRight ).SetSize( 64, 0 ).SetBorder( 0);
Result.tbLV := NewToolbar( Result.pnlTCBR2, caBottom, [tboTransparent], THandle( -5 ), [ ], [] ).SetAlign ( caBottom ).AutoSize( TRUE ).SetBorder( 0);
Result.tbLV.Transparent := True;
Result.tbLV.TBAutoSizeButtons := TRUE;
ToolbarAddButtons( Result.tbLV, ToolbarButtonsArray_tbLV, ToolbarImgIndexesArray_tbLV, 0 );
Result.tbLV.Perform( TB_SETBUTTONSIZE, 0, 0 or $10000 );
Result.pnlTCBC := NewPanel( Result.pnlTCB, esNone ).SetAlign ( caClient ).SetBorder( 0);
Result.pnlTCBC.MarginTop := 1;
Result.pnlTCBC.MarginBottom := 5;
Result.pnlTCBC.MarginLeft := 4;
Result.pnlTCBC.MarginRight := 4;
Result.pnlTCBC.Transparent := True;
Result.prg := NewProgressBar( Result.pnlTCBC ).SetAlign ( caClient ).SetBorder( 2);
Result.prg.Transparent := True;
Result.prg.Progress := 50;
Result.pnlTCC := NewPanel( Result.pnlTC, esTransparent ).SetAlign ( caClient ).SetBorder( 0);
Result.pnlTCC.MarginLeft := 4;
Result.pnlTCC.Caption := #92#112#97#116#104#92#116#111#92#102#105#108#101#115;
Result.pnlC := NewPanel( Result.pnlFrame, esLowered ).SetAlign ( caClient );
Result.lvFiles := NewListView( Result.pnlC, lvsDetail, [ ], nil, nil, nil ).SetAlign ( caClient );
Result.lvFiles.HasBorder := FALSE;
Result.lvFiles.Color := TColor(clWindow);
Result.lvFiles.LVColAdd( #49, taLeft, 50);
Result.lvFiles.LVColAdd( #50, taLeft, 50);
Result.lvFiles.LVColAdd( #51, taLeft, 50);
Result.lvFiles.LVColAdd( #52, taLeft, 50);
Result.lvFiles.OnResize := Result.lvFilesResize;
Result.tbBR.Perform( TB_AUTOSIZE, 0, 0 );
Result.tbLV.Perform( TB_AUTOSIZE, 0, 0 );
Result.tbDrv.Perform( TB_AUTOSIZE, 0, 0 );
Result.pnlTCB.OnResize := Result.pnlTCBResize;
Result.pnlTCBC.OnResize := Result.pnlTCBCResize;
Result.frm1FormCreate( Result );
Result.Form.CreateWindow;
end;
-
---------------------- _main.pas
unit _main;
interface
uses Windows, Messages, KOL , mirror, Classes, Controls, mckCtrls,
mckObjs, Graphics , _frame;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, mirror;
type
PMain = ^TMain;
TMain = object(TObj)
Form: PControl;
TMain = class(TForm)
KOLProj: TKOLProject;
KOLForm: TKOLForm;
pnlMain: TKOLPanel;
procedure KOLFormFormCreate(Sender: PObj);
function splSplit(Sender: PControl; NewSize1, NewSize2: Integer): Boolean;
procedure splMouseDblClk(Sender: PControl; var Mouse: TMouseEventData);
procedure KOLFormResize(Sender: PObj);
private
FPrc: Double;
function GetPrc: Double;
procedure SetPrc(Val: Double);
public
pnlL, pnlR: PFrame;
Splitter: PControl;
property Prc: Double read GetPrc write SetPrc;
end;
var
Main : PMain : TMain ;
procedure NewMain( var Result: PMain; AParent: PControl );
implementation uses err , KOLGRushControls, ToGRush ;
function TMain.GetPrc: Double;
begin
if Assigned(Splitter) then begin
with Splitter^ do begin
Result:=(Left + 4)*100/Parent.ClientWidth;
FPrc:=Result;
end;
end;
end;
procedure TMain.SetPrc(Val: Double);
begin
if Assigned(Splitter) then begin
with Splitter^ do begin
FPrc:=Val;
pnlL.Form.Width:=Round(Val*Parent.ClientWidth/100 - 4);
end;
end;
end;
procedure TMain.splMouseDblClk(Sender: PControl; var Mouse: TMouseEventData);
begin
Prc:=50.0;
end;
function TMain.splSplit(Sender: PControl; NewSize1, NewSize2: Integer): Boolean;
begin
GetPrc;
end;
function AddFrame(ctlParent: PControl; caAlign: TControlAlign = caLeft): PFrame;
begin
NewFrame(Result,ctlParent);
with Result.Form^ do begin
Width:=ctlParent.Width div 2 - 4;
SetAlign(caAlign);
Parent:=ctlParent;
Visible:=true;
end;
end;
procedure TMain.KOLFormFormCreate(Sender: PObj);
begin
pnlR:=AddFrame(pnlMain, caClient);
Prc:=50.0;
end;
procedure TMain.KOLFormResize(Sender: PObj);
begin
Prc:=FPrc;
end;
end. ---------------------- _frame.pas
unit _frame;
interface
uses Windows, Messages, KOL , mirror, Classes, Controls, mckCtrls, mckObjs, Graphics ;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, mirror;
type
PFrame = ^TFrame;
TFrame = object(TObj)
Form: PControl;
TFrame = class(TForm)
frm1: TKOLFrame;
pnlFrame: TKOLPanel;
pnlC: TKOLPanel;
pnlT: TKOLPanel;
lvFiles: TKOLListView;
pnlTL: TKOLPanel;
tbDrv: TKOLToolbar;
ilSys32: TKOLImageList;
pnlTC: TKOLPanel;
pnlTCB: TKOLPanel;
pnlTCBC: TKOLPanel;
pnlTCBR2: TKOLPanel;
tbLV: TKOLToolbar;
pnlTCBR1: TKOLPanel;
tbBR: TKOLToolbar;
prg: TKOLProgressBar;
pnlTCC: TKOLPanel;
procedure pnlTCBResize(Sender: PObj);
procedure frm1FormCreate(Sender: PObj);
procedure lvFilesResize(Sender: PObj);
procedure pnlTCBCResize(Sender: PObj);
private
public
end;
var
Frame : PFrame : TFrame ;
procedure NewFrame( var Result: PFrame; AParent: PControl );
implementation uses err , KOLGRushControls, ToGRush ;
function NewToolbar( AParent: PControl; Align: TControlAlign; Options: TToolbarOptions;
Bitmap: HBitmap; const Buttons: array of PKOLChar;
const BtnImgIdxArray: array of Integer ) : PControl;
begin
Result := Kol.NewToolbar( AParent, Align, Options, Bitmap, Buttons, BtnImgIdxArray );
end;
procedure ToolbarAddButtons( Toolbar: PControl; const Buttons: array of PKOLChar;
const BtnImgIdxArray: array of Integer; Bitmap: HBitmap );
begin
Toolbar.TBAddButtons( Buttons, BtnImgIdxArray );
end;
function NewPanel( AParent: PControl; EdgeStyle: TEdgeStyle ): PControl;
begin
if not NoGrush then
begin
if EdgeStyle >= esTransparent then
begin
Result := KOL.NewPanel( AParent, esNone ).SetSize( 64, 64 );
if EdgeStyle = esTransparent then
Result.Transparent := TRUE;
end
else begin
Result := Pointer( NewGRushPanel( AParent ) );
if EdgeStyle=esNone then
with PGRushControl(Result)^ do begin
All_BorderRoundWidth:=0;
All_BorderRoundHeight:=0;
end else
if (EdgeStyle in [esLowered,esRaised]) then
with PGRushControl(Result)^ do begin
Transparent:=true;
if EdgeStyle=esLowered then
All_GradientStyle:=gsSolid;
end else
end
end
else begin
Result := Kol.NewPanel( AParent, EdgeStyle );
if EdgeStyle = esTransparent then
Result.Transparent := TRUE
end
;
end;
-
// ПЕРЕД вызовом инклюда NewFrame {$IF Defined(KOL_MCK)}{$ELSE}{$R *.DFM}{$IFEND}{$IFDEF KOL_MCK}{$I _frame_1.inc}{$ENDIF} // далее - код procedure TFrame.frm1FormCreate(Sender: PObj); var i,w,p:integer; begin // подгоняю размеры контейнеров под тулбары, ничего особенного with tbDrv^ do begin i:=TBIndex2Item(0); TBButtonText[i]:='C:'; TBButtonImage[i]:=FileIconSystemIdx('C:\'); end; w:=0; with tbBR^ do for i := 0 to TBButtonCount - 1 do inc(w, TBButtonWidth[TBIndex2Item(i)]); tbBR.Parent.Width:=w; w:=0; with tbLV^ do for i := 0 to TBButtonCount - 1 do inc(w, TBButtonWidth[TBIndex2Item(i)]); inc(w, 8); tbLV.Parent.Width:=w; pnlTCB.Height:=tbLV.Height; w:=0; with tbDrv^ do for i := 0 to TBButtonCount - 1 do inc(w, TBButtonWidth[TBIndex2Item(i)]); tbDrv.Parent.Width:=w; pnlT.Height:=tbDrv.Height; // а также прогресс и его парент {$IFDEF USE_GRUSH} with PGRushControl(prg)^ do begin All_DrawProgressRect:=false; w:=Def_BorderRoundWidth; Transparent:=true; end; with PGRushControl(pnlTCBC)^ do begin All_BorderRoundWidth:=w; All_BorderRoundHeight:=w; end; {$ENDIF} end; procedure TFrame.pnlTCBResize(Sender: PObj); var min: Integer; {procedure _dbgwrite(); begin pnlTCBC.Caption:= 'R1.Left='+Int2Str(pnlTCBR1.Left)+', '+ 'R2.Left='+Int2Str(pnlTCBR2.Left); end;{} begin min := 32 ; // pnlTL всегда видима ; // видимы если хватает места на родителе with pnlTCBR1^ do Visible:=Parent.Width > min + Width; with pnlTCBR2^ do Visible:=Parent.Width > min + pnlTCBR1.Width + Width; // Видимость pnlTCBC - можно пренебречь (вроде как) //_dbgwrite; // c размерами всё норм // и вот тут - начинается. pnlTCBC не выравнивается, либо // выравнивается криво, либо отрисовывается с артефактами, // либо не выравнивается дочерний контрол prg (тоже алигн=клиент). // моя программа неплохо ест памяти, но вроде всё корректно освобождает // так что может в этом дело //pnlTCBC.InvalidateEx; // по идее, не нужна, так как даже если б была // нужна - не работает :) //prg.Invalidate; // и это тоже. тем не менее, алигна нет, // если фрейм алигн = клиент // процедура-аттач вроде всегда вызывается... //pnlTCBC.SetAlign(caNone).SetAlign(caClient); // вигвам полный... только так :) // но это же бред, так как при движении // сплиттера метод будет вызываться // постоянно. При тестах всё это даже вешал // на таймер - работает процентах в 40 случаев... // может после разных компиляций давать разные эффекты. // иногда даже работает нормально, в зависимости от свойства Prc // главной формы :) end; procedure TFrame.pnlTCBCResize(Sender: PObj); begin // так как не работает алигн выше по коду, пытаюсь выравнять тут // дочерний контрол prg.Invalidate; // не работает prg.SetAlign(caNone).SetAlign(caClient);// тоже по фигу end; procedure TFrame.lvFilesResize(Sender: PObj); var i: Integer; begin with lvFiles^ do for i := 0 to LVColCount - 1 do LVColWidth[i]:=Width div 4; // похожая ситуация, тоже не выравнивается. end; end. Кстати, а это нормально - const ToolbarButtonsArray_tbDrv: array[0..0] of PKOLChar = ('');
???
-
to Cobalt: спутал я проекты.... Да, в первом посте фрейм - это PanelMain. В примере последнем немного по-другому. Это из другого проекта, где такая же истерика.
-
Владимир,
> может быть Anchor'ы вместо панелей может быть как раз бы > были лучше
а не подскажите примерчик? :) Как автор, Вы явно больше трюков знаете!
Я, честно говоря, хоть в KOL очень давно, но Anchor'ы как-то не приходилось задумываться... Да и в этом примере - попробовал. ListView перестал глючить, а всё что на верху - нет...
Очевидно, проблема из-за ПРАВЫХ двух панелей, на к-рых тулбары. Если их сделать лефт - всё становится норм. Да и если добавить туда ещё одну панель с алигн=лефт - то тоже становится норм.
|