亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pianotracks.pas

?? Delphi鋼琴源碼
?? PAS
字號:
{
  TPianoTracks v1.0
    Integration 3 TCheckListBox

  Zizii Wan, 20050724, ShangHai, China
}

unit PianoTracks;

interface

uses
  Windows, SysUtils, Messages, Classes, Graphics, Controls, StdCtrls, ExtCtrls,
  ComCtrls, CheckLst, Forms, Math;

const
  CLeftCaption = 'Left';
  CRightCaption = 'Right';
                                   
type
  TTrackHand = (thUnknow, thRight, thLeft);
  // this is same order with FPianoTracks[i]

  { TTrackInfo }
  TTrackInfo = class
  private
    FTrackName: string;
    FTrackIndex: Byte;
    FTrackActive: Boolean;
    FTrackHand: TTrackHand;
    procedure SetTrackActive(const Value: Boolean);
    procedure SetTrackHand(const Value: TTrackHand);
    procedure SetTrackIndex(const Value: Byte);
    procedure SetTrackName(const Value: string);
  published
    property TrackName: string read FTrackName write SetTrackName;
    property TrackIndex: Byte read FTrackIndex write SetTrackIndex;
    property TrackActive: Boolean read FTrackActive write SetTrackActive;
    property TrackHand: TTrackHand read FTrackHand write SetTrackHand;
  end;

  { TPianoTracks }
  TPianoTracks = class(TCustomPanel)
  private
    FOwner: TWinControl;
    FPanel: TPanel;
    FLeftGroupBox: TGroupBox;
    FRightGroupBox: TGroupBox;
    FPianoTracks: array[0..2] of TCheckListBox; // Objects hold integer of trackindex
    FTrackList: TStringList; // Objects hold object of trackinfo
    FOnTrackClick: TNotifyEvent;
    FOnTrackMove: TNotifyEvent;
    FRightCaption: TCaption;
    FLeftCaption: TCaption;
    procedure PianoResize(Sender: TObject);
    procedure PianoTrackClick(Sender: TObject);
    procedure PianoDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure PianoDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure SetLeftCaption(const Value: TCaption);
    procedure SetRightCaption(const Value: TCaption);
  protected
    procedure BuildTracks;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure AddTrack(Info: TTrackInfo);
    procedure ClearTracks;
    procedure SetTrackActive(Track: Byte; Value: Boolean);
    function GetTrackActive(Track: Byte): Boolean;
    procedure SetTrackHand(Track: Byte; Value: TTrackHand);
    function GetTrackHand(Track: Byte): TTrackHand;
  published
    property LeftCaption: TCaption read FLeftCaption write SetLeftCaption;
    property RightCaption: TCaption read FRightCaption write SetRightCaption;
    property OnTrackClick: TNotifyEvent read FOnTrackClick write FOnTrackClick;
    property OnTrackMove: TNotifyEvent read FOnTrackMove write FOnTrackMove;
    { inherited }
    property Align;
    property Anchors;
    property BevelInner;
    property BevelOuter;
    property BevelWidth;
    property Caption;
    property Color;
    property Enabled;
    property Font;
    property ParentFont;
    property PopupMenu;
    property ParentShowHint;
    property ShowHint;
    property Visible;
    property OnClick;
    property OnDblClick;
    property OnEnter;
    property OnExit;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnResize;
  end;

procedure Register;

implementation

{ TTrackInfo }

procedure TTrackInfo.SetTrackActive(const Value: Boolean);
begin
  FTrackActive := Value;
end;

procedure TTrackInfo.SetTrackHand(const Value: TTrackHand);
begin
  FTrackHand := Value;
end;

procedure TTrackInfo.SetTrackIndex(const Value: Byte);
begin
  FTrackIndex := Value;
end;

procedure TTrackInfo.SetTrackName(const Value: string);
begin
  FTrackName := Value;
end;

{ TPianoTracks}

procedure TPianoTracks.BuildTracks;
var
  i: integer;
  Splitter1: TSplitter;
