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

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

?? sscrollbar.pas

?? AlphaControls是一個Delphi標準控件的集合
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
unit sScrollBar;
{$I sDefs.inc}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
  Consts, sPanel, sUtils, sStyleUtil, sConst, extctrls, sCommonData, sDefaults;

type

  TsScrollInfo = record
    Visible : boolean;
    Max : integer;
    Range : integer;
    Page : integer;
    SmallChange : integer;
    BigChange : integer;
    Rect : TRect;
  end;

  TOnChangeEvent = procedure(Sender: TObject; OldValue : integer) of object;

  TsScrollBar = class(TWinControl)
  private
    FKind: TScrollBarKind;
    FPosition: Integer;
    FMin: Integer;
    FMax: Integer;
    FPageSize: Integer;
    FRTLFactor: Integer;
    FSmallChange: TScrollBarInc;
    FLargeChange: TScrollBarInc;
    FOnChange: TOnChangeEvent;
    FOnScroll: TScrollEvent;
    FBtn1Rect : TRect;
    FBtn2Rect : TRect;
    FBar1Rect : TRect;
    FBar2Rect : TRect;
    FSliderRect : TRect;
    FBtn1SkinIndex : integer;
    FBtn2SkinIndex : integer;
    FScrollSliderIndex : integer;
    Timer : TTimer;
    FBtn1State: integer;
    FBar2State: integer;
    FBtn2State: integer;
    FBar1State: integer;
    FSliderState : integer;
    FSmooth: boolean;
    FCommonData: TsCommonData;
    FDisabledKind: TsDisabledKind;
    procedure DoScroll(var Message: TWMScroll);
    function NotRightToLeft: Boolean;
    procedure SetKind(Value: TScrollBarKind);
    procedure SetMax(Value: Integer);
    procedure SetMin(Value: Integer);
    procedure SetPosition(Value: Integer);
    procedure SetPageSize(Value: Integer);
    procedure CNHScroll(var Message: TWMHScroll); message CN_HSCROLL;
    procedure CNVScroll(var Message: TWMVScroll); message CN_VSCROLL;
    procedure CNCtlColorScrollBar(var Message: TMessage); message CN_CTLCOLORSCROLLBAR;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
    procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
    procedure WMPaint(var Msg: TMessage); message WM_PAINT;
    procedure WMNCPaint(var Msg: TMessage); message WM_NCPAINT;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure SetInteger(Index : integer; Value: integer);
    procedure SetDisabledKind(const Value: TsDisabledKind);
  protected
    CI : TCacheInfo;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure Change(OldValue : integer); dynamic;
    procedure Scroll(ScrollCode: TScrollCode; var ScrollPos: Integer); dynamic;
    procedure WndProc(var Message: TMessage); override;
    procedure Paint;

    procedure InitDontChange;
    procedure ClearDontChange;

    procedure DrawBtnTop(b : TBitmap); overload;
    procedure DrawBtnLeft(b : TBitmap); overload;
    procedure DrawBtnRight(b : TBitmap); overload;
    procedure DrawBtnBottom(b : TBitmap); overload;
    procedure DrawSlider(b : TBitmap); overload;

    function Bar1Rect : TRect;
    function Bar2Rect : TRect;
    function Btn1Rect : TRect;
    function Btn2Rect : TRect;
    function Btn1DRect : TRect;
    function Btn2DRect : TRect;
    function WorkSize : integer;
    function SliderRect : TRect;
    function SliderSize : integer;
    function Btn1SkinIndex : integer;
    function Btn2SkinIndex : integer;
    function ScrollSliderIndex : integer;
    function CoordToPoint(p : TPoint) : TPoint;
    function CoordToPosition(p : TPoint) : integer;
    function PositionToCoord : integer;
    function FirstPoint : integer;
    function SliderSectionName : string;
    function BarIsHot : boolean;
    procedure PrepareTimer;
    procedure PrepareBtnTimer;
    procedure PrepareBarTimer;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure KeyDown(var Key: word; Shift: TShiftState); override;
  public
    RepaintNeeded : boolean;
    MouseOffset : integer;
    DrawingForbidden : boolean;
    LinkedControl : TControl;
    Ontop : boolean;
    DontChange : boolean;
    LastPosition : integer;
    function CanFocus: Boolean; override;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Skinable : boolean;
    procedure AfterConstruction; override;
    procedure Loaded; override;
    procedure SetParams(APosition, AMin, AMax: Integer);
    procedure UpdateBar;
    procedure OnTimer(Sender : TObject);
    procedure OnBtnTimer(Sender : TObject);
    procedure OnBarTimer(Sender : TObject);
    property Btn1State : integer index 0 read FBtn1State write SetInteger;
    property Btn2State : integer index 1 read FBtn2State write SetInteger;
    property Bar1State : integer index 2 read FBar1State write SetInteger;
    property Bar2State : integer index 3 read FBar2State write SetInteger;
    property SliderState : integer index 4 read FSliderState write SetInteger;
    property CommonData : TsCommonData read FCommonData write FCommonData;
  published
    property Align;
    property Anchors;
    property BiDiMode;
    property Constraints;
    property Ctl3D;
    property DisabledKind : TsDisabledKind read FDisabledKind write SetDisabledKind default DefDisabledKind;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Kind: TScrollBarKind read FKind write SetKind default sbHorizontal;
    property LargeChange: TScrollBarInc read FLargeChange write FLargeChange default 1;
    property Max: Integer read FMax write SetMax default 100;
    property Min: Integer read FMin write SetMin default 0;
    property PageSize: Integer read FPageSize write SetPageSize;
    property ParentBiDiMode;
    property ParentCtl3D;
    property ParentShowHint;
    property PopupMenu;
    property Position: Integer read FPosition write SetPosition default 0;
    property ShowHint;
    property SmallChange: TScrollBarInc read FSmallChange write FSmallChange default 1;
    property Smooth : boolean read FSmooth write FSmooth default True;
    property TabOrder;
    property TabStop default True;
    property Visible;
    property OnContextPopup;
    property OnChange: TOnChangeEvent read FOnChange write FOnChange;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseUp;
    property OnScroll: TScrollEvent read FOnScroll write FOnScroll;
    property OnStartDock;
    property OnStartDrag;
  end;

