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

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

?? uheartmachine.pas

?? 心電圖顯示波形控件心電圖顯示波形控件心電圖顯示波形控件
?? PAS
字號:
//  THeartMachine released to the public domain by the author
//  Adi L. Miller, adi@gomiller.com 26/01/2000
//
//  Excuse the dust. Spaghetti code, but it works
//
//  Please sumbit all bug-fixes, enhancments or additions to the author
//  or just Email me that you have downloaded it... -- adi@gomiller.com
//
//  See code for relevance info
//
//  To Do:
//
//  1. Make the DrawSeries method more efficient for high-end use
//
//
unit uHeartMachine;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus;

const
  TheColors :Array[0..16] of TColor = (clRed, clLime, clYellow, clBlue, clFuchsia, clAqua, clLtGray, clDkGray, clWhite, clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal, clGray, clSilver);

type
  TGraph = Array [1..100] of Integer; // Maximum number of points (640k should be enough for everyone...)

  THeartMachine = class(TGraphicControl)
  private
    FColorBackground,   // Color of component background
    FColorGrid: TColor; // Color of grid lines
    FHGridCount,        // Number of horizontal grid lines
    FHTickCount: Byte;  // Number of ticks visible in the component
    FMin,               // Minimum value of point
    FMax: Integer;      // Maximum value of point
    FSeries: Array of TGraph;  // Array of points (each for a serie)
    FSeriesVisible: Array of Boolean; // If each serie is visible or not
    FNumOfSeries: Integer;  // Number of series
    FPopupMenu: TPopupMenu;
    procedure SetColorBackground(const Value: TColor);
    procedure SetColorGrid(const Value: TColor);
    procedure SetHGridCount(const Value: Byte);
    function RealToGrid(I: Integer): Integer; // Translates the value of the point to the absolute location on the component canvas. Needs work!
  protected
    procedure DrawBackground;
    procedure DrawGrid;
    procedure Paint; override;
    procedure DrawSeries;
    property PopupMenu;
    procedure PopupMenuDraw(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; Selected: Boolean);
    procedure PopupMeasureItem(Sender: TObject; ACanvas: TCanvas;
      var Width, Height: Integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure AddPoint(Series, Point: Integer; Name: String='');
    procedure PopupMenuClicked(Sender: TObject);
  published
    property Align;
    property ColorBackground: TColor read FColorBackground write SetColorBackground;
    property ColorGrid: TColor read FColorGrid write SetColorGrid;
    property HGridCount: Byte read FHGridCount write SetHGridCount;
    property Min: Integer read FMin write FMin;
    property Max: Integer read FMax write FMax;
    property HTickCount: Byte read FHTickCount write FHTickCount;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('System', [THeartMachine]);
end;

{ THeartMachine }

procedure THeartMachine.AddPoint(Series, Point: Integer; Name: String='');
var
  I: Integer;
  tmpMenuItem: TMenuItem;
begin
  // Making a simple range check
  if (Point > Max) or (Point < Min) then
    raise ERangeError.Create('Point value out of range ('+IntToStr(Point)+')');
  // Checking to see if a creation of a new serie is in order if so create
  if FNumOfSeries < Series then
  begin
    Inc(FNumOfSeries);
    SetLength(FSeriesVisible, Series+1);
    SetLength(FSeries, Series+1);    // Assuming that AddPoint does
    For I := 1 to 100 do             // address a serie higher then
      FSeries[Series][I] := 0;       // one of an already existing serie
    FSeriesVisible[Series] := True;  // Potential bug/mess-up
  end;
  // Creat a new menu item if missing for current serie. Should happen:
  //    1. When a new serie was just added at the section above
  //    2. When the first AddPoint called, cause .Create didn't creat the first menu itme
  if PopupMenu.Items.Count < Series+1 then
  begin
    tmpMenuItem := TMenuItem.Create(self);
    tmpMenuItem.Caption := Name;
    tmpMenuItem.Tag := Series;
    tmpMenuItem.OnClick := PopupMenuClicked;
    tmpMenuItem.Checked := True;
    tmpMenuItem.OnDrawItem := PopupMenuDraw;
    tmpMenuItem.OnMeasureItem := PopupMeasureItem;
    PopupMenu.Items.Add(tmpMenuItem);
    PopupMenu.OwnerDraw := True;
  end;
  // Update the name of the serie
  PopupMenu.Items[Series].Caption := Name;
  // Moving all points back
  For I := 2 to 100 do
    FSeries[Series][I-1] := FSeries[Series][I];
  // Placing Point in place 100
  FSeries[Series][100] := Point;

  DrawSeries;
end;

constructor THeartMachine.Create(AOwner: TComponent);
var
  I: Integer;
begin
  inherited;
  FPopupMenu := TPopupMenu.Create(Self);
  PopupMenu := FPopupMenu;
  Parent := TWinControl(AOwner);
  FNumOfSeries := 0;
  Width := 100;
  Height := 100;
  FMin := 1;
  FMax := 10;
  FHTickCount := 10;
  FHGridCount := 5;
  ColorBackground := clBlack;
  ColorGrid := clGreen;
  SetLength(FSeries, 1);
  SetLength(FSeriesVisible, 1);
  Align := alClient;
  For I := 1 to 99 do
    FSeries[0][I] := 0;
  FSeriesVisible[0] := True;
end;

destructor THeartMachine.Destroy;
begin
  inherited;
end;

procedure THeartMachine.DrawBackground;
var
  tmpRect: TRect;
begin
  tmpRect.Top := 0;
  tmpRect.Left := 0;
  tmpRect.Bottom := Height;
  tmpRect.Right := Width;
  Canvas.Brush.Color := ColorBackground;
  Canvas.Brush.Style := bsSolid;
  Canvas.FillRect(tmpRect);
end;

procedure THeartMachine.DrawGrid;
var
  I, II, Factor, XFactor: Integer;
begin
  DrawBackground;

  // Horizontal grid lines
  Factor := (Height div (HGridCount));
  Canvas.Pen.Color := ColorGrid;
  Canvas.Pen.Width := 1;
  For I := 1 to HGridCount-1 do
  begin
    Canvas.MoveTo(0,(I*Factor));
    Canvas.LineTo(Width,(I*Factor));
  end;

  // Vertical grid lines
  XFactor := Width div HTickCount;
  For II := 99 downto 100-HTickCount do
  begin
    Canvas.MoveTo(XFactor*(HTickCount-(100-II)), 0);
    Canvas.LineTo(XFactor*(HTickCount-(100-II)), Height);
  end;
end;

procedure THeartMachine.DrawSeries;
var
  XFactor, I, II: Integer;
begin
  // Very in-efficient draw. If the component is to be used in a process
  // which paints it self more than once a second, then this method
  // should be imporved or flickering would occur.
  // To improve, use CopyRect to move the already painted area backwards
  // and just repaint the new points.
  // Special care should be made to the following situation:
  //
  // Every serie can add a point regardless of others
  DrawGrid;
  Canvas.Pen.Width := 1;
  XFactor := Width div HTickCount;
  For I := 0 to Length(FSeries) - 1 do
    if FSeriesVisible[I] then
    begin
      Canvas.Pen.Color := TheColors[I];
      Canvas.MoveTo(XFactor*(HTickCount), RealToGrid(FSeries[I][100]));
      For II := 99 downto 100-HTickCount do
        Canvas.LineTo(XFactor*(HTickCount-(100-II)), RealToGrid(FSeries[I][II]));
    end;
end;

procedure THeartMachine.Paint;
begin
  inherited;
  DrawSeries;
end;

procedure THeartMachine.PopupMeasureItem(Sender: TObject; ACanvas: TCanvas;
  var Width, Height: Integer);
begin
  // To give menu items broader boundry
  Width := ACanvas.TextWidth((Sender as TMenuItem).Caption)+10;
end;

procedure THeartMachine.PopupMenuClicked(Sender: TObject);
var
  B: Boolean;
  tmpMenuItem: TMenuItem;
begin
  // To make a serie disappear/reappear from the graph
  tmpMenuItem := (Sender as TMenuItem);
  B := not FSeriesVisible[tmpMenuItem.Tag];
  FSeriesVisible[tmpMenuItem.Tag] := B;
  tmpMenuItem.Checked := B;
  DrawSeries;
end;

procedure THeartMachine.PopupMenuDraw(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
var
  AMenuItem: TMenuItem;
  tmpRect: TRect;
begin
  // Draw the menu items
  AMenuItem := (Sender as TMenuItem);
  if Selected then
  begin
    // Highlighted rect
    ACanvas.Brush.Color := clActiveCaption;
    ACanvas.FillRect(ARect);
  end else
  begin
    // Un-highlighted rect
    ACanvas.Brush.Color := clBtnFace;
    ACanvas.FillRect(ARect);
  end;
  // Draw menu text with the assigned color from the TheColors set
  ACanvas.Font.Color := TheColors[AMenuItem.Tag];
  ACanvas.TextOut(ARect.Left+12, ARect.Top+3, AMenuItem.Caption);
  // Draw V mark
  if AMenuItem.Checked then
  begin
    if Selected then
      ACanvas.Pen.Color := clCaptionText
    else
      ACanvas.Pen.Color := clMenuText;
    ACanvas.Pen.Width := 2;
    ACanvas.MoveTo(ARect.Left+1, ARect.Top+9);
    ACanvas.LineTo(ARect.Left+4, ARect.Top+12);
    ACanvas.LineTo(ARect.Left+9, ARect.Top+6);
  // Or use this code instead of the drawn V mark for a simple square
{    ACanvas.Brush.Color := clBlack;
    with tmpRect do
    begin
      Left := 3; Top := ARect.Top+8; Right := 7; Bottom := ARect.Top+12;
    end;
    ACanvas.FillRect(tmpRect);}
  end;
end;

function THeartMachine.RealToGrid(I: Integer): Integer;
begin
  // Translates the value given by the "user" to a value absolute to
  // the component's canvas.
  Result := Trunc((Height-2) - ((I-Min)*((Height-2) / (Max-Min))))+1;
end;

procedure THeartMachine.SetColorBackground(const Value: TColor);
begin
  // rtfm
  FColorBackground := Value;
  DrawGrid;
end;

procedure THeartMachine.SetColorGrid(const Value: TColor);
begin
  // rtfm
  FColorGrid := Value;
  DrawGrid;
end;

procedure THeartMachine.SetHGridCount(const Value: Byte);
begin
  // rtfm
  FHGridCount := Value;
  DrawGrid;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩在线直播| 亚洲黄色av一区| 亚洲色图丝袜美腿| 久久国产免费看| 日本黄色一区二区| 国产欧美日韩另类视频免费观看| 亚洲成在线观看| av在线免费不卡| 久久精品视频在线看| 日韩成人一级大片| 欧美最猛黑人xxxxx猛交| 国产婷婷色一区二区三区在线| 日韩有码一区二区三区| 成人黄色小视频在线观看| 精品国产99国产精品| 日韩av电影免费观看高清完整版 | 亚洲精品欧美专区| 国产成人精品综合在线观看| 欧美一级片在线看| 日日夜夜免费精品| 欧美日韩国产精品自在自线| 亚洲自拍与偷拍| 99久久免费精品高清特色大片| 久久久久久久久久电影| 美女诱惑一区二区| 91精品国产高清一区二区三区| 亚洲综合偷拍欧美一区色| 91丝袜美女网| 亚洲乱码日产精品bd| 9久草视频在线视频精品| 亚洲三级在线免费| 欧美专区亚洲专区| 亚洲第一主播视频| 91精品国产综合久久福利软件| 爽爽淫人综合网网站| 欧美精品丝袜中出| 奇米在线7777在线精品| 制服丝袜中文字幕亚洲| 人人精品人人爱| 亚洲精品一区二区三区精华液| 最新中文字幕一区二区三区| 91蝌蚪porny| 亚洲最色的网站| 欧美美女喷水视频| 美女视频第一区二区三区免费观看网站| 欧美日韩在线播放| 日韩不卡免费视频| 精品国产麻豆免费人成网站| 色欲综合视频天天天| 亚洲自拍偷拍图区| 精品欧美乱码久久久久久| 国产一区二区不卡老阿姨| 欧美国产成人在线| 91传媒视频在线播放| 日本aⅴ亚洲精品中文乱码| 久久人人爽爽爽人久久久| 成人高清免费在线播放| 依依成人精品视频| 日韩一区二区视频在线观看| 国产精品资源在线| 亚洲精品久久嫩草网站秘色| 欧美一区二区播放| 成人激情黄色小说| 日韩电影在线一区二区三区| 久久精品亚洲精品国产欧美| 欧美天天综合网| 国产99精品在线观看| 日韩在线a电影| 亚洲视频一区在线观看| 欧美一级精品大片| 91在线视频官网| 精品亚洲国内自在自线福利| 一区二区三区欧美| 久久精品欧美一区二区三区麻豆 | 99在线视频精品| 美女视频黄a大片欧美| 国产精品久久久爽爽爽麻豆色哟哟| 精品婷婷伊人一区三区三| 国产精品一区一区三区| 无吗不卡中文字幕| 亚洲日本在线a| 久久综合九色综合欧美亚洲| 欧美撒尿777hd撒尿| 大美女一区二区三区| 国产区在线观看成人精品| 欧美私人免费视频| 成人免费高清在线观看| 蜜臀av一区二区在线免费观看| 亚洲免费成人av| 日本一区二区动态图| 日韩天堂在线观看| 欧美日韩亚州综合| 99久久99久久精品免费看蜜桃| 国产在线视频精品一区| 同产精品九九九| 一区二区三区 在线观看视频| 国产精品污www在线观看| 日韩视频在线观看一区二区| 欧美中文字幕亚洲一区二区va在线 | 亚洲女人的天堂| 国产精品久久精品日日| 久久久久国产精品麻豆| 日韩欧美国产三级| 欧美日韩国产大片| 欧美日韩小视频| 欧美乱妇一区二区三区不卡视频| 在线免费观看视频一区| 91福利在线播放| 色综合av在线| 色婷婷综合五月| 色欧美片视频在线观看| av一区二区三区四区| 国产69精品久久777的优势| 国产麻豆精品在线| 国产精品99久久久| 国产v综合v亚洲欧| 成人激情动漫在线观看| 成人美女视频在线观看| 99精品视频免费在线观看| 99re热这里只有精品视频| 91麻豆成人久久精品二区三区| 91免费国产在线观看| 91久久精品一区二区二区| 欧美日韩免费观看一区二区三区| 在线看国产一区二区| 欧美日韩亚洲综合在线| 欧美精品777| 日韩女同互慰一区二区| 久久久久99精品一区| 国产精品对白交换视频| 亚洲精品第1页| 无吗不卡中文字幕| 久久99热狠狠色一区二区| 国产成人鲁色资源国产91色综| 成人av一区二区三区| 色综合色综合色综合色综合色综合 | 欧美日韩国产a| 日韩欧美黄色影院| 日本一区二区视频在线| 136国产福利精品导航| 五月天网站亚洲| 国产精品综合久久| 99精品在线免费| 欧美老肥妇做.爰bbww视频| 91精品综合久久久久久| 久久美女高清视频 | 中文字幕乱码久久午夜不卡| 亚洲品质自拍视频| 强制捆绑调教一区二区| 成人午夜在线免费| 欧美久久久影院| 国产拍欧美日韩视频二区| 亚洲激情自拍偷拍| 国产一区二三区| 欧美午夜免费电影| 久久久久久久久久久久久夜| 玉足女爽爽91| 国产高清无密码一区二区三区| 91九色02白丝porn| 精品福利一区二区三区| 亚洲精品亚洲人成人网在线播放| 久久丁香综合五月国产三级网站 | 亚洲人成伊人成综合网小说| 蜜臀久久99精品久久久久宅男| jiyouzz国产精品久久| 日韩三级视频在线看| 亚洲人午夜精品天堂一二香蕉| 激情文学综合丁香| 在线看国产一区| 国产精品狼人久久影院观看方式| 日韩影院免费视频| 欧美亚州韩日在线看免费版国语版| 久久久久国产精品人| 另类小说综合欧美亚洲| 欧美日韩高清在线| 亚洲精品免费在线观看| 国产成人午夜高潮毛片| 欧美一级精品在线| 天堂在线一区二区| 欧美午夜片在线看| 亚洲人成网站色在线观看| 激情深爱一区二区| 欧美一级夜夜爽| 日韩精品久久久久久| 欧美日韩一区二区欧美激情| 1000精品久久久久久久久| 成人av网站免费| 国产精品青草综合久久久久99| 国产一区二区女| 久久久久久久久久久久久夜| 韩国精品主播一区二区在线观看| 91精选在线观看| 美女www一区二区| 日韩精品资源二区在线| 美女视频第一区二区三区免费观看网站| 欧美日韩久久一区| 免费人成在线不卡| 日韩欧美久久一区| 国产精品资源站在线| 欧美极品美女视频|