begin
  for i := 0 to 2 do
    FPianoTracks[i] := TCheckListBox.Create(Self);
  FPanel := TPanel.Create(Self);
  Splitter1 := TSplitter.Create(Self);
  FRightGroupBox := TGroupBox.Create(Self);
  FLeftGroupBox := TGroupBox.Create(Self);
  with FPanel do
  begin
    Name := 'Panel1';
    Parent := Self;
    Align := alRight;
    BevelOuter := bvNone;
  end;
  with FRightGroupBox do
  begin
    Name := 'grpRight';
    Parent := FPanel;
    Align := alTop;
    Caption := FRightCaption;
  end;
  with FLeftGroupBox do
  begin
    Name := 'grpLeft';
    Parent := FPanel;       
    Align := alClient;
    Caption := FLeftCaption;
  end;
  with Splitter1 do
  begin
    Name := 'Splitter1';
    Parent := Self;
    Align := alRight;
  end;
  with FPianoTracks[0] do
  begin
    Name := 'chklstCommon';
    Parent := Self;
    Align := alClient;
    DragMode := dmAutomatic;
    OnClickCheck := PianoTrackClick;
    OnDragDrop := PianoDragDrop;
    OnDragOver := PianoDragOver;
    Tag := Integer(thUnknow);
  end;
  with FPianoTracks[1] do
  begin
    Name := 'chklstRight';
    Parent := FRightGroupBox;
    Align := alClient;
    DragMode := dmAutomatic;
    OnClickCheck := PianoTrackClick;
    OnDragDrop := PianoDragDrop;
    OnDragOver := PianoDragOver;
    Tag := Integer(thRight);
  end;
  with FPianoTracks[2] do
  begin
    Name := 'chklstLeft';
    Parent := FLeftGroupBox;
    Align := alClient;
    DragMode := dmAutomatic;
    OnClickCheck := PianoTrackClick;
    OnDragDrop := PianoDragDrop;
    OnDragOver := PianoDragOver;
    Tag := Integer(thLeft);
  end;
end;

procedure TPianoTracks.SetLeftCaption(const Value: TCaption);
begin
  FLeftCaption := Value;
  FLeftGroupBox.Caption := FLeftCaption;
end;

procedure TPianoTracks.SetRightCaption(const Value: TCaption);
begin
  FRightCaption := Value;
  FRightGroupBox.Caption := FRightCaption;
end;

constructor TPianoTracks.Create(AOwner: TComponent);
begin
  inherited;
  //Align := alClient;
  FOwner := (AOwner as TWinControl);
  OnResize := PianoResize; // Resize;
  FTrackList := TStringList.Create;
  FLeftCaption := CLeftCaption;
  FRightCaption := CRightCaption;
  BuildTracks;
end;

destructor TPianoTracks.Destroy;
begin
  FreeAndNil(FTrackList);
  inherited;
end;

procedure TPianoTracks.PianoResize(Sender: TObject);
begin
  FPanel.Width := Width div 2;
  FRightGroupBox.Height := Height div 2;
end;

function TPianoTracks.GetTrackActive(Track: Byte): Boolean;
begin
  Result := True;
  if (Track > 0) and (Track < FTrackList.Count) then
    Result := TTrackInfo(FTrackList.Objects[Track]).TrackActive;
end;

procedure TPianoTracks.SetTrackActive(Track: Byte; Value: Boolean);
var
  i, j: integer;
begin
  if (Track > 0) and (Track < FTrackList.Count) then
    TTrackInfo(FTrackList.Objects[Track]).TrackActive := Value;
  for i := 0 to 2 do
    for j := 0 to FPianoTracks[i].Count - 1 do
    begin
      if Integer(FPianoTracks[i].Items.Objects[j]) = Track then
        FPianoTracks[i].Checked[j] := Value;
    end;
end;

procedure TPianoTracks.SetTrackHand(Track: Byte; Value: TTrackHand);
var
  PianoTrackSource, PianoTrackTarget: TCheckListBox;
  TrackInfo: TTrackInfo;
begin
  if (Track > 0) and (Track < FTrackList.Count) then
  begin
    TrackInfo := TTrackInfo(FTrackList.Objects[Track]);
    PianoTrackSource := FPianoTracks[Integer(TrackInfo.TrackHand)];
    PianoTrackTarget := FPianoTracks[Integer(Value)];
    PianoTrackTarget.Items.AddObject(
      TrackInfo.TrackName, TObject(TrackInfo.TrackIndex));
    PianoTrackTarget.Checked[PianoTrackTarget.Count - 1] := TrackInfo.TrackActive;
    PianoTrackSource.Items.Delete(PianoTrackSource.Items.IndexOfObject(TObject(TrackInfo.TrackIndex)));
    TrackInfo.TrackHand := Value;
  end;
end;

function TPianoTracks.GetTrackHand(Track: Byte): TTrackHand;
begin
  Result := thUnknow;
  if (Track > 0) and (Track < FTrackList.Count) then
    Result := TTrackInfo(FTrackList.Objects[Track]).TrackHand;