implementation

uses sGraphUtils, sBorders, sSkinProps, math, sMessages, commctrl, sMaskData,
  sStyleSimply, sVclUtils, sAlphaGraph;

var
  i1 : integer;
  p : TPoint;
//  co : integer;

{ TsScrollBar }

procedure TsScrollBar.AfterConstruction;
begin
  inherited;
  FCommonData.Loaded;
end;

function TsScrollBar.Btn1Rect: TRect;
begin
  FBtn1Rect.Left := 0;
  FBtn1Rect.Top := 0;
  if Kind = sbHorizontal then begin
    FBtn1Rect.Right := GetSystemMetrics(SM_CXHSCROLL);
    FBtn1Rect.Bottom := Height;
  end
  else begin
    FBtn1Rect.Right := Width;
    FBtn1Rect.Bottom := GetSystemMetrics(SM_CYVSCROLL);
  end;
  Result := FBtn1Rect;
end;

function TsScrollBar.Btn1SkinIndex: integer;
begin
  if Kind = sbHorizontal then begin
    FBtn1SkinIndex := GetSkinIndex(ArrowLeft);
  end
  else begin
    FBtn1SkinIndex := GetSkinIndex(ArrowTop);
  end;
  Result := FBtn1SkinIndex;
end;

function TsScrollBar.Btn2Rect: TRect;
begin
  if Kind = sbHorizontal then begin
    FBtn2Rect.Left := Width - GetSystemMetrics(SM_CXHSCROLL);
    FBtn2Rect.Top := 0;
    FBtn2Rect.Right := Width;
    FBtn2Rect.Bottom := Height;
  end
  else begin
    FBtn2Rect.Left := 0;
    FBtn2Rect.Top := Height - GetSystemMetrics(SM_CYVSCROLL);
    FBtn2Rect.Right := Width;
    FBtn2Rect.Bottom := Height;
  end;
  Result := FBtn2Rect;
