MMEnvelp.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:45k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 11.08.98 - 01:23:42 $                                        =}
  24. {========================================================================}
  25. unit MMEnvelp;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.   Windows,
  31. {$ELSE}
  32.   WinProcs,
  33.   WinTypes,
  34. {$ENDIF}
  35.   SysUtils,
  36.   Messages,
  37.   Classes,
  38.   Graphics,
  39.   Controls,
  40.   Forms,
  41.   Dialogs,
  42.   MMObj,
  43.   MMDIBCv,
  44.   MMPanel,
  45.   MMUtils,
  46.   MMString,
  47.   MMMulDiv,
  48.   MMMath,
  49.   MMObjLst,
  50.   MMPCMSup,
  51.   MMObsrv;
  52. type
  53.   TMMEnvelopeKind = (ekRectangle, ekCircle, ekOwnerDraw);
  54.   TMMEnvelopeDrawPoint = procedure(Sender: TObject; Canvas: TCanvas;
  55.                                    Rect: TRect; Selected: Boolean) of object;
  56.   TMMEnvelope = class;
  57.   {-- TMMEnvelopePoint --------------------------------------------------}
  58.   TMMEnvelopePoint = class(TObject)
  59.   private
  60.      procedure   Store(S: TStream); virtual;
  61.      procedure   Load(S: TStream); virtual;
  62.   public
  63.      X_Value : Longint;
  64.      Y_Value : Longint;
  65.      Selected: Boolean;
  66.      constructor Create;
  67.      constructor CreateEx(X,Y: integer; Sel: Boolean);
  68.      procedure   SetParams(X,Y: integer; Sel: Boolean);
  69.      procedure   Assign(Source: TObject);
  70.   end;
  71.   {-- TMMEnvelopePointList ----------------------------------------------}
  72.   TMMEnvelopePointList = class(TObjectList)
  73.   private
  74.     FEnvelope: TMMEnvelope;
  75.     procedure PutPoint(Index: integer; Point: TMMEnvelopePoint);
  76.     function  GetPoint(Index: integer): TMMEnvelopePoint;
  77.   protected
  78.     procedure ReadData(S: TStream); override;
  79.     procedure WriteData(S: TStream); override;
  80.   public
  81.     procedure Assign(Source: TPersistent); override;
  82.     property  Items[Index: integer]: TMMEnvelopePoint read GetPoint write PutPoint; default;
  83.   end;
  84.   {-- TMMEnvelope -------------------------------------------------------}
  85.   TMMEnvelope = class(TMMMarkerPanel)
  86.   private
  87.     FDIBCanvas      : TMMDIBCanvas;
  88.     FPoints         : TMMEnvelopePointList;
  89.     FTempPoint      : TMMEnvelopePoint;
  90.     FKind           : TMMEnvelopeKind;
  91.     FPointSize      : integer;
  92.     FStartIndex     : integer;
  93.     FCurIndex       : integer;
  94.     FUpSelect       : Boolean;
  95.     FShiftBeginX    : Longint; { StartPunkt der MausOperation X values     }
  96.     FShiftBeginY    : Longint; { StartPunkt der MausOperation Y Values     }
  97.     FMinShiftX      : Longint; { max Shiftbereich nach links immer negativ }
  98.     FMaxShiftX      : Longint; { max Shiftbereich nach rechts immer pos.   }
  99.     FMinShiftY      : Longint; { max Shiftbereich nach oben immer negativ  }
  100.     FMaxShiftY      : Longint; { max Shiftbereich nach unten immer pos.    }
  101.     FButton         : TMouseButton;
  102.     FDragOffset     : TPoint;
  103.     FDragRect       : TRect;
  104.     FDragging       : Boolean;
  105.     FMoving         : Boolean;
  106.     FDrawMidLine    : Boolean;
  107.     FMidLineColor   : TColor;
  108.     FLineColor      : TColor;
  109.     FPointColor     : TColor;
  110.     FSelectedColor  : TColor;
  111.     FMoveFirstPoint : Boolean;
  112.     FMoveLastPoint  : Boolean;
  113.     FObservable     : TMMObservable;
  114.     FOnChange       : TNotifyEvent;
  115.     FOnDrawPoint    : TMMEnvelopeDrawPoint;
  116.     procedure SetMovePoints(Index: integer; aValue: Boolean);
  117.     procedure SetKind(aValue: TMMEnvelopeKind);
  118.     procedure SetColors(index: integer; aValue: TColor);
  119.     procedure SetDrawMidLine(aValue: Boolean);
  120.     procedure SetPointSize(aValue: integer);
  121.     procedure SetPoints(aValue: TMMEnvelopePointList);
  122.     function  GetCount: integer;
  123.     function  Get_YValue(X_Value: Longint): Longint;
  124.     function  GetSelected(Index: integer): Boolean;
  125.     procedure SetSelected(Index: integer; aValue: Boolean);
  126.     function  GetSelectedCount: integer;
  127.     procedure CreateInitPoints;
  128.     procedure GetMaxRange(Index: integer; var minX, maxX, minY, maxY: Longint);
  129.     procedure RemapPoints(oldMinX,oldMaxX,oldMinY,oldMaxY: Longint);
  130.     procedure DoChanged(Sender: TObject);
  131.     procedure DrawEnvelopePoints(Canvas: TMMDIBCanvas);
  132.     procedure DrawEnvelope;
  133.   protected
  134.     procedure VLineDoted(aCanvas: TCanvas; x, y1, y2: integer; Clr: TColorRef); override;
  135.     procedure HLineDoted(aCanvas:TCanvas;x1,x2,y:integer;Clr:TColorRef); override;
  136.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  137.                         X, Y: integer); override;
  138.     procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
  139.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  140.                       X, Y: integer); override;
  141.     procedure Paint; override;
  142.     procedure Changed; override;
  143.     procedure RangeChanged; override;
  144.     procedure DrawPoint(Canvas: TCanvas; Rect: TRect; Selected: Boolean); dynamic;
  145.   public
  146.     constructor Create(AOwner: TComponent); override;
  147.     destructor  Destroy; override;
  148.     procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
  149.     procedure AddObserver(O: TMMObserver);
  150.     procedure RemoveObserver(O: TMMObserver);
  151.     procedure SetRangeAll(MinX, MaxX, MinY, MaxY, YBase: Longint); override;
  152.     { TODO: einige Eigenschaften verstecken }
  153.     procedure Clear;
  154.     procedure Reset;
  155.     function  AddPoint(aPoint: TMMEnvelopePoint; Align: Boolean): Boolean;
  156.     procedure DelPoint(Index: integer);
  157.     function  LocatePoint(X_Value: Longint): integer;
  158.     function  FindPoint(X_Value: Longint): integer;
  159.     function  FindPointAtPos(X, Y: integer): integer;
  160.     function  QueryPoint(Point: TMMEnvelopePoint): Boolean;
  161.     procedure DeleteSelected;
  162.     procedure SelectAll(State: Boolean);
  163.     procedure SelectRange(idxA, idxB: integer; State: Boolean);
  164.     procedure SelectArea(Area: TRect; State: Boolean);
  165.     procedure QueryPolyMove(var minX, maxX, minY, maxY: Longint);
  166.     procedure PolyShift(DiffX, DiffY: Longint);
  167.     procedure Scale(Factor: Float);
  168.     property  Count: integer read GetCount;
  169.     property  YValue[X_Value: Longint]: Longint read Get_YValue;
  170.     property  Select[Index: integer]: Boolean read GetSelected write SetSelected;
  171.     property  CurrentIndex: integer read FCurIndex;
  172.     property  SelectedCount: integer read GetSelectedCount;
  173.   published
  174.     { Events }
  175.     property OnClick;
  176.     property OnDblClick;
  177.     property OnMouseDown;
  178.     property OnMouseMove;
  179.     property OnMouseUp;
  180.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  181.     property OnDrawPoint: TMMEnvelopeDrawPoint read FOnDrawPoint write FOnDrawPoint;
  182.     property Align;
  183.     property Bevel;
  184.     property Color default clBtnFace;
  185.     property Width default 200;
  186.     property Height default 100;
  187.     property ParentShowHint;
  188.     property ParentColor default False;
  189.     property ShowHint;
  190.     property Visible;
  191.     property Enabled;
  192.     property Kind: TMMEnvelopeKind read FKind write SetKind default ekRectangle;
  193.     property MidLineColor: TColor index 0 read FMidLineColor write SetColors default clBlack;
  194.     property LineColor: TColor index 1 read FLineColor write SetColors default clBlack;
  195.     property PointColor: TColor index 2 read FPointColor write SetColors default clWhite;
  196.     property SelectedColor: TColor index 3 read FSelectedColor write SetColors default clBlack;
  197.     property PointSize: integer read FPointSize write SetPointSize default 6;
  198.     property DrawMidLine: Boolean read FDrawMidLine write SetDrawMidLine default True;
  199.     property MoveFirstPoint: Boolean index 0 read FMoveFirstPoint write SetMovePoints default True;
  200.     property MoveLastPoint: Boolean index 1 read FMoveLastPoint write SetMovePoints default True;
  201.     property Points: TMMEnvelopePointList read FPoints write SetPoints;
  202.   end;
  203. implementation
  204. const
  205.    STREAMKENNUNG : Longint = $00564E45; { 'ENV ' }
  206. {== TMMEnvelopePoint ====================================================}
  207. constructor TMMEnvelopePoint.Create;
  208. begin
  209.    inherited Create;
  210.    X_Value := 0;
  211.    Y_Value := 0;
  212.    Selected := False;
  213. end;
  214. {-- TMMEnvelopePoint ----------------------------------------------------}
  215. constructor TMMEnvelopePoint.CreateEx(X,Y: integer; Sel: Boolean);
  216. begin
  217.    inherited Create;
  218.    X_Value := X;
  219.    Y_Value := Y;
  220.    Selected := Sel;
  221. end;
  222. {-- TMMEnvelopePoint ----------------------------------------------------}
  223. procedure TMMEnvelopePoint.Store(S: TStream);
  224. begin
  225.    S.WriteBuffer(X_Value,SizeOf(X_Value));
  226.    S.WriteBuffer(Y_Value,SizeOf(Y_Value));
  227.    S.WriteBuffer(Selected,SizeOf(Selected));
  228. end;
  229. {-- TMMEnvelopePoint ----------------------------------------------------}
  230. procedure TMMEnvelopePoint.Load(S: TStream);
  231. begin
  232.    S.ReadBuffer(X_Value,SizeOf(X_Value));
  233.    S.ReadBuffer(Y_Value,SizeOf(Y_Value));
  234.    S.ReadBuffer(Selected,SizeOf(Selected));
  235. end;
  236. {-- TMMEnvelopePoint ----------------------------------------------------}
  237. procedure TMMEnvelopePoint.Assign(Source: TObject);
  238. begin
  239.   if Source is TMMEnvelopePoint then
  240.   begin
  241.      SetParams(TMMEnvelopePoint(Source).X_Value,
  242.                TMMEnvelopePoint(Source).Y_Value,
  243.                TMMEnvelopePoint(Source).Selected);
  244.   end;
  245. end;
  246. {-- TMMEnvelopePoint ----------------------------------------------------}
  247. procedure TMMEnvelopePoint.SetParams(X,Y: integer; Sel: Boolean);
  248. begin
  249.    X_Value := X;
  250.    Y_Value := Y;
  251.    Selected := Sel;
  252. end;
  253. {== TMMEnvelopePointList ================================================}
  254. procedure TMMEnvelopePointList.PutPoint(Index: integer; Point: TMMEnvelopePoint);
  255. begin
  256.    Put(Index, Point);
  257. end;
  258. {-- TMMEnvelopePointList ------------------------------------------------}
  259. function TMMEnvelopePointList.GetPoint(Index: integer): TMMEnvelopePoint;
  260. begin
  261.    Result := TMMEnvelopePoint(Get(Index));
  262. end;
  263. {-- TMMEnvelopePointList ------------------------------------------------}
  264. procedure TMMEnvelopePointList.Assign(Source: TPersistent);
  265. var
  266.    i: integer;
  267.    pt: TMMEnvelopePoint;
  268. begin
  269.    if (Source is TMMEnvelopePointList) or (Source = nil) then
  270.    begin
  271.       BeginUpdate;
  272.       try
  273.          FreeAll;
  274.          if (Source <> nil) then
  275.          for i := 0 to TMMEnvelopePointList(Source).Count-1 do
  276.          begin
  277.             pt := TMMEnvelopePoint.Create;
  278.             pt.Assign(TMMEnvelopePointList(Source)[i]);
  279.             pt.Selected := False;
  280.             AddObject(pt);
  281.          end;
  282.       finally
  283.          EndUpdate;
  284.       end;
  285.       exit;
  286.    end;
  287.    inherited assign(Source);
  288. end;
  289. {-- TMMEnvelopePointList ------------------------------------------------}
  290. procedure TMMEnvelopePointList.ReadData(S: TStream);
  291. Var
  292.    Kennung: Longint;
  293.    ObjCount,
  294.    Index: TOLSize;
  295.    Destroy: Boolean;
  296.    MinX,MaxX,MinY,MaxY: Longint;
  297. begin
  298.    BeginUpdate;
  299.    try
  300.       S.ReadBuffer(Kennung,sizeOf(STREAMKENNUNG));
  301.       if (Kennung <> STREAMKENNUNG) then
  302.          raise EStreamError.Create('Invalid Object stream');
  303.       FreeAll;
  304.       { load stream items }
  305.       S.ReadBuffer(Destroy,SizeOf(Destroy));
  306.       DestroyObjects := Destroy;
  307.       S.ReadBuffer(MinX,SizeOf(MinX));
  308.       S.ReadBuffer(MaxX,SizeOf(MaxX));
  309.       S.ReadBuffer(MinY,SizeOf(MinY));
  310.       S.ReadBuffer(MaxY,SizeOf(MaxY));
  311.       S.ReadBuffer(ObjCount,SizeOf(Objcount));  { Read in Object count }
  312.       { make sure we have not to much points and load only our limit }
  313.       ObjCount := Min(ObjCount,(FEnvelope.RangeMaxX-FEnvelope.RangeMinX)+1);
  314.       if Capacity-Count < ObjCount then Capacity := Count+ObjCount;
  315.       { Read in Object Count }
  316.       for Index := 0 to ObjCount-1 do
  317.       begin
  318.           AddObject(ReadObjectFromStream(S));
  319.           Items[Index].Selected := False;
  320.       end;
  321.       FEnvelope.RemapPoints(MinX,MaxX,MinY,MaxY);
  322.    finally
  323.       EndUpdate;
  324.    end;
  325. end;
  326. {-- TMMEnvelopePointList ------------------------------------------------}
  327. procedure TMMEnvelopePointList.WriteData(S: TStream);
  328. var
  329.    Index,
  330.    ObjCount: TOlSize;
  331.    Destroy: Boolean;
  332.    Value: Longint;
  333. begin
  334.    { Write list to Stream }
  335.    S.WriteBuffer(STREAMKENNUNG,SizeOf(STREAMKENNUNG));
  336.    Destroy := DestroyObjects;
  337.    S.WriteBuffer(Destroy,SizeOf(Destroy));
  338.    Value := FEnvelope.RangeMinX;
  339.    S.WriteBuffer(Value, SizeOf(Value));
  340.    Value := FEnvelope.RangeMaxX;
  341.    S.WriteBuffer(Value, SizeOf(Value));
  342.    Value := FEnvelope.RangeMinY;
  343.    S.WriteBuffer(Value, SizeOf(Value));
  344.    Value := FEnvelope.RangeMaxY;
  345.    S.WriteBuffer(Value, SizeOf(Value));
  346.    ObjCount := Count;
  347.    S.WriteBuffer(ObjCount,SizeOf(ObjCount));
  348.    for Index := 0 to Count-1 do
  349.        WriteObjectToStream(Items[Index],S);
  350. end;
  351. {== TMMEnvelope =========================================================}
  352. constructor TMMEnvelope.Create(AOwner: TComponent);
  353. begin
  354.    inherited Create(AOwner);
  355.    FObservable := TMMObservable.Create;
  356.    FDIBCanvas := TMMDIBCanvas.Create(Self);
  357.    FDIBCanvas.SetBounds(0,0,Width,Height);
  358.    FPoints := TMMEnvelopePointList.Create;
  359.    FPoints.OnChange := DoChanged;
  360.    FPoints.FEnvelope := Self;
  361.    FTempPoint :=  TMMEnvelopePoint.Create;
  362.    FMoveFirstPoint := True;
  363.    FMoveLastPoint := True;
  364.    FKind     := ekRectangle;
  365.    FDragging := False;
  366.    FMoving   := False;
  367.    FUpSelect := False;
  368.    FStartIndex := 0;
  369.    FCurIndex := -1;
  370.    FDrawMidLine := True;
  371.    FMidLineColor := clBlack;
  372.    FLineColor := clBlack;
  373.    FPointColor := clWhite;
  374.    FSelectedColor := clBlack;
  375.    FPointSize := 6;
  376.    Width := 200;
  377.    Height := 100;
  378.    Color := clBtnFace;
  379.    CreateInitPoints;
  380.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  381.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  382. end;
  383. {-- TMMEnvelope ---------------------------------------------------------}
  384. destructor TMMEnvelope.Destroy;
  385. begin
  386.    FDIBCanvas.Free;
  387.    FPoints.Free;
  388.    FTempPoint.Free;
  389.    FObservable.Free;
  390.    FObservable:= nil;
  391.    inherited Destroy;
  392. end;
  393. {-- TMMEnvelope ---------------------------------------------------------}
  394. procedure TMMEnvelope.AddObserver(O: TMMObserver);
  395. begin
  396.    FObservable.AddObserver(O);
  397. end;
  398. {-- TMMEnvelope ---------------------------------------------------------}
  399. procedure TMMEnvelope.RemoveObserver(O: TMMObserver);
  400. begin
  401.    if (FObservable <> nil) then
  402.        FObservable.RemoveObserver(O);
  403. end;
  404. {-- TMMEnvelope ---------------------------------------------------------}
  405. procedure TMMEnvelope.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
  406. var
  407.   W, H: Integer;
  408. begin
  409.    W := Width;
  410.    H := Height;
  411.    inherited SetBounds(aLeft, aTop, aWidth, aHeight);
  412.    if ((W <> Width) or (H <> Height)) and
  413.       (Width > 0) and (Height > 0) and (FDIBCanvas <> nil) then
  414.    begin
  415.       FDIBCanvas.SetBounds(0,0,Width,Height);
  416.       Invalidate;
  417.    end;
  418. end;
  419. {-- TMMEnvelope ---------------------------------------------------------}
  420. procedure TMMEnvelope.SetPoints(aValue: TMMEnvelopePointList);
  421. begin
  422.    if (aValue <> FPoints) then FPoints.Assign(aValue);
  423. end;
  424. {-- TMMEnvelope ---------------------------------------------------------}
  425. procedure TMMEnvelope.DoChanged(Sender: TObject);
  426. begin
  427.    Changed;
  428. end;
  429. {-- TMMEnvelope ---------------------------------------------------------}
  430. procedure TMMEnvelope.Changed;
  431. begin
  432.    inherited Changed;
  433.    if not (csReading in ComponentState) and
  434.       not (csLoading in ComponentState) then
  435.    begin
  436.       { go trough the list and notify }
  437.       FObservable.NotifyObservers(Self);
  438.       if assigned(FOnChange) then FOnChange(Self);
  439.    end;
  440. end;
  441. {-- TMMEnvelope ---------------------------------------------------------}
  442. procedure TMMEnvelope.SetRangeAll(MinX, MaxX, MinY, MaxY, YBase: Longint);
  443. var
  444.    oldMinX,oldMaxX,oldMinY,oldMaxY: Longint;
  445. begin
  446.    if (MinX > MaxX) then SwapLong(MinX, MaxX);
  447.    if (MinY > MaxY) then SwapLong(MinY, MaxY);
  448.    if (MinX <> RangeMinX) or (MaxX <> RangeMaxX) or
  449.       (MinY <> RangeMinY) or (MaxY <> RangeMaxY) or
  450.       (YBase <> BaseY) then
  451.    begin
  452.       oldMinX := RangeMinX;
  453.       oldMaxX := RangeMaxX;
  454.       oldMinY := RangeMinY;
  455.       oldMaxY := RangeMaxY;
  456.       inherited SetRangeAll(MinX,MaxX,MinY,MaxY,YBase);
  457.       RemapPoints(oldMinX,oldMaxX,oldMinY,oldMaxY);
  458.       Invalidate;
  459.    end;
  460. end;
  461. {-- TMMEnvelope ---------------------------------------------------------}
  462. procedure TMMEnvelope.RemapPoints(oldMinX,oldMaxX,oldMinY,oldMaxY: Longint);
  463. var
  464.    i: integer;
  465. begin
  466.    if Count > 0 then
  467.    for i := 0 to Count-1 do
  468.    begin
  469.       with Points[i] do
  470.       begin
  471.          if (i = 0) then
  472.             X_Value := RangeMinX
  473.          else if (i = Count-1) then
  474.             X_Value := RangeMaxX
  475.          else
  476.             X_Value := Limit(MulDiv32(X_Value-oldMinX,RangeMaxX-RangeMinX,oldMaxX-oldMinX)+RangeMinX,RangeMinX,RangeMaxX);
  477.          Y_Value := Limit(MulDiv32(Y_Value-oldMinY,RangeMaxY-RangeMinY,oldMaxY-oldMinY)+RangeMinY,RangeMinY,RangeMaxY);
  478.       end;
  479.       Changed;
  480.    end;
  481. end;
  482. {-- TMMEnvelope ---------------------------------------------------------}
  483. procedure TMMEnvelope.Scale(Factor: Float);
  484. var
  485.    i: integer;
  486.    von, bis: integer;
  487.    FactorMin, FactorMax: Float;
  488.    Lim1, Lim2: Float;
  489. begin
  490.    FactorMin := -MaxLongint;
  491.    FactorMax := +MaxLongint;
  492.    von := ord(not FMoveFirstPoint);
  493.    bis := Count-(1+ord(not FMoveLastPoint));
  494.    for i := von to bis do
  495.    if Points[i].Y_Value <> 0 then
  496.    begin
  497.       Lim1 := RangeMinY / Points[i].Y_Value;
  498.       Lim2 := RangeMaxY / Points[i].Y_Value;
  499.       FactorMax := LimitR(FactorMax, Lim1, Lim2);
  500.       FactorMin := LimitR(FactorMin, Lim1, Lim2);
  501.    end;
  502.    Factor := LimitR(Factor, FactorMin, FactorMax);
  503.    if (Factor <> 1.0) then
  504.    begin
  505.       for i := von to bis do
  506.           Points[i].Y_Value := Round(Factor * Points[i].Y_Value);
  507.       Changed;
  508.    end;
  509. end;
  510. {-- TMMEnvelope ---------------------------------------------------------}
  511. function TMMEnvelope.GetCount: integer;
  512. begin
  513.    Result := FPoints.Count;
  514. end;
  515. {-- TMMEnvelope ---------------------------------------------------------}
  516. procedure TMMEnvelope.CreateInitPoints;
  517. begin
  518.    FTempPoint.X_Value := RangeMinX;
  519.    FTempPoint.Y_Value := BaseY;
  520.    FTempPoint.Selected := False;
  521.    AddPoint(FTempPoint,False);
  522.    FTempPoint.X_Value := RangeMaxX;
  523.    FTempPoint.Y_Value := BaseY;
  524.    FTempPoint.Selected := False;
  525.    AddPoint(FTempPoint,False);
  526.    {$IFDEF WIN32}
  527.    {$IFDEF TRIAL}
  528.    {$DEFINE _HACK1}
  529.    {$I MMHACK.INC}
  530.    {$ENDIF}
  531.    {$ENDIF}
  532. end;
  533. {-- TMMEnvelope ---------------------------------------------------------}
  534. { AddPoint f黦t einen Punkt in die Liste ein, AddPoint erzeugt eine Kopie}
  535. function TMMEnvelope.AddPoint(aPoint: TMMEnvelopePoint; Align: Boolean): Boolean;
  536. var
  537.   i: integer;
  538.   NewPoint: TMMEnvelopePoint;
  539. begin
  540.    Result := False;
  541.    if QueryPoint(aPoint) then   { passt hier Punkt ueberhaupt hin ? }
  542.    begin
  543.       NewPoint := TMMEnvelopePoint.Create;
  544.       NewPoint.Assign(aPoint);
  545.       i := LocatePoint(NewPoint.X_Value);
  546.       if (i < 1) or (i >= Count) then Points.AddObject(NewPoint)
  547.       else
  548.       begin
  549.          { neuen Punkt genau auf Linie zwischen zwei Punken einf黦en }
  550.          if Align then
  551.          with NewPoint do
  552.          begin
  553.             { Stefans Dreisatz oder wei