end;

procedure TPianoTracks.PianoDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  PianoTrackSender, PianoTrackSource: TCheckListBox;
begin
  PianoTrackSender := TCheckListBox(Sender);
  PianoTrackSource := TCheckListBox(Source);
  if PianoTrackSource.ItemIndex = -1 then Exit;
  SetTrackHand(
    Integer(PianoTrackSource.Items.Objects[PianoTrackSource.ItemIndex]),
    TTrackHand(PianoTrackSender.Tag));
  if Assigned(FOnTrackMove) then
    FOnTrackMove(Sender);
end;

procedure TPianoTracks.PianoDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  i: Byte;
begin
  Accept := Source is TCheckListBox;
  for i := 0 to 2 do
    Accept := Accept or (Source = FPianoTracks[i]);
end;

procedure TPianoTracks.PianoTrackClick(Sender: TObject);
var
  PianoTrack: TCheckListBox;
  bCheck: Boolean;
  iTrack: Integer;
begin
  PianoTrack := TCheckListBox(Sender);
  bCheck := PianoTrack.Checked[PianoTrack.ItemIndex];
  iTrack := Integer(PianoTrack.Items.Objects[PianoTrack.ItemIndex]);
  SetTrackActive(iTrack, bCheck);
  if Assigned(FOnTrackClick) then
    FOnTrackClick(Sender);
end;

procedure TPianoTracks.AddTrack(Info: TTrackInfo);
var
  PianoTrack: TCheckListBox;
begin
  FTrackList.AddObject(Info.TrackName, Info);
  PianoTrack := FPianoTracks[Integer(Info.TrackHand)];
  PianoTrack.Items.AddObject(Info.TrackName, TObject(Info.TrackIndex));
  PianoTrack.Checked[PianoTrack.Count - 1] := info.FTrackActive;
end;

procedure TPianoTracks.ClearTracks;
var
  i: integer;
begin
  FTrackList.Clear;
  for i := 0 to 2 do
    FPianoTracks[i].Clear;
end;