end;

function TsScrollBar.Btn2SkinIndex: integer;
begin
  if Kind = sbHorizontal then begin
    FBtn2SkinIndex := GetSkinIndex(ArrowRight);
  end
  else begin
    FBtn2SkinIndex := GetSkinIndex(ArrowBottom);
  end;
  Result := FBtn2SkinIndex;
end;

procedure TsScrollBar.Change(OldValue : integer);
begin
  inherited Changed;
  if Assigned(FOnChange) and not (DontChange) then FOnChange(Self, OldValue);
end;

procedure TsScrollBar.CNCtlColorScrollBar(var Message: TMessage);
begin
  with Message do CallWindowProc(DefWndProc, Handle, Msg, WParam, LParam);
end;

procedure TsScrollBar.CNHScroll(var Message: TWMHScroll);
begin
  DoScroll(Message);
end;

procedure TsScrollBar.CNVScroll(var Message: TWMVScroll);
begin
  DoScroll(Message);
end;

function TsScrollBar.CoordToPoint(p: TPoint): TPoint;
begin
  Result := ScreenToClient(P);
end;

function TsScrollBar.CoordToPosition(p: TPoint): integer;
begin
  if Enabled then begin
    if Kind = sbHorizontal then begin
      Result := Round(
                (p.x - GetSystemMetrics(SM_CXHSCROLL) - SliderSize / 2) * (Max - Min) / (Width - 2 * GetSystemMetrics(SM_CXHSCROLL) - SliderSize)
                );
    end
    else begin
      Result := Round(
                (p.y - GetSystemMetrics(SM_CYVSCROLL) - SliderSize / 2) * (Max - Min) / (Height - 2 * GetSystemMetrics(SM_CYVSCROLL) - SliderSize)
                );
    end;
  end
  else Result := 0;
end;

constructor TsScrollBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCommonData := TsCommonData.Create(TWinControl(Self), True);
  FCommonData.FCacheBmp.PixelFormat := pf24bit;
  CI.Bmp := FCommonData.FCacheBmp;
  CI.Ready := True;
  CI.x := 0;
  CI.Y := 0;
  FCommonData.COC := COC_TsScrollBar;
  Width := 121;
  Height := GetSystemMetrics(SM_CYHSCROLL);
  TabStop := True;
  ControlStyle := [csDoubleClicks, csOpaque];
  FKind := sbHorizontal;
  FPosition := 0;
  FMin := 0;
  FMax := 100;
  FSmallChange := 1;
  FLargeChange := 1;
  FSmooth := True;

  Btn1State := 0;
  Btn2State := 0;
  Bar1State := 0;
  Bar2State := 0;
  FBtn1SkinIndex := -1;
  FBtn2SkinIndex := -1;

  FBtn1Rect.Right := 0;
  FBtn2Rect.Right := 0;
  if SysLocale.FarEast and (Win32Platform = VER_PLATFORM_WIN32_NT) then ImeMode := imDisable;
  FDisabledKind := DefDisabledKind;
end;


procedure TsScrollBar.CreateParams(var Params: TCreateParams);
const
  Kinds: array[TScrollBarKind] of DWORD = (SBS_HORZ, SBS_VERT);
begin
  Params.WindowClass.style := Params.WindowClass.style and not WS_BORDER and not WS_DLGFRAME and not WS_THICKFRAME;
  inherited CreateParams(Params);
  // Currently drawing by system is not used
{  if not Skinable then begin
    CreateSubClass(Params, 'SCROLLBAR');
    Params.Style := Params.Style or Kinds[FKind];
    if FKind = sbVertical then
      if not UseRightToLeftAlignment then
        Params.Style := Params.Style or SBS_RIGHTALIGN
      else
        Params.Style := Params.Style or SBS_LEFTALIGN;
  end;}
  if NotRightToLeft then FRTLFactor := 1 else FRTLFactor := -1;
