Skip to content

TStackPanelDemo 项目分析

项目信息

文件结构

TStackPanelDemo/
├── Extractor_Icon.ico
├── Project1.py
├── Project1.xml
├── Unit1.py
├── Unit1.pydfm
├── Unit1.sct
├── Unit1.sfm

主程序文件: Project1.py

from glcl import *
from Unit1 import *

def main():
    Application.Initialize()
    Application.Title = 'Project1'
    Application.MainFormOnTaskbar = True
    Application.Icon.LoadFromFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Extractor_Icon.ico"))
    MainForm = Form1(Application)
    MainForm.Show()
    FreeConsole()
    Application.Run()
    MainForm.Free()

if __name__ == '__main__':
    main()

单元文件: Unit1.py

import os
from glcl import *

class Form1(Form):

    def __init__(self, owner):
        self.Panel1 = Panel(self)
        self.grpOrientation = RadioGroup(self)
        self.Panel2 = Panel(self)
        self.grpControlPositioning = RadioGroup(self)
        self.trkSpacing = TrackBar(self)
        self.lblSpacing = Label(self)
        self.grpPositioning = RadioGroup(self)
        self.lstControls = ListBox(self)
        self.lblPadding = Label(self)
        self.trkPadding = TrackBar(self)
        self.lblControlOverride = Label(self)
        self.StackPanel1 = StackPanel(self)
        self.Label1 = Label(self)
        self.Edit1 = Edit(self)
        self.Button1 = Button(self)
        self.Memo1 = Memo(self)
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit1.pydfm"))
        self.grpPositioning.OnClick = self.grpPositioningClick
        self.grpControlPositioning.OnClick = self.grpControlPositioningClick
        self.grpOrientation.OnClick = self.grpOrientationClick
        self.lstControls.OnClick = self.lstControlsClick
        self.trkPadding.OnChange = self.trkPaddingChange
        self.trkSpacing.OnChange = self.trkSpacingChange

        # 设置默认宽高
        self.DefaultLabel1Width   =  self.Label1.Width
        self.DefaultEdit1Width    =  self.Edit1.Width
        self.DefaultButton1Width  =  self.Button1.Width
        self.DefaultMemo1Width    =  self.Memo1.Width
        self.DefaultLabel1Height  =  self.Label1.Height
        self.DefaultEdit1Height   =  self.Edit1.Height
        self.DefaultButton1Height =  self.Button1.Height
        self.DefaultMemo1Height   =  self.Memo1.Height

        # 设置初始选中
        self.lstControls.ItemIndex = 0
        # 定义方向和位置列表
        self.orientation = [spoVertical, spoHorizontal]
        self.hp = [sphpDefault, sphpLeft, sphpCenter, sphpRight, sphpFill]
        self.vp = [spvpDefault, spvpTop, spvpCenter, spvpBottom, spvpFill]

    # 刻度条间距改变事件
    def trkSpacingChange(self, Sender):
        # 根据刻度条设置间距
        self.StackPanel1.Spacing = self.trkSpacing.Position

    # 刻度条边距改变事件
    def trkPaddingChange(self, Sender):
        # 设置左上右下边距
        P = self.trkPadding.Position
        self.StackPanel1.Padding.SetBounds(P, P, P, P)

    # 列表框点击事件
    def lstControlsClick(self, Sender):
        # 判断当前选中的方向
        if self.StackPanel1.Orientation == spoVertical:
            # 设置单选组合框选中项
            self.grpControlPositioning.ItemIndex = self.hp.index(self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].HorizontalPositioning)
        else:
            self.grpControlPositioning.ItemIndex = self.vp.index(self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].VerticalPositioning)

    # 方向单选组点击事件
    def grpOrientationClick(self, Sender):
        # 设置方向
        self.StackPanel1.Orientation = self.orientation[self.grpOrientation.ItemIndex]
        # 如果是纵向
        if self.StackPanel1.Orientation == spoVertical:
            # 设置相关属性
            self.grpPositioning.Caption = 'Horizontal Positioning'
            self.grpPositioning.Items.Clear()
            self.grpPositioning.Items.Add('sphpLeft')
            self.grpPositioning.Items.Add('sphpCenter')
            self.grpPositioning.Items.Add('sphpRight')
            self.grpPositioning.Items.Add('sphpFill')
            self.grpPositioning.ItemIndex = self.hp.index(self.StackPanel1.HorizontalPositioning) - 1

            self.grpControlPositioning.Items.Clear()
            self.grpControlPositioning.Items.Add('sphpDefault')
            self.grpControlPositioning.Items.Add('sphpLeft')
            self.grpControlPositioning.Items.Add('sphpCenter')
            self.grpControlPositioning.Items.Add('sphpRight')
            self.grpControlPositioning.Items.Add('sphpFill')
            self.grpControlPositioning.ItemIndex = -1
        else:   # 横向
            # 设置相关属性
            self.grpPositioning.Caption = 'Vertical Positioning'
            self.grpPositioning.Items.Clear()
            self.grpPositioning.Items.Add('spvpTop')
            self.grpPositioning.Items.Add('spvpCenter')
            self.grpPositioning.Items.Add('spvpBottom')
            self.grpPositioning.Items.Add('spvpFill')
            self.grpPositioning.ItemIndex = self.vp.index(self.StackPanel1.VerticalPositioning) - 1

            self.grpControlPositioning.Items.Clear()
            self.grpControlPositioning.Items.Add('spvpDefault')
            self.grpControlPositioning.Items.Add('spvpTop')
            self.grpControlPositioning.Items.Add('spvpCenter')
            self.grpControlPositioning.Items.Add('spvpBottom')
            self.grpControlPositioning.Items.Add('spvpFill')
            self.grpControlPositioning.ItemIndex = -1

    # 重置控件属性函数
    def ResetControl(self):
        # 获取并设置控件默认的宽高
        self.Label1.Width  = self.DefaultLabel1Width
        self.Label1.Height = self.DefaultLabel1Height
        self.Edit1.Width   = self.DefaultEdit1Width
        self.Edit1.Height  = self.DefaultEdit1Height
        self.Button1.Width = self.DefaultButton1Width
        self.Button1.Height= self.DefaultButton1Height
        self.Memo1.Width   = self.DefaultMemo1Width
        self.Memo1.Height  = self.DefaultMemo1Height

    # 控件位置单选组点击事件
    def grpControlPositioningClick(self, Sender):
        self.StackPanel1.DisableAlign()
        try:
            self.ResetControl() # Revert width / height of all controls.
            if self.StackPanel1.Orientation == spoVertical:
                self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].HorizontalPositioning = self.hp[self.grpControlPositioning.ItemIndex]
            else:
                self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].VerticalPositioning = self.vp[self.grpControlPositioning.ItemIndex]
        finally:
            self.StackPanel1.EnableAlign() # restart align with new parameter.

    # 位置单选组点击事件
    def grpPositioningClick(self, Sender):
        # 取消对齐
        self.StackPanel1.DisableAlign()
        try:
            # 重置控件宽高
            self.ResetControl()
            # 在位置单选组中没有sphpDefault/spvpDefault。下标+1跳过sphpDefault/spvpDefault
            if self.StackPanel1.Orientation == spoVertical:
                self.StackPanel1.HorizontalPositioning = self.hp[self.grpPositioning.ItemIndex + 1]
            else:
                self.StackPanel1.VerticalPositioning = self.vp[self.grpPositioning.ItemIndex + 1]
        finally:
            # 启用对齐
            self.StackPanel1.EnableAlign()