procedure Register;
begin
  RegisterComponents('Piano Suite', [TPianoTracks]);
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人黄页毛片网站| 精品av久久707| 欧美另类z0zxhd电影| 欧美精品一区二区在线观看| 国产精品久久久久久久久晋中| 亚洲午夜精品17c| 粉嫩欧美一区二区三区高清影视| 91官网在线观看| 国产欧美精品一区二区色综合| 亚洲成人1区2区| 色爱区综合激月婷婷| 久久久影视传媒| 美女在线观看视频一区二区| 99riav久久精品riav| 久久伊99综合婷婷久久伊| 香蕉久久夜色精品国产使用方法| eeuss鲁片一区二区三区在线看| 日韩欧美不卡在线观看视频| 亚洲图片欧美色图| 欧洲国内综合视频| 国产精品区一区二区三区| 看电视剧不卡顿的网站| 欧美日韩在线观看一区二区| 中文字幕一区二区三区乱码在线 | 亚洲成a人片在线不卡一二三区| 国产99久久久精品| 精品国产乱码久久久久久影片| 奇米四色…亚洲| 在线观看91av| 亚洲影视在线播放| 97aⅴ精品视频一二三区| 中国色在线观看另类| 精品亚洲欧美一区| 久久欧美中文字幕| 国产精品亚洲第一区在线暖暖韩国| 欧美成人精品3d动漫h| 美国十次了思思久久精品导航| 欧美日韩成人激情| 蜜乳av一区二区| 欧美成人一区二区三区| 久久成人麻豆午夜电影| 欧美xxxx老人做受| 懂色av中文一区二区三区| 国产日韩视频一区二区三区| 国产福利一区二区三区视频在线 | 久久久亚洲精品一区二区三区| 免费精品视频在线| 久久久99免费| av激情亚洲男人天堂| 亚洲天堂精品视频| 欧美日韩精品一区二区三区四区| 视频一区欧美精品| 欧美大胆一级视频| 国产成人自拍网| 亚洲精品国产第一综合99久久| 欧美日本在线观看| 九一久久久久久| 国产精品国产三级国产有无不卡| 91福利小视频| 黄色小说综合网站| 国产精品久久久久毛片软件| 日本高清免费不卡视频| 污片在线观看一区二区| 久久精品视频网| 色综合久久中文综合久久97| 天堂一区二区在线| 国产欧美一区视频| 欧美日韩一区中文字幕| 国产综合久久久久久久久久久久| 国产精品超碰97尤物18| 这里只有精品免费| 成人视屏免费看| 日韩影院在线观看| 国产精品视频免费看| 欧美精品在欧美一区二区少妇| 国产曰批免费观看久久久| 亚洲欧美色综合| 精品欧美乱码久久久久久1区2区| 99久久99久久久精品齐齐| 日本va欧美va精品发布| 亚洲欧美一区二区视频| 欧美电视剧在线观看完整版| 8x福利精品第一导航| 亚洲同性gay激情无套| 精品午夜一区二区三区在线观看| 欧美一区二区人人喊爽| 国产在线麻豆精品观看| 午夜视黄欧洲亚洲| 亚洲精品日韩一| 久久亚洲捆绑美女| 6080日韩午夜伦伦午夜伦| 97国产一区二区| 国产自产v一区二区三区c| 午夜精品久久久久久久| 国产精品久久久久久福利一牛影视| 91精品国产综合久久精品| 99精品在线观看视频| 国产夫妻精品视频| 国产在线不卡视频| 久久精品国产亚洲高清剧情介绍| 亚洲国产综合在线| 亚洲综合在线视频| 亚洲日本韩国一区| 国产精品久久久久三级| 久久久久久久综合日本| 日韩一区二区三区在线观看| 欧美一a一片一级一片| 99精品一区二区三区| 成人精品小蝌蚪| av电影天堂一区二区在线 | 成人免费观看av| 久久精品久久综合| 久久精品国产99久久6| 亚洲国产成人av| 亚洲午夜久久久久久久久久久| 一区二区三区四区蜜桃| 亚洲美女少妇撒尿| 亚洲男女一区二区三区| 自拍视频在线观看一区二区| 国产精品美女久久久久久2018| 国产人成亚洲第一网站在线播放| 2024国产精品| 国产精品网站在线观看| 国产精品国产三级国产a| 中文字幕一区二区三区不卡在线| 亚洲欧洲日韩在线| 一区二区三区日韩在线观看| 亚洲综合激情小说| 亚洲成人午夜影院| 狠狠色综合色综合网络| 国产精品538一区二区在线| av在线这里只有精品| 色婷婷一区二区| 91精品国产综合久久精品| 欧美成人一级视频| 中文字幕视频一区| 亚洲一区二区三区在线看| 日av在线不卡| 国产一区二区三区精品视频| 成人免费看黄yyy456| 欧美视频在线一区二区三区| 日韩一区二区免费在线电影| 久久尤物电影视频在线观看| 中文字幕一区二区三区在线观看| 亚洲一级二级在线| 精品亚洲aⅴ乱码一区二区三区| 丁香婷婷综合色啪| 欧美性视频一区二区三区| 欧美一区二区三区在线视频| 久久久久久免费毛片精品| 亚洲三级电影网站| 看电视剧不卡顿的网站| www.综合网.com| 91精选在线观看| 亚洲国产精品传媒在线观看| 亚洲乱码国产乱码精品精可以看| 毛片av一区二区三区| 91一区二区在线观看| 日韩亚洲欧美综合| 中文字幕五月欧美| 精品亚洲aⅴ乱码一区二区三区| 91视频观看免费| 26uuu国产一区二区三区| 一区二区三区在线观看动漫| 狠狠网亚洲精品| 欧美精品一级二级三级| 国产精品人成在线观看免费| 日本aⅴ亚洲精品中文乱码| 色综合天天天天做夜夜夜夜做| 亚洲精品在线观看视频| 午夜成人免费视频| 色综合天天性综合| 国产日产欧美一区二区三区 | 日韩一区二区三区视频在线观看| 亚洲免费观看在线视频| 国产精品综合二区| 日韩一区二区免费在线电影| 亚洲国产综合视频在线观看| jlzzjlzz亚洲日本少妇| 久久久精品中文字幕麻豆发布| 亚洲成av人片一区二区| 色婷婷综合久色| 欧美激情在线观看视频免费| 久久国产精品色婷婷| 91精品国产综合久久久久久| 亚洲最新在线观看| 91福利在线导航| 亚洲精品欧美在线| 在线视频一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 成人听书哪个软件好| 欧美精品一区二区久久久| 三级一区在线视频先锋| 在线一区二区三区四区五区 | 国产精品网站一区| 国产suv精品一区二区三区| 久久综合资源网| 国产一区二区女| 久久久国产精品麻豆| 国产高清亚洲一区|