Конференция "KOL" » Align & Maximize/Restore
 
  • ParanoiS (24.12.13 18:12) [0]
    Доброго времени суток.

    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х
  • ParanoiS (24.12.13 18:17) [1]
    Ах да, забыл. Это всё в динамическом фрейме, коих главная форма делает несколько.
  • Cobalt © (31.12.13 15:36) [2]
    а динамический фрейм - это PanelMain?
  • Vladimir Kladov © (31.12.13 20:03) [3]
    ЧЯДНТ?
    ---------------------------------------------- UNIT1.pas ---------------------
    { KOL MCK } // Do not remove this line!
    {$DEFINE KOL_MCK}
    unit Unit1;

    interface

    {$IFDEF KOL_MCK}
    uses Windows, Messages, KOL {$IF Defined(KOL_MCK)}{$ELSE}, mirror, Classes, Controls, mckCtrls, mckObjs, Graphics {$IFEND (place your units here->)};
    {$ELSE}
    {$I uses.inc}
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, mirror;
    {$ENDIF}

    type
     {$IF Defined(KOL_MCK)}
     {$I MCKfakeClasses.inc}
     {$IFDEF KOLCLASSES} {$I TForm1class.inc} {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
     {$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
       Form: PControl;
     {$ELSE not_KOL_MCK}
     TForm1 = class(TForm)
     {$IFEND KOL_MCK}
       KOLProject1: TKOLProject;
       KOLForm1: TKOLForm;
       procedure KOLForm1FormCreate(Sender: PObj);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

    {$IFDEF KOL_MCK}
    procedure NewForm1( var Result: PForm1; AParent: PControl );
    {$ENDIF}

    implementation

    uses Unit2;

    {$IF Defined(KOL_MCK)}{$ELSE}{$R *.DFM}{$IFEND}

    {$IFDEF KOL_MCK}
    {$I Unit1_1.inc}
    {$ENDIF}

    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 ---------------------------
    { KOL MCK } // Do not remove this line!
    {$DEFINE KOL_MCK}
    unit Unit2;

    interface

    {$IFDEF KOL_MCK}
    uses Windows, Messages, KOL {$IF Defined(KOL_MCK)}{$ELSE}, mirror, Classes, Controls, mckCtrls, mckObjs, Graphics {$IFEND (place your units here->)};
    {$ELSE}
    {$I uses.inc}
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;
    {$ENDIF}

    type
     {$IF Defined(KOL_MCK)}
     {$I MCKfakeClasses.inc}
     {$IFDEF KOLCLASSES} {$I TForm2class.inc} {$ELSE OBJECTS} PForm2 = ^TForm2; {$ENDIF CLASSES/OBJECTS}
     {$IFDEF KOLCLASSES}{$I TForm2.inc}{$ELSE} TForm2 = object(TObj) {$ENDIF}
       Form: PControl;
     {$ELSE not_KOL_MCK}
     TForm2 = class(TForm)
     {$IFEND KOL_MCK}
       KOLFrame1: TKOLFrame;
       PanelL: TKOLPanel;
       PanelC: TKOLPanel;
       PanelCT: TKOLPanel;
       PanelCC: TKOLPanel;
       PanelCCR1: TKOLPanel;
       PanelCCR2: TKOLPanel;
       PanelCCC: TKOLPanel;
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form2 {$IFDEF KOL_MCK} : PForm2 {$ELSE} : TForm2 {$ENDIF} ;

    {$IFDEF KOL_MCK}
    procedure NewForm2( var Result: PForm2; AParent: PControl );
    {$ENDIF}

    implementation

    {$IF Defined(KOL_MCK)}{$ELSE}{$R *.DFM}{$IFEND}

    {$IFDEF KOL_MCK}
    {$I Unit2_1.inc}
    {$ENDIF}

    end.


    --------------------------------------------- нормально:
    http://savepic.net/4155072.png
    --------------------------------------------- после максимизации:
    http://savepic.net/4138688.png
    ---------------------------------------------
    Delphi 7, Windows XP. Запуск откомпилированного exe в Win7 - результат тот же.

    1) Проверьте, что не используете TKOLTabPage вместо панели.
    2) Что не используете Anchor'ы

    А вообще, такое количество вложенных панелей наводит на мысль, что может быть Anchor'ы вместо панелей может быть как раз бы были лучше.

    3) Если не помогает, или модель не соответствует приложенной, выложите свой вариант кода.
  • ParanoiS (21.01.14 23:39) [4]
    Владимир, если они Align=Top|Bottom - всё норм. Косяк если Left. Между ними ещё сплиттер, который работает прекрасно, если его двигать - косяка не наблюдается. Аттаченные процедуры вызываются нормально, но при максимизации как будто пропадает кусок кода... Чуть позже выложу исходник.
  • ParanoiS (22.01.14 03:12) [5]
    Cobalt, фреймы - PanelL и PanelC в данном примере. PanelMain - это контейнер для фреймов на главной форме. Т.е. PanelL имеет такую же структуру что и PanelC.
  • ParanoiS © (22.01.14 09:15) [6]
    Владимир, вот сорцы тестовой программки, где можно наблюдать сие.

    ----------------------
    _main_1.inc

    { KOL MCK } // Do not remove this line!

    procedure NewMain( var Result: PMain; AParent: PControl );
    begin

     {$IFDEF KOLCLASSES}
     Result := PMain.Create;
     {$ELSE OBJECTS}
     New( Result, Create );
     {$ENDIF KOL CLASSES/OBJECTS}
     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

    { KOL MCK } // Do not remove this line!

    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

     {$IFDEF KOLCLASSES}
     Result := PFrame.Create;
     {$ELSE OBJECTS}
     New( Result, Create );
     {$ENDIF KOL CLASSES/OBJECTS}
     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;

  • ParanoiS © (22.01.14 09:16) [7]
    ----------------------
    _main.pas

    { KOL MCK } // Do not remove this line!
    {$DEFINE KOL_MCK}
    unit _main;

    interface

    {$IFDEF KOL_MCK}
    uses Windows, Messages, KOL {$IF Defined(KOL_MCK)}{$ELSE}, mirror, Classes, Controls, mckCtrls,
     mckObjs, Graphics {$IFEND (place your units here->)} , _frame;
    {$ELSE}
    {$I uses.inc}
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, mirror;
    {$ENDIF}

    type
     {$IF Defined(KOL_MCK)}
     {$I MCKfakeClasses.inc}
     {$IFDEF KOLCLASSES} {$I TMainclass.inc} {$ELSE OBJECTS} PMain = ^TMain; {$ENDIF CLASSES/OBJECTS}
     {$IFDEF KOLCLASSES}{$I TMain.inc}{$ELSE} TMain = object(TObj) {$ENDIF}
       Form: PControl;
     {$ELSE not_KOL_MCK}
     TMain = class(TForm)
     {$IFEND KOL_MCK}
       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
       { Private declarations }
       FPrc: Double;
       function GetPrc: Double;
       procedure SetPrc(Val: Double);
     public
       { Public declarations }
       pnlL, pnlR: PFrame;
       Splitter: PControl;
       
       property Prc: Double read GetPrc write SetPrc;
     end;

    var
     Main {$IF Defined(KOL_MCK)} : PMain {$ELSE} : TMain {$IFEND} ;

    {$IFDEF KOL_MCK}procedure NewMain( var Result: PMain; AParent: PControl );{$ENDIF}
    implementation uses err {$IFDEF USE_GRUSH} , KOLGRushControls, ToGRush {$ENDIF} ;
    {$IF Defined(KOL_MCK)}{$I _main_1.inc}{$ELSE}{$R *.DFM}{$IFEND}

    function TMain.GetPrc: Double;
    begin
     if Assigned(Splitter) then begin
       with Splitter^ do begin
         Result:=(Left + 4)*100/Parent.ClientWidth;
         FPrc:=Result;
         //Form.Caption:=Double2StrEx(Result)+'% ('+Int2Str(Left)+')';
       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;
       //Prc; // для вывода в Form.Caption значения, цель - отладка при
              // движении сплиттера
     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
     // если даже убрать фрейм pnlL, выравнивание иногда косячит
     
     //{
       pnlL:=AddFrame(pnlMain);
       Splitter:=NewSplitterEx(pnlMain,32,32,esTransparent);

       with Splitter^ do begin
         SetAlign(caLeft);
         Width:=8;
         OnSplit:=splSplit;
         OnMouseDblClk:=splMouseDblClk;
       end;
     {}


     pnlR:=AddFrame(pnlMain, caClient);
     Prc:=50.0;
    end;

    procedure TMain.KOLFormResize(Sender: PObj);
    begin
     Prc:=FPrc;
    end;

    end.



    ----------------------
    _frame.pas

    { KOL MCK } // Do not remove this line!
    {$DEFINE KOL_MCK}
    unit _frame;

    // defined KOL_MCK;KOL;PAS_VERSION;UNICODE_CTRLS
    // [USE_GRUSH] - по желанию, не влияет на поведение pnlTCBC.OnResize

    interface

    {$IFDEF KOL_MCK}
    uses Windows, Messages, KOL {$IF Defined(KOL_MCK)}{$ELSE}, mirror, Classes, Controls, mckCtrls, mckObjs, Graphics {$IFEND (place your units here->)};
    {$ELSE}
    {$I uses.inc}
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, mirror;
    {$ENDIF}

    type
     {$IF Defined(KOL_MCK)}
     {$I MCKfakeClasses.inc}
     {$IFDEF KOLCLASSES} {$I TFrameclass.inc} {$ELSE OBJECTS} PFrame = ^TFrame; {$ENDIF CLASSES/OBJECTS}
     {$IFDEF KOLCLASSES}{$I TFrame.inc}{$ELSE} TFrame = object(TObj) {$ENDIF}
       Form: PControl;
     {$ELSE not_KOL_MCK}
     TFrame = class(TForm)
     {$IFEND KOL_MCK}
       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
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Frame {$IFDEF KOL_MCK} : PFrame {$ELSE} : TFrame {$ENDIF} ;

     
    {$IFDEF KOL_MCK} procedure NewFrame( var Result: PFrame; AParent: PControl ); {$ENDIF}
    implementation uses err {$IFDEF USE_GRUSH} , KOLGRushControls, ToGRush {$ENDIF} ;

    // патч-процедуры, заменяющие аналоги ToGRush
    // нужны, чтоб пример выглядел как должно быть у меня в проге.

    // тулбары - стандартные, а не GRush Panel и Button

    {$IFDEF USE_GRUSH}
    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;

    // моя версия NewPanel в ToGRush - разное отображение при
    // разных EdgeStyle

    function NewPanel( AParent: PControl; EdgeStyle: TEdgeStyle ): PControl;
    begin
     {$IFDEF TOGRUSH_OPTIONAL}
     if not NoGrush then
     {$ENDIF TOGRUSH_OPTIONAL}
     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
     {$IFDEF TOGRUSH_OPTIONAL}
     else begin
       Result := Kol.NewPanel( AParent, EdgeStyle );
       if EdgeStyle = esTransparent then
         Result.Transparent := TRUE
     end
     {$ENDIF TOGRUSH_OPTIONAL}
     ;
    end;
    {$ENDIF}

  • ParanoiS © (22.01.14 09:16) [8]
    // ПЕРЕД вызовом инклюда 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 = ('');


    ???
  • ParanoiS © (22.01.14 09:21) [9]
    to Cobalt: спутал я проекты.... Да, в первом посте фрейм - это PanelMain. В примере последнем немного по-другому. Это из другого проекта, где такая же истерика.
  • ParanoiS © (22.01.14 10:00) [10]
    Владимир,

    > может быть Anchor'ы вместо панелей может быть как раз бы
    > были лучше

    а не подскажите примерчик? :) Как автор, Вы явно больше трюков знаете!

    Я, честно говоря, хоть в KOL очень давно, но Anchor'ы как-то не приходилось задумываться... Да и в этом примере - попробовал. ListView перестал глючить, а всё что на верху - нет...

    Очевидно, проблема из-за ПРАВЫХ двух панелей, на к-рых тулбары. Если их сделать лефт - всё становится норм. Да и если добавить туда ещё одну панель с алигн=лефт - то тоже становится норм.
 
Конференция "KOL" » Align & Maximize/Restore
Есть новые Нет новых   [118638   +34][b:0.001][p:0.012]