end;


procedure TsScrollBar.CreateWnd;
var
  ScrollInfo: TScrollInfo;
begin
  inherited CreateWnd;
  SetScrollRange(Handle, SB_CTL, FMin, FMax, False);
  ScrollInfo.cbSize := SizeOf(ScrollInfo);
  ScrollInfo.nPage := FPageSize;
  ScrollInfo.fMask := SIF_PAGE;
  SetScrollInfo(Handle, SB_CTL, ScrollInfo, False);
  if NotRightToLeft then begin
    SetScrollPos(Handle, SB_CTL, FPosition, True)
  end
  else begin
    SetScrollPos(Handle, SB_CTL, FMax - FPosition, True);
  end;
end;

destructor TsScrollBar.Destroy;
begin
//  ParentSStyle := nil;
  if Assigned(FCommonData) then FreeAndNil(FCommonData);
  if Assigned(Timer) then FreeAndNil(Timer);
  inherited Destroy;
end;

procedure TsScrollBar.DoScroll(var Message: TWMScroll);
var
  ScrollPos: Integer;
  NewPos: Longint;
  ScrollInfo: TScrollInfo;
begin
  with Message do begin
    NewPos := FPosition;
    case TScrollCode(ScrollCode) of
      scLineUp:
        Dec(NewPos, FSmallChange * FRTLFactor);
      scLineDown:
        Inc(NewPos, FSmallChange * FRTLFactor);
      scPageUp:
        Dec(NewPos, FLargeChange * FRTLFactor);
      scPageDown:
        Inc(NewPos, FLargeChange * FRTLFactor);
      scPosition, scTrack:
        with ScrollInfo do begin
          cbSize := SizeOf(ScrollInfo);
          fMask := SIF_ALL;
          GetScrollInfo(Handle, SB_CTL, ScrollInfo);
          NewPos := nTrackPos;
          { We need to reverse the positioning because SetPosition below
            calls SetParams that reverses the position. This acts as a
            double negative. }
          if not NotRightToLeft then NewPos := FMax - NewPos;
        end;
      scTop:
        NewPos := FMin;
      scBottom:
        NewPos := FMax;
    end;
    if NewPos < FMin then NewPos := FMin;
    if NewPos > FMax then NewPos := FMax;
    ScrollPos := NewPos;
    Scroll(TScrollCode(ScrollCode), ScrollPos);
    SetPosition(ScrollPos);
  end;
end;

procedure TsScrollBar.DrawBtnBottom(b: TBitmap);
begin
  Ci.Bmp := b;
  PaintItem(Btn2SkinIndex, ArrowBottom, Ci, True,
    Btn2State,
    Btn2DRect,
    Point(Btn2Rect.Left, Btn2Rect.Top), b);
  Ci.Bmp := FCommonData.FCacheBmp;

  i1 := GetMaskIndex(FBtn2SkinIndex, ArrowBottom, ItemGlyph);
  if IsValidImgIndex(i1) and (ma[i1].Bmp.Height div 2 < HeightOf(FBtn2Rect)) then begin
    p.x := FBtn2Rect.Left + (WidthOf(FBtn2Rect) - ma[i1].Bmp.Width div 3) div 2;// + integer(Btn2State = 2);
    p.y := FBtn2Rect.Top + (HeightOf(FBtn2Rect) - ma[i1].Bmp.Height div 2) div 2;// + integer(Btn2State = 2);
    if (p.x < 0) or (p.y < 0) then Exit; 
    PaintRasterGlyph(b, ma[i1].Bmp,
            p, Btn2State, ma[i1].TransparentColor);
  end;
end;