设计文件: Unit1.sct

def trkSpacingChange(Sender): 
def trkPaddingChange(Sender): 
def lstControlsClick(Sender): 
def grpOrientationClick(Sender): 
def grpControlPositioningClick(Sender): 
def grpPositioningClick(Sender): 

设计文件: Unit1.sfm

object Form1: TForm
  Left = 0
  Top = 0
  Caption = 'TStackPanel'
  ClientHeight = 386
  ClientWidth = 594
  Color = clBtnFace
  Constraints.MinHeight = 425
  Constraints.MinWidth = 610
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  Position = poScreenCenter
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 594
    Height = 113
    Align = alTop
    BevelOuter = bvNone
    TabOrder = 0
    object lblSpacing: TLabel
      Left = 16
      Top = 51
      Width = 37
      Height = 13
      Caption = 'Spacing'
    end
    object lblPadding: TLabel
      Left = 16
      Top = 83
      Width = 38
      Height = 13
      Caption = 'Padding'
    end
    object grpOrientation: TRadioGroup
      Left = 260
      Top = 8
      Width = 325
      Height = 41
      Caption = 'Orientation'
      Columns = 2
      ItemIndex = 0
      Items.Strings = (
        'Vertical'
        'Horizontal')
      TabOrder = 2
      OnClick = grpOrientationClick
    end
    object trkSpacing: TTrackBar
      Left = 70
      Top = 47
      Width = 159
      Height = 26
      Max = 20
      Position = 2
      TabOrder = 0
      TickMarks = tmBoth
      TickStyle = tsNone
      OnChange = trkSpacingChange
    end
    object grpPositioning: TRadioGroup
      Left = 260
      Top = 55
      Width = 325
      Height = 42
      Caption = 'Positioning'
      Columns = 4
      ItemIndex = 0
      Items.Strings = (
        'sphpLeft'
        'sphpCenter'
        'sphpRight'
        'sphpFill')
      TabOrder = 3
      OnClick = grpPositioningClick
    end
    object trkPadding: TTrackBar
      Left = 70
      Top = 79
      Width = 159
      Height = 24
      Max = 20
      Position = 5
      TabOrder = 1
      TickMarks = tmBoth
      TickStyle = tsNone
      OnChange = trkPaddingChange
    end
  end
  object Panel2: TPanel
    Left = 0
    Top = 113
    Width = 169
    Height = 273
    Align = alLeft
    BevelOuter = bvNone
    TabOrder = 1
    object lblControlOverride: TLabel
      Left = 16
      Top = 8
      Width = 134
      Height = 13
      Caption = 'Override Control Positioning'
    end
    object grpControlPositioning: TRadioGroup
      Left = 16
      Top = 127
      Width = 137
      Height = 137
      Caption = 'Positioning Override'
      ItemIndex = 0
      Items.Strings = (
        'sphpDefault'
        'sphpLeft'
        'sphpCenter'
        'sphpRight'
        'sphpFill')
      TabOrder = 1
      OnClick = grpControlPositioningClick
    end
    object lstControls: TListBox
      Left = 16
      Top = 31
      Width = 137
      Height = 74
      ItemHeight = 13
      Items.Strings = (
        'Label1'
        'Edit1'
        'Button1'
        'Memo1')
      TabOrder = 0
      OnClick = lstControlsClick
    end
  end
  object StackPanel1: TStackPanel
    AlignWithMargins = True
    Left = 179
    Top = 123
    Width = 405
    Height = 253
    Margins.Left = 10
    Margins.Top = 10
    Margins.Right = 10
    Margins.Bottom = 10
    Align = alClient
    ControlCollection = <
      item
        Control = Label1
      end
      item
        Control = Edit1
      end
      item
        Control = Button1
      end
      item
        Control = Memo1
      end>
    Padding.Left = 5
    Padding.Top = 5
    Padding.Right = 5
    Padding.Bottom = 5
    TabOrder = 2
    object Label1: TLabel
      Left = 6
      Top = 6
      Width = 31
      Height = 13
      Caption = 'Label1'
    end
    object Edit1: TEdit
      Left = 6
      Top = 21
      Width = 96
      Height = 21
      TabOrder = 0
      Text = 'Edit1'
    end
    object Button1: TButton
      Left = 6
      Top = 44
      Width = 75
      Height = 25
      Caption = 'Button1'
      TabOrder = 1
    end
    object Memo1: TMemo
      Left = 6
      Top = 71
      Width = 136
      Height = 55
      Lines.Strings = (
        'Memo1')
      TabOrder = 2
    end
  end