procedure TsScrollBar.DrawBtnLeft(b: TBitmap);
begin
  Ci.Bmp := b;
  PaintItem(Btn1SkinIndex, ArrowLeft, Ci, True,
    Btn1State,
    Btn1DRect,
    Point(Btn1Rect.Left, Btn1Rect.Left), b);
  Ci.Bmp := FCommonData.FCacheBmp;

  i1 := GetMaskIndex(Btn1SkinIndex, ArrowLeft, ItemGlyph);
  if IsValidImgIndex(i1) and (ma[i1].Bmp.Width div 3 < WidthOf(FBtn1Rect)) then begin
    p.x := FBtn1Rect.Left + (WidthOf(FBtn1Rect) - ma[i1].Bmp.Width div 3) div 2;// + integer(Btn1State = 2);
    p.y := FBtn1Rect.Top + (HeightOf(FBtn1Rect) - ma[i1].Bmp.Height div 2) div 2;// + integer(Btn1State = 2);
    if (p.x < 0) or (p.y < 0) then Exit; 
    PaintRasterGlyph(b, ma[i1].Bmp,
            p, Btn1State, ma[i1].TransparentColor);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久久久综合体桃花网| 国产欧美久久久精品影院| 亚洲精品一区二区三区在线观看| 中文字幕免费一区| 欧美96一区二区免费视频| 99国内精品久久| 国产偷国产偷精品高清尤物| 午夜欧美大尺度福利影院在线看| 风间由美一区二区三区在线观看| 日韩一区二区电影网| 亚洲电影一区二区三区| 成人91在线观看| 国产人伦精品一区二区| 久草这里只有精品视频| 欧美日韩国产另类一区| 亚洲国产日韩a在线播放| 91视频在线看| 中文字幕在线一区| 成人高清免费观看| 国产喷白浆一区二区三区| 韩国精品主播一区二区在线观看| 欧美高清www午色夜在线视频| 一区二区三区日韩在线观看| 91亚洲男人天堂| 亚洲色图.com| 日本道色综合久久| 亚洲精品成人a在线观看| 97精品久久久午夜一区二区三区| 国产精品成人免费精品自在线观看| 国产成人精品影视| 国产精品成人一区二区三区夜夜夜| 国产精品一区二区不卡| 久久久久久久久久看片| 国产成人午夜视频| 日本一区二区三区dvd视频在线 | gogo大胆日本视频一区| 亚洲国产精品v| 99久久婷婷国产精品综合| 亚洲日本中文字幕区| 色美美综合视频| 日韩二区三区四区| 欧美精品一区二区三区在线播放| 狠狠色综合播放一区二区| 国产欧美日产一区| 色激情天天射综合网| 亚瑟在线精品视频| 欧美xxxxxxxx| 成人三级在线视频| 亚洲欧美另类久久久精品2019| 在线精品视频免费播放| 日韩国产精品大片| 久久综合九色综合97婷婷| 成人免费视频视频在线观看免费| 最新中文字幕一区二区三区| 欧美最猛性xxxxx直播| 日韩不卡一二三区| 国产精品美女久久久久久久久 | 日韩午夜在线观看视频| 国产精品99久久不卡二区| 中文av一区特黄| 欧美久久久久久久久久| 国产成人亚洲综合色影视| 亚洲美女少妇撒尿| 精品国产精品网麻豆系列| 99久久精品国产观看| 奇米影视在线99精品| 亚洲欧洲国产日本综合| 欧美日韩三级在线| 成人精品视频.| 日韩影院免费视频| 亚洲欧美在线aaa| 日韩欧美一区二区久久婷婷| av一区二区三区在线| 免费人成黄页网站在线一区二区| 亚洲日本中文字幕区| 日韩免费观看高清完整版在线观看| 99视频有精品| 国产综合色产在线精品 | 国产精品人成在线观看免费| 欧美日韩国产天堂| 99re热这里只有精品免费视频| 麻豆91精品视频| 亚洲国产一区二区视频| 中文字幕一区二区三区色视频| 欧美电视剧免费全集观看| 欧美中文字幕一区二区三区亚洲| 福利一区在线观看| 国产麻豆精品视频| 日本亚洲三级在线| 亚洲韩国精品一区| 亚洲精品国久久99热| 中文字幕精品在线不卡| 精品国产一区二区在线观看| 制服视频三区第一页精品| 在线观看免费亚洲| 色婷婷精品大视频在线蜜桃视频| 成人午夜激情片| 国产乱码精品一区二区三区av| 日韩中文字幕一区二区三区| 亚洲一区二区三区精品在线| 一区二区三区资源| 亚洲欧美日韩一区二区三区在线观看| 亚洲国产精品av| 国产精品美日韩| 国产精品久久久久久亚洲伦| 中文字幕巨乱亚洲| 国产精品第四页| 日韩一区日韩二区| 亚洲美女淫视频| 亚洲综合在线观看视频| 一区二区三区av电影| 亚洲影视在线播放| 丝袜美腿亚洲色图| 日本成人在线网站| 日本欧美肥老太交大片| 久久国产精品色婷婷| 国产精品一区免费在线观看| 韩国av一区二区三区在线观看| 国产麻豆成人精品| 不卡影院免费观看| 欧洲精品在线观看| 欧美另类videos死尸| 91精品国产日韩91久久久久久| 日韩欧美在线影院| 久久久久国产精品免费免费搜索| 久久精品视频免费观看| 中文字幕一区二区三区在线不卡| 亚洲激情自拍偷拍| 美国十次了思思久久精品导航| 开心九九激情九九欧美日韩精美视频电影| 青青青爽久久午夜综合久久午夜| 极品少妇xxxx精品少妇| 丰满少妇在线播放bd日韩电影| 成人教育av在线| 欧美在线观看一二区| 91精品国产91久久久久久最新毛片| 久久伊人蜜桃av一区二区| 国产精品国产三级国产三级人妇| 一区二区三区四区激情| 毛片不卡一区二区| 99久久精品免费观看| 欧美精品成人一区二区三区四区| 欧美哺乳videos| 亚洲欧洲日产国码二区| 日本女优在线视频一区二区| 国产69精品久久久久777| 91久久精品一区二区三区| 日韩一级片网站| 亚洲视频图片小说| 欧美aaaaaa午夜精品| 99re这里只有精品视频首页| 欧美一区二区三区播放老司机| 中文文精品字幕一区二区| 亚洲第一电影网| 丰满少妇久久久久久久| 9191国产精品| 自拍av一区二区三区| 精品一区二区在线播放| 日本黄色一区二区| 国产欧美日产一区| 免费成人在线播放| 91福利精品第一导航| 久久精品一区四区| 日韩av一级电影| 在线欧美小视频| 国产精品乱码久久久久久| 日韩精品乱码免费| 色一情一伦一子一伦一区| 久久久久久久久久电影| 男女视频一区二区| 欧美色图在线观看| 日韩理论片一区二区| 国产激情精品久久久第一区二区| 欧美精品九九99久久| 亚洲欧美日韩久久| www.亚洲国产| 欧美激情资源网| 国产乱码精品一区二区三| 日韩一区二区视频在线观看| 亚洲va韩国va欧美va| 色香蕉久久蜜桃| 亚洲人成网站在线| 99久久久无码国产精品| 欧美国产精品一区| 国产自产2019最新不卡| 精品乱码亚洲一区二区不卡| 日韩av午夜在线观看| 欧美日韩国产美| 亚洲图片一区二区| 欧美日韩卡一卡二| 五月天一区二区| 欧美卡1卡2卡| 午夜a成v人精品| 91精品国产综合久久福利| 亚洲成a人片在线不卡一二三区| 欧美亚洲动漫精品| 亚洲观看高清完整版在线观看| 在线日韩国产精品| 日日夜夜精品视频免费| 91精品在线麻豆|