end

其他文件

  • Extractor_Icon.ico
  • Project1.xml

详细分析

功能概述

GUI组件演示

使用的组件

  • Form1 (TForm)
  • Panel1 (TPanel)
  • lblSpacing (TLabel)
  • lblPadding (TLabel)
  • grpOrientation (TRadioGroup)
  • trkSpacing (TTrackBar)
  • grpPositioning (TRadioGroup)
  • trkPadding (TTrackBar)
  • Panel2 (TPanel)
  • lblControlOverride (TLabel)
  • grpControlPositioning (TRadioGroup)
  • lstControls (TListBox)
  • StackPanel1 (TStackPanel)
  • Label1 (TLabel)
  • Edit1 (TEdit)
  • Button1 (TButton)
  • Memo1 (TMemo)

技术特点

  • 包含17个GUI组件
  • 定义6个事件处理

窗体属性

  • caption: Button1
  • height: 386
  • width: 594

代码分析

导入的模块: - import os - from glcl import *

定义的类: - Form1

定义的方法: - init - trkSpacingChange - trkPaddingChange - lstControlsClick - grpOrientationClick - ResetControl - grpControlPositioningClick - grpPositioningClick

事件绑定: - self.grpPositioning.OnClick = self.grpPositioningClick - self.grpControlPositioning.OnClick = self.grpControlPositioningClick - self.grpOrientation.OnClick = self.grpOrientationClick - self.lstControls.OnClick = self.lstControlsClick - self.trkPadding.OnChange = self.trkPaddingChange - self.trkSpacing.OnChange = self.trkSpacingChange