home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 February / Chip_2000-02_cd.bin / zkuste / Delphi / navody / tt / numlists.txt < prev    next >
Text File  |  1999-11-22  |  27KB  |  968 lines

  1. {*******************************************************}
  2. {*                                                     *}
  3. {*      Pro VCL Extensions Library                     *}
  4. {*      Lists Unit                                     *}
  5. {*                                                     *}
  6. {*      Copyright (c) 1996-98 by Dmitry Barabash       *}
  7. {*                                                     *}
  8. {*******************************************************}
  9.  
  10. unit ProLists;
  11.  
  12. {$I PRO.INC}
  13.  
  14. interface
  15.  
  16. uses {$IFDEF WIN32} Windows, {$ELSE} WinTypes, {$ENDIF} SysUtils, Classes;
  17.  
  18. type
  19.  
  20. { Exception classes }
  21.  
  22.   EIntegerListError = class(EListError);
  23.   EFloatListError = class(EListError);
  24.  
  25. { TIntegerList }
  26.  
  27.   PLongArray = ^TLongArray;
  28.   TLongArray = array[0..MaxListSize - 1] of LongInt;
  29.  
  30.   TIntegerList = class(TPersistent)
  31.   private
  32.     { Variables for properties }
  33.     FList : TList;
  34.     FMin : LongInt;
  35.     FMax : LongInt;
  36.     FDuplicates : TDuplicates;
  37.     FSorted : Boolean;
  38.     { Property access methods }
  39.     procedure SetMin(Value : LongInt);
  40.     procedure SetMax(Value : LongInt);
  41.     procedure SetSorted(Value : Boolean);
  42.     function GetList : PLongArray;
  43.     { Private methods }
  44.     procedure ReadMin(Reader : TReader);
  45.     procedure WriteMin(Writer : TWriter);
  46.     procedure ReadMax(Reader : TReader);
  47.     procedure WriteMax(Writer : TWriter);
  48.     procedure ReadIntegers(Reader : TReader);
  49.     procedure WriteIntegers(Writer : TWriter);
  50.     procedure QuickSort(L, R : Integer);
  51.   protected
  52.     procedure Error; virtual;
  53.     procedure DefineProperties(Filer : TFiler); override;
  54.     { Property access methods }
  55.     function GetCount : Integer; virtual;
  56.     function Get(Index : Integer) : LongInt; virtual;
  57.     procedure Put(Index : Integer; Value : LongInt); virtual;
  58.   public
  59.     constructor Create;
  60.     destructor Destroy; override;
  61.     function Add(Value : LongInt) : Integer; virtual;
  62.     function AddIntegers(IntegerList : TIntegerList) : Integer; virtual;
  63.     procedure Assign(Source : TPersistent); override;
  64.     procedure Clear; virtual;
  65.     procedure Delete(Index : Integer); virtual;
  66.     function Find(Value : LongInt; var Index : Integer) : Boolean; virtual;
  67.     function Equals(IntegerList : TIntegerList) : Boolean;
  68.     procedure Exchange(Index1, Index2 : Integer); virtual;
  69.     function IndexOf(Value : LongInt) : Integer; virtual;
  70.     procedure Insert(Index : Integer; Value : LongInt); virtual;
  71.     procedure Move(CurIndex, NewIndex : Integer); virtual;
  72.     procedure Sort; virtual;
  73.     property Count : Integer read GetCount;
  74.     property Items[Index : Integer] : LongInt read Get write Put; default;
  75.     property Min : LongInt read FMin write SetMin;
  76.     property Max : LongInt read FMax write SetMax;
  77.     property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  78.     property Sorted: Boolean read FSorted write SetSorted;
  79.     property List : PLongArray read GetList;
  80.   end;
  81.  
  82. { TFloatList }
  83.  
  84.   TFloatList = class(TPersistent)
  85.   private
  86.     { Variables for properties }
  87.     FList : TList;
  88.     FMin : Extended;
  89.     FMax : Extended;
  90.     FDuplicates : TDuplicates;
  91.     FSorted : Boolean;
  92.     { Property access methods }
  93.     procedure SetMin(Value : Extended);
  94.     procedure SetMax(Value : Extended);
  95.     procedure SetSorted(Value : Boolean);
  96.     { Private methods }
  97.     procedure ReadMin(Reader : TReader);
  98.     procedure WriteMin(Writer : TWriter);
  99.     procedure ReadMax(Reader : TReader);
  100.     procedure WriteMax(Writer : TWriter);
  101.     procedure ReadFloats(Reader : TReader);
  102.     procedure WriteFloats(Writer : TWriter);
  103.     procedure QuickSort(L, R : Integer);
  104.   protected
  105.     procedure Error; virtual;
  106.     procedure DefineProperties(Filer : TFiler); override;
  107.     { Property access methods }
  108.     function GetCount : Integer; virtual;
  109.     function Get(Index : Integer) : Extended; virtual;
  110.     procedure Put(Index : Integer; Value : Extended); virtual;
  111.   public
  112.     constructor Create;
  113.     destructor Destroy; override;
  114.     function Add(Value : Extended) : Integer; virtual;
  115.     function AddFloats(FloatList : TFloatList) : Integer; virtual;
  116.     procedure Assign(Source : TPersistent); override;
  117.     procedure Clear; virtual;
  118.     procedure Delete(Index : Integer); virtual;
  119.     function Find(Value : Extended; var Index : Integer) : Boolean; virtual;
  120.     function Equals(FloatList : TFloatList) : Boolean;
  121.     procedure Exchange(Index1, Index2 : Integer); virtual;
  122.     function IndexOf(Value : Extended) : Integer; virtual;
  123.     procedure Insert(Index : Integer; Value : Extended); virtual;
  124.     procedure Move(CurIndex, NewIndex : Integer); virtual;
  125.     procedure Sort; virtual;
  126.     property Count : Integer read GetCount;
  127.     property Items[Index : Integer] : Extended read Get write Put; default;
  128.     property Min : Extended read FMin write SetMin;
  129.     property Max : Extended read FMax write SetMax;
  130.     property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  131.     property Sorted: Boolean read FSorted write SetSorted;
  132.   end;
  133.  
  134. implementation
  135.  
  136. uses ProConst;
  137.  
  138. { Utility routines }
  139.  
  140. procedure IntegerListError(Ident : Integer);
  141. begin
  142.   raise EIntegerListError.CreateRes(Ident);
  143. end; { IntegerListError }
  144.  
  145. procedure FloatListError(Ident : Integer);
  146. begin
  147.   raise EFloatListError.CreateRes(Ident);
  148. end; { FloatListError }
  149.  
  150.  
  151. { TIntegerList }
  152.  
  153. constructor TIntegerList.Create;
  154. { Overrides the constructor to initialize variables }
  155. begin
  156.   inherited Create;
  157.   FList := TList.Create;
  158.   FMin := -MaxLongInt;
  159.   FMax := MaxLongInt;
  160.   FDuplicates := dupAccept;
  161. end; { TIntegerList.Create }
  162.  
  163. destructor TIntegerList.Destroy;
  164. { Overrides the destructor to uninitialize variables }
  165. begin
  166.   Clear;
  167.   FList.Free;
  168.   inherited Destroy;
  169. end; { TIntegerList.Destroy }
  170.  
  171. procedure TIntegerList.Assign(Source : TPersistent);
  172. begin
  173.   if Source is TIntegerList then
  174.   begin
  175.     FMin := TIntegerList(Source).Min;
  176.     FMax := TIntegerList(Source).Max;
  177.     FDuplicates := TIntegerList(Source).Duplicates;
  178.     FSorted := TIntegerList(Source).Sorted;
  179.     Clear;
  180.     AddIntegers(TIntegerList(Source));
  181.   end
  182.   else
  183.     inherited Assign(Source);
  184. end; { TIntegerList.Assign }
  185.  
  186. procedure TIntegerList.Error;
  187. begin
  188.   IntegerListError(SIntegerListIndexError);
  189. end; { TIntegerList.Error }
  190.  
  191. procedure TIntegerList.DefineProperties(Filer : TFiler);
  192. begin
  193.   Filer.DefineProperty('Min', ReadMin, WriteMin, FMin <> -MaxLongInt);
  194.   Filer.DefineProperty('Max', ReadMax, WriteMax, FMax <> MaxLongInt);
  195.   Filer.DefineProperty('Integers', ReadIntegers, WriteIntegers, GetCount > 0);
  196. end; { TIntegerList.DefineProperties }
  197.  
  198. procedure TIntegerList.ReadMin(Reader : TReader);
  199. begin
  200.   FMin := Reader.ReadInteger;
  201. end; { TIntegerList.ReadMin }
  202.  
  203. procedure TIntegerList.WriteMin(Writer : TWriter);
  204. begin
  205.   Writer.WriteInteger(FMin);
  206. end; { TIntegerList.WriteMin }
  207.  
  208. procedure TIntegerList.ReadMax(Reader : TReader);
  209. begin
  210.   FMax := Reader.ReadInteger;
  211. end; { TIntegerList.ReadMax }
  212.  
  213. procedure TIntegerList.WriteMax(Writer : TWriter);
  214. begin
  215.   Writer.WriteInteger(FMax);
  216. end; { TIntegerList.WriteMax }
  217.  
  218. procedure TIntegerList.ReadIntegers(Reader : TReader);
  219. begin
  220.   Reader.ReadListBegin;
  221.   Clear;
  222.   while not Reader.EndOfList do
  223.     Add(Reader.ReadInteger);
  224.   Reader.ReadListEnd;
  225. end; { TIntegerList.ReadIntegers }
  226.  
  227. procedure TIntegerList.WriteIntegers(Writer : TWriter);
  228. var
  229.   I : Integer;
  230. begin
  231.   Writer.WriteListBegin;
  232.   for I := 0 to GetCount - 1 do
  233.     Writer.WriteInteger(Get(I));
  234.   Writer.WriteListEnd;
  235. end; { TIntegerList.WriteIntegers }
  236.  
  237. procedure TIntegerList.SetMin(Value : LongInt);
  238. var
  239.   I : Integer;
  240. begin
  241.   if FMin <> Value then
  242.   begin
  243.     if Value > FMax then IntegerListError(SIntegerMinValueError);
  244.     for I := 0 to GetCount - 1 do
  245.       if Get(I) < Value then IntegerListError(SIntegerMinValueError);
  246.     FMin := Value;
  247.   end;
  248. end; { TIntegerList.SetMin }
  249.  
  250. procedure TIntegerList.SetMax(Value : LongInt);
  251. var
  252.   I : Integer;
  253. begin
  254.   if FMax <> Value then
  255.   begin
  256.     if Value < FMin then IntegerListError(SIntegerMaxValueError);
  257.     for I := 0 to GetCount - 1 do
  258.       if Get(I) > Value then IntegerListError(SIntegerMaxValueError);
  259.     FMax := Value;
  260.   end;
  261. end; { TIntegerList.SetMax }
  262.  
  263. procedure TIntegerList.QuickSort(L, R : Integer);
  264. var
  265.   I, J : Integer;
  266.   P : LongInt;
  267. begin
  268.   I := L;
  269.   J := R;
  270.   P := LongInt(FList[(L + R) shr 1]);
  271.   repeat
  272.     while LongInt(FList[I]) < P do Inc(I);
  273.     while LongInt(FList[J]) > P do Dec(J);
  274.     if I <= J then
  275.     begin
  276.       FList.Exchange(I, J);
  277.       Inc(I);
  278.       Dec(J);
  279.     end;
  280.   until I > J;
  281.   if L < J then QuickSort(L, J);
  282.   if I < R then QuickSort(I, R);
  283. end; { TIntegerList.QuickSort }
  284.  
  285. procedure TIntegerList.SetSorted(Value : Boolean);
  286. begin
  287.   if FSorted <> Value then
  288.   begin
  289.     if Value then Sort;
  290.     FSorted := Value;
  291.   end;
  292. end; { TIntegerList.SetSorted }
  293.  
  294. function TIntegerList.GetList : PLongArray;
  295. begin
  296.   Result := PLongArray(FList.List);
  297. end; { TIntegerList.GetList }
  298.  
  299. function TIntegerList.GetCount : Integer;
  300. begin
  301.   Result := FList.Count;
  302. end; { TIntegerList.GetCount }
  303.  
  304. function TIntegerList.Get(Index : Integer) : LongInt;
  305. begin
  306.   if (Index < 0) or (Index >= GetCount) then Error;
  307.   Result := LongInt(FList[Index]);
  308. end; { TIntegerList.Get }
  309.  
  310. procedure TIntegerList.Put(Index : Integer; Value : LongInt);
  311. begin
  312.   if (Index < 0) or (Index >= GetCount) then Error;
  313.   if (Value < FMin) or (Value > FMax) then IntegerListError(SIntegerListValueError);
  314.   FList[Index] := Pointer(Value);
  315.   if FSorted then Sort;
  316. end; { TIntegerList.Put }
  317.  
  318. function TIntegerList.Add(Value : LongInt) : Integer;
  319. begin
  320.   if FDuplicates = dupAccept then
  321.   begin
  322.     Result := GetCount;
  323.     Insert(Result, Value);
  324.   end
  325.   else if Find(Value, Result) then
  326.     case FDuplicates of
  327.       dupIgnore : Result := GetCount;
  328.       dupError  : IntegerListError(SIntegerDuplicatesError);
  329.     end;
  330. end; { TIntegerList.Add }
  331.  
  332. function TIntegerList.AddIntegers(IntegerList : TIntegerList) : Integer;
  333. begin
  334.   for Result := 0 to IntegerList.Count - 1 do
  335.     Add(IntegerList[Result]);
  336. end; { TIntegerList.AddIntegers }
  337.  
  338. procedure TIntegerList.Clear;
  339. begin
  340.   FList.Clear;
  341. end; { TIntegerList.Clear }
  342.  
  343. procedure TIntegerList.Delete(Index : Integer);
  344. begin
  345.   if (Index < 0) or (Index >= GetCount) then Error;
  346.   FList.Delete(Index);
  347. end; { TIntegerList.Delete }
  348.  
  349. function TIntegerList.Find(Value : LongInt; var Index : Integer) : Boolean;
  350. begin
  351.   Index := 0;
  352.   while (Index < GetCount) and (Get(Index) <> Value) do Inc(Index);
  353.   Result := Index < GetCount;
  354. end; { TIntegerList.Find }
  355.  
  356. function TIntegerList.Equals(IntegerList : TIntegerList) : Boolean;
  357. var
  358.   I : Integer;
  359. begin
  360.   Result := GetCount = IntegerList.Count;
  361.   if Result then
  362.     for I := 0 to GetCount - 1 do
  363.       if Get(I) <> IntegerList[I] then
  364.       begin
  365.         Result := False;
  366.         Break;
  367.       end;
  368. end; { TIntegerList.Equals }
  369.  
  370. procedure TIntegerList.Exchange(Index1, Index2 : Integer);
  371. begin
  372.   if (Index1 < 0) or (Index1 >= GetCount) or
  373.     (Index2 < 0) or (Index2 >= GetCount) then Error;
  374.   FList.Exchange(Index1, Index2);
  375.   FSorted := False;
  376. end; { TIntegerList.Exchange }
  377.  
  378. function TIntegerList.IndexOf(Value : LongInt) : Integer;
  379. begin
  380.   while (Result < GetCount) and (Get(Result) <> Value) do Inc(Result);
  381.   if Result = GetCount then Result := -1;
  382. end; { TIntegerList.IndexOf }
  383.  
  384. procedure TIntegerList.Insert(Index : Integer; Value : LongInt);
  385. begin
  386.   if (Index < 0) or (Index > GetCount) then Error;
  387.   if (Value < FMin) or (Value > FMax) then IntegerListError(SIntegerListValueError);
  388.   FList.Expand.Insert(Index, Pointer(Value));
  389.   FSorted := False;
  390. end; { TIntegerList.Insert }
  391.  
  392. procedure TIntegerList.Move(CurIndex, NewIndex : Integer);
  393. begin
  394.   if (CurIndex < 0) or (CurIndex >= GetCount) or
  395.     (NewIndex < 0) or (NewIndex >= GetCount) then Error;
  396.   FList.Move(CurIndex, NewIndex);
  397.   FSorted := False;
  398. end; { TIntegerList.Move }
  399.  
  400. procedure TIntegerList.Sort;
  401. begin
  402.   if not FSorted and (GetCount > 1) then
  403.     QuickSort(0, GetCount - 1);
  404. end; { TIntegerList.Sort }
  405.  
  406.  
  407. { TFloatList }
  408.  
  409. constructor TFloatList.Create;
  410. { Overrides the constructor to initialize variables }
  411. begin
  412.   inherited Create;
  413.   FList := TList.Create;
  414.   FMin := 3.4e-4932;
  415.   FMax := 1.1e4932;
  416.   FDuplicates := dupAccept;
  417. end; { TFloatList.Create }
  418.  
  419. destructor TFloatList.Destroy;
  420. { Overrides the destructor to uninitialize variables }
  421. begin
  422.   Clear;
  423.   FList.Free;
  424.   inherited Destroy;
  425. end; { TFloatList.Destroy }
  426.  
  427. procedure TFloatList.Assign(Source : TPersistent);
  428. begin
  429.   if Source is TFloatList then
  430.   begin
  431.     FMin := TFloatList(Source).Min;
  432.     FMax := TFloatList(Source).Max;
  433.     FDuplicates := TFloatList(Source).Duplicates;
  434.     FSorted := TFloatList(Source).Sorted;
  435.     Clear;
  436.     AddFloats(TFloatList(Source));
  437.   end
  438.   else
  439.     inherited Assign(Source);
  440. end; { TFloatList.Assign }
  441.  
  442. procedure TFloatList.Error;
  443. begin
  444.   FloatListError(SFloatListIndexError);
  445. end; { TFloatList.Error }
  446.  
  447. procedure TFloatList.DefineProperties(Filer : TFiler);
  448. begin
  449.   Filer.DefineProperty('Min', ReadMin, WriteMin, FMin <> 3.4e-4932);
  450.   Filer.DefineProperty('Max', ReadMax, WriteMax, FMax <> 1.1e4932);
  451.   Filer.DefineProperty('Floats', ReadFloats, WriteFloats, GetCount > 0);
  452. end; { TFloatList.DefineProperties }
  453.  
  454. procedure TFloatList.ReadMin(Reader : TReader);
  455. begin
  456.   FMin := Reader.ReadFloat;
  457. end; { TFloatList.ReadMin }
  458.  
  459. procedure TFloatList.WriteMin(Writer : TWriter);
  460. begin
  461.   Writer.WriteFloat(FMin);
  462. end; { TFloatList.WriteMin }
  463.  
  464. procedure TFloatList.ReadMax(Reader : TReader);
  465. begin
  466.   FMax := Reader.ReadFloat;
  467. end; { TFloatList.ReadMax }
  468.  
  469. procedure TFloatList.WriteMax(Writer : TWriter);
  470. begin
  471.   Writer.WriteFloat(FMax);
  472. end; { TFloatList.WriteMax }
  473.  
  474. procedure TFloatList.ReadFloats(Reader : TReader);
  475. begin
  476.   Reader.ReadListBegin;
  477.   Clear;
  478.   while not Reader.EndOfList do
  479.     Add(Reader.ReadFloat);
  480.   Reader.ReadListEnd;
  481. end; { TFloatList.ReadFloats }
  482.  
  483. procedure TFloatList.WriteFloats(Writer : TWriter);
  484. var
  485.   I : Integer;
  486. begin
  487.   Writer.WriteListBegin;
  488.   for I := 0 to GetCount - 1 do
  489.     Writer.WriteFloat(Get(I));
  490.   Writer.WriteListEnd;
  491. end; { TFloatList.WriteFloats }
  492.  
  493. procedure TFloatList.SetMin(Value : Extended);
  494. var
  495.   I : Integer;
  496. begin
  497.   if FMin <> Value then
  498.   begin
  499.     if Value > FMax then FloatListError(SFloatMinValueError);
  500.     for I := 0 to GetCount - 1 do
  501.       if Get(I) < Value then FloatListError(SFloatMinValueError);
  502.     FMin := Value;
  503.   end;
  504. end; { TFloatList.SetMin }
  505.  
  506. procedure TFloatList.SetMax(Value : Extended);
  507. var
  508.   I : Integer;
  509. begin
  510.   if FMax <> Value then
  511.   begin
  512.     if Value < FMin then FloatListError(SFloatMaxValueError);
  513.     for I := 0 to GetCount - 1 do
  514.       if Get(I) > Value then FloatListError(SFloatMaxValueError);
  515.     FMax := Value;
  516.   end;
  517. end; { TFloatList.SetMax }
  518.  
  519. procedure TFloatList.QuickSort(L, R : Integer);
  520. var
  521.   I, J : Integer;
  522.   P : PExtended;
  523. begin
  524.   I := L;
  525.   J := R;
  526.   P := FList[(L + R) shr 1];
  527.   repeat
  528.     while Extended(FList[I]^) < P^ do Inc(I);
  529.     while Extended(FList[J]^) > P^ do Dec(J);
  530.     if I <= J then
  531.     begin
  532.       FList.Exchange(I, J);
  533.       Inc(I);
  534.       Dec(J);
  535.     end;
  536.   until I > J;
  537.   if L < J then QuickSort(L, J);
  538.   if I < R then QuickSort(I, R);
  539. end; { TFloatList.QuickSort }
  540.  
  541. procedure TFloatList.SetSorted(Value : Boolean);
  542. begin
  543.   if FSorted <> Value then
  544.   begin
  545.     if Value then Sort;
  546.     FSorted := Value;
  547.   end;
  548. end; { TFloatList.SetSorted }
  549.  
  550. function TFloatList.GetCount : Integer;
  551. begin
  552.   Result := FList.Count;
  553. end; { TFloatList.GetCount }
  554.  
  555. function TFloatList.Get(Index : Integer) : Extended;
  556. begin
  557.   if (Index < 0) or (Index >= GetCount) then Error;
  558.   Result := Extended(FList[Index]^);
  559. end; { TFloatList.Get }
  560.  
  561. procedure TFloatList.Put(Index : Integer; Value : Extended);
  562. begin
  563.   if (Index < 0) or (Index >= GetCount) then Error;
  564.   if (Value < FMin) or (Value > FMax) then FloatListError(SFloatListValueError);
  565.   Extended(FList[Index]^) := Value;
  566.   if FSorted then Sort;
  567. end; { TFloatList.Put }
  568.  
  569. function TFloatList.Add(Value : Extended) : Integer;
  570. begin
  571.   if FDuplicates = dupAccept then
  572.   begin
  573.     Result := GetCount;
  574.     Insert(Result, Value);
  575.   end
  576.   else if Find(Value, Result) then
  577.     case FDuplicates of
  578.       dupIgnore : Result := GetCount;
  579.       dupError  : FloatListError(SFloatDuplicatesError);
  580.     end;
  581. end; { TFloatList.Add }
  582.  
  583. function TFloatList.AddFloats(FloatList : TFloatList) : Integer;
  584. begin
  585.   for Result := 0 to FloatList.Count - 1 do
  586.     Add(FloatList[Result]);
  587. end; { TFloatList.AddFloats }
  588.  
  589. procedure TFloatList.Clear;
  590. var
  591.   I : Integer;
  592. begin
  593.   for I := 0 to FList.Count - 1 do
  594.     FreeMem(FList[I], SizeOf(Extended));
  595.   FList.Clear;
  596. end; { TFloatList.Clear }
  597.  
  598. procedure TFloatList.Delete(Index : Integer);
  599. begin
  600.   if (Index < 0) or (Index >= GetCount) then Error;
  601.   Dispose(PExtended(FList[Index]));
  602.   FList.Delete(Index);
  603. end; { TFloatList.Delete }
  604.  
  605. function TFloatList.Find(Value : Extended; var Index : Integer) : Boolean;
  606. begin
  607.   Index := 0;
  608.   while (Index < GetCount) and (Get(Index) <> Value) do Inc(Index);
  609.   Result := Index < GetCount;
  610. end; { TFloatList.Find }
  611.  
  612. function TFloatList.Equals(FloatList : TFloatList) : Boolean;
  613. var
  614.   I : Integer;
  615. begin
  616.   Result := GetCount = FloatList.Count;
  617.   if Result then
  618.     for I := 0 to GetCount - 1 do
  619.       if Get(I) <> FloatList[I] then
  620.       begin
  621.         Result := False;
  622.         Break;
  623.       end;
  624. end; { TFloatList.Equals }
  625.  
  626. procedure TFloatList.Exchange(Index1, Index2 : Integer);
  627. begin
  628.   if (Index1 < 0) or (Index1 >= GetCount) or
  629.     (Index2 < 0) or (Index2 >= GetCount) then Error;
  630.   FList.Exchange(Index1, Index2);
  631.   FSorted := False;
  632. end; { TFloatList.Exchange }
  633.  
  634. function TFloatList.IndexOf(Value : Extended) : Integer;
  635. begin
  636.   while (Result < GetCount) and (Get(Result) <> Value) do Inc(Result);
  637.   if Result = GetCount then Result := -1;
  638. end; { TFloatList.IndexOf }
  639.  
  640. procedure TFloatList.Insert(Index : Integer; Value : Extended);
  641. var
  642.   P : PExtended;
  643. begin
  644.   if (Index < 0) or (Index > GetCount) then Error;
  645.   if (Value < FMin) or (Value > FMax) then FloatListError(SFloatListValueError);
  646.   New(P);
  647.   P^ := Value;
  648.   FList.Expand.Insert(Index, P);
  649.   FSorted := False;
  650. end; { TFloatList.Insert }
  651.  
  652. procedure TFloatList.Move(CurIndex, NewIndex : Integer);
  653. begin
  654.   if (CurIndex < 0) or (CurIndex >= GetCount) or
  655.     (NewIndex < 0) or (NewIndex >= GetCount) then Error;
  656.   FList.Move(CurIndex, NewIndex);
  657.   FSorted := False;
  658. end; { TFloatList.Move }
  659.  
  660. procedure TFloatList.Sort;
  661. begin
  662.   if not FSorted and (GetCount > 1) then
  663.     QuickSort(0, GetCount - 1);
  664. end; { TFloatList.Sort }
  665.  
  666. end.
  667.  
  668.  
  669.  
  670.  
  671. *************************
  672.  
  673. {*******************************************************}
  674. {*                                                     *}
  675. {*      Pro VCL Extensions Library                     *}
  676. {*      Controls and Components Constants Unit         *}
  677. {*                                                     *}
  678. {*      Copyright (c) 1996-98 by Dmitry Barabash       *}
  679. {*                                                     *}
  680. {*******************************************************}
  681.  
  682. unit ProConst;
  683.  
  684. {$I PRO.INC}
  685.  
  686. interface
  687.  
  688. const
  689.  
  690. { ProLists }
  691.  
  692.   SIntegerListIndexError = 30000;
  693.   SIntegerListValueError = 30001;
  694.   SIntegerMinValueError = 30002;
  695.   SIntegerMaxValueError = 30003;
  696.   SIntegerDuplicatesError = 30004;
  697.  
  698.   SFloatListIndexError = 30010;
  699.   SFloatListValueError = 30011;
  700.   SFloatMinValueError = 30012;
  701.   SFloatMaxValueError = 30013;
  702.   SFloatDuplicatesError = 30014;
  703.  
  704. { ProCtrls }
  705.  
  706.   SOKButton = 30100;
  707.   SCancelButton = 30101;
  708.   SHelpButton = 30102;
  709.   SYesButton = 30103;
  710.   SNoButton = 30104;
  711.   SCloseButton = 30105;
  712.   SAbortButton = 30106;
  713.   SRetryButton = 30107;
  714.   SIgnoreButton = 30108;
  715.   SAllButton = 30109;
  716.   SDoneButton = 30110;
  717.   SPrevButton = 30111;
  718.   SNextButton = 30112;
  719.   SFinishButton = 30113;
  720.  
  721.   SCancelButtonRus = 30130;
  722.   SHelpButtonRus = 30131;
  723.   SYesButtonRus = 30132;
  724.   SNoButtonRus = 30133;
  725.   SCloseButtonRus = 30134;
  726.   SAbortButtonRus = 30135;
  727.   SRetryButtonRus = 30136;
  728.   SIgnoreButtonRus = 30137;
  729.   SAllButtonRus = 30138;
  730.   SDoneButtonRus = 30139;
  731.   SPrevButtonRus = 30140;
  732.   SNextButtonRus = 30141;
  733.   SFinishButtonRus = 30142;
  734.  
  735.   SCancelButtonUkr = 30160;
  736.   SHelpButtonUkr = 30161;
  737.   SYesButtonUkr = 30162;
  738.   SNoButtonUkr = 30163;
  739.   SCloseButtonUkr = 30164;
  740.   SAbortButtonUkr = 30165;
  741.   SRetryButtonUkr = 30166;
  742.   SIgnoreButtonUkr = 30167;
  743.   SAllButtonUkr = 30168;
  744.   SDoneButtonUkr = 30169;
  745.   SPrevButtonUkr = 30170;
  746.   SNextButtonUkr = 30171;
  747.   SFinishButtonUkr = 30172;
  748.  
  749. { ProDlgs }
  750.  
  751.   SSelectDirCap = 30200;
  752.   SDirNameCap = 30201;
  753.   SDirsCap = 30202;
  754.   SDrivesCap = 30203;
  755.   SDirConfirmCaption = 30204;
  756.   SDirConfirmCondition = 30205;
  757.   SDirConfirmQuestion = 30206;
  758.   SConfirmCap = 30207;
  759.   SWarningCap = 30208;
  760.   SInfoCap = 30209;
  761.   SstopCap = 30210;
  762.   SPasswordCap = 30211;
  763.   SEnterPasswordCap = 30212;
  764.   SLoginCap = 30213;
  765.   SUserNameCap = 30214;
  766.   SPromptPasswordCap = 30215;
  767.   SImageViewCap = 30216;
  768.  
  769.   SSelectDirCapRus = 30230;
  770.   SDirNameCapRus = 30231;
  771.   SDirsCapRus = 30232;
  772.   SDrivesCapRus = 30233;
  773.   SDirConfirmCaptionRus = 30234;
  774.   SDirConfirmConditionRus = 30235;
  775.   SDirConfirmQuestionRus = 30236;
  776.   SConfirmCapRus = 30237;
  777.   SWarningCapRus = 30238;
  778.   SInfoCapRus = 30239;
  779.   SstopCapRus = 30240;
  780.   SPasswordCapRus = 30241;
  781.   SEnterPasswordCapRus = 30242;
  782.   SLoginCapRus = 30243;
  783.   SUserNameCapRus = 30244;
  784.   SPromptPasswordCapRus = 30245;
  785.   SImageViewCapRus = 30246;
  786.  
  787.   SSelectDirCapUkr = 30260;
  788.   SDirNameCapUkr = 30261;
  789.   SDirsCapUkr = 30262;
  790.   SDrivesCapUkr = 30263;
  791.   SDirConfirmCaptionUkr = 30264;
  792.   SDirConfirmConditionUkr = 30265;
  793.   SDirConfirmQuestionUkr = 30266;
  794.   SConfirmCapUkr = 30267;
  795.   SWarningCapUkr = 30268;
  796.   SInfoCapUkr = 30269;
  797.   SstopCapUkr = 30270;
  798.   SPasswordCapUkr = 30271;
  799.   SEnterPasswordCapUkr = 30272;
  800.   SLoginCapUkr = 30273;
  801.   SUserNameCapUkr = 30274;
  802.   SPromptPasswordCapUkr = 30275;
  803.   SImageViewCapUkr = 30276;
  804.  
  805. { ProCalc }
  806.  
  807.   SCalcCapRus = 30300;
  808.   SCalcErrorRus = 30301;
  809.   SCalcStayOnTopRus = 30302;
  810.   SCalcCloseRus = 30303;
  811.  
  812.   SCalcCapUkr = 30320;
  813.   SCalcErrorUkr = 30321;
  814.   SCalcStayOnTopUkr = 30322;
  815.   SCalcCloseUkr = 30323;
  816.  
  817. implementation
  818.  
  819. {$R PROCONST.RES}
  820.  
  821. end.
  822.  
  823. /*/*/*/*/*/*/**/
  824. //*****************************************************//
  825. //                                                     //
  826. //      Pro VCL Extensions Library                     //
  827. //      ProConst Resource File                         //
  828. //                                                     //
  829. //      Copyright (c) 1996-98 by Dmitry Barabash       //
  830. //                                                     //
  831. //*****************************************************//
  832.  
  833. #include "ProConst.pas"
  834.  
  835. STRINGTABLE
  836. {
  837.  
  838. // ProLists
  839.  
  840.   SIntegerListIndexError, "Integer list index out of bounds"
  841.   SIntegerListValueError, "Integer list value out of ranges"
  842.   SIntegerMinValueError, "Unable to set new minimum integer list value"
  843.   SIntegerMaxValueError, "Unable to set new maximum integer list value"
  844.   SIntegerDuplicatesError, "Integer list does not allow duplicates"
  845.  
  846.   SFloatListIndexError, "Float list index out of bounds"
  847.   SFloatListValueError, "Float list value out of ranges"
  848.   SFloatMinValueError, "Unable to set new minimum integer list value"
  849.   SFloatMaxValueError, "Unable to set new maximum integer list value"
  850.   SFloatDuplicatesError, "Float list does not allow duplicates"
  851.  
  852. // ProCtlrs
  853.  
  854.   SOKButton, "OK"
  855.   SCancelButton, "Cancel"
  856.   SHelpButton, "&Help"
  857.   SYesButton, "&Yes"
  858.   SNoButton, "&No"
  859.   SCloseButton, "&Close"
  860.   SAbortButton, "Abort"
  861.   SRetryButton, "&Retry"
  862.   SIgnoreButton, "&Ignore"
  863.   SAllButton, "&All"
  864.   SDoneButton, "&Done"
  865.   SPrevButton, "< &Back"
  866.   SNextButton, "&Next >"
  867.   SFinishButton, "&Finish"
  868.  
  869.   SCancelButtonRus, "╬≥∞σφα"
  870.   SHelpButtonRus, "&╤∩αΓΩα"
  871.   SYesButtonRus, "&─α"
  872.   SNoButtonRus, "&═σ≥"
  873.   SCloseButtonRus, "&╟αΩ√≥ⁿ"
  874.   SAbortButtonRus, "╤&≥ε∩"
  875.   SRetryButtonRus, "╧&εΓ≥ε"
  876.   SIgnoreButtonRus, "&╧ε∩≤±≥Φ≥ⁿ"
  877.   SAllButtonRus, "&┬±╕"
  878.   SDoneButtonRus, "&├ε≥εΓε"
  879.   SPrevButtonRus, "< &═αταΣ"
  880.   SNextButtonRus, "&─αδσσ >"
  881.   SFinishButtonRus, "&╟αΩεφ≈Φ≥ⁿ"
  882.  
  883.   SCancelButtonUkr, "┬iΣ∞iφα"
  884.   SHelpButtonUkr, "&─εΓiΣΩα"
  885.   SYesButtonUkr, "&╥αΩ"
  886.   SNoButtonUkr, "&═i"
  887.   SCloseButtonUkr, "╟&αΩΦ≥Φ"
  888.   SAbortButtonUkr, "╤≥&ε∩"
  889.   SRetryButtonUkr, "╧εΓ≥ε&"
  890.   SIgnoreButtonUkr, "&╧ε∩≤±≥Φ≥Φ"
  891.   SAllButtonUkr, "&┬±σ"
  892.   SDoneButtonUkr, "&╟εßδσφε"
  893.   SPrevButtonUkr, "< &═αταΣ"
  894.   SNextButtonUkr, "─α&δi >"
  895.   SFinishButtonUkr, "&╟αΩiφ≈Φ≥Φ"
  896.  
  897. // ProDlgs
  898.  
  899.   SSelectDirCap, "Select Directory"
  900.   SDirNameCap, "Directory &Name:"
  901.   SDirsCap, "&Directories:"
  902.   SDrivesCap, "Dri&ves:"
  903.   SDirConfirmCaption, "Confirm"
  904.   SDirConfirmCondition, "This directory does not exist:"
  905.   SDirConfirmQuestion, "Do you wish to create this directory?"
  906.   SConfirmCap, "Confirmation"
  907.   SWarningCap, "Warning"
  908.   SInfoCap, "Information"
  909.   SStopCap, "Stop"
  910.   SPasswordCap, "Password"
  911.   SEnterPasswordCap, "&Enter password:"
  912.   SLoginCap, "Login"
  913.   SUserNameCap, "&User Name:"
  914.   SPromptPasswordCap, "&Password:"
  915.   SImageViewCap, "Image View"
  916.  
  917.   SSelectDirCapRus, "┬√ßε Ωα≥αδεπα"
  918.   SDirNameCapRus, "&╚∞  Ωα≥αδεπα:"
  919.   SDirsCapRus, "&╩α≥αδεπΦ:"
  920.   SDrivesCapRus, "&─Φ±ΩΦ:"
  921.   SDirConfirmCaptionRus, "╧εΣ≥ΓσµΣσφΦσ"
  922.   SDirConfirmConditionRus, "╥αΩεπε Ωα≥αδεπα φσ ±≤∙σ±≥Γ≤σ≥:"
  923.   SDirConfirmQuestionRus, "╤ετΣα≥ⁿ?"
  924.   SConfirmCapRus, "╧εΣ≥ΓσµΣσφΦσ"
  925.   SWarningCapRus, "╧σΣ≤∩σµΣσφΦσ"
  926.   SInfoCapRus, "╚φ⌠ε∞α÷Φ "
  927.   SStopCapRus, "╤≥ε∩"
  928.   SPasswordCapRus, "┬ΓεΣ ∩αεδ "
  929.   SEnterPasswordCapRus, "&┬ΓσΣΦ≥σ ∩αεδⁿ:"
  930.   SLoginCapRus, "┬ΓεΣ ∩αεδ  Σε±≥≤∩α"
  931.   SUserNameCapRus, "&╚∞  ∩εδⁿτεΓα≥σδ :"
  932.   SPromptPasswordCapRus, "&╧αεδⁿ:"
  933.   SImageViewCapRus, "╧ε±∞ε≥ ΦτεßαµσφΦ "
  934.  
  935.   SSelectDirCapUkr, "┬Φßi Ωα≥αδεπ≤"
  936.   SDirNameCapUkr, "&╚∞'  Ωα≥αδεπ≤:"
  937.   SDirsCapUkr, "&╩α≥αδεπΦ:"
  938.   SDrivesCapUkr, "─Φ&±ΩΦ:"
  939.   SDirConfirmCaptionUkr, "╧iΣ≥Γσµσφφ "
  940.   SDirConfirmConditionUkr, "╥αΩεπε Ωα≥αδεπ≤ φσ τφαΘΣσφε:"
  941.   SDirConfirmQuestionUkr, "╤≥ΓεΦ≥Φ?"
  942.   SPasswordCapUkr, "┬ΓiΣ ∩αεδ■"
  943.   SConfirmCapUkr, "╧iΣ≥ΓσΣµσφφ "
  944.   SWarningCapUkr, "╧ε∩σσΣµσφφ "
  945.   SInfoCapUkr, "Iφ⌠ε∞α÷i "
  946.   SstopCapUkr, "╤≥ε∩"
  947.   SEnterPasswordCapUkr, "&┬ΓσΣΦ≥σ ∩αεδⁿ:"
  948.   SLoginCapUkr, "┬ΓiΣ ∩αεδ■ Σε±≥≤∩≤"
  949.   SUserNameCapUkr, "&╚∞'  ΩεΦ±≥≤Γα≈α:"
  950.   SPromptPasswordCapUkr, "&╧αεδⁿ:"
  951.   SImageViewCapUkr, "╧σσπδ Σ εßατ≤"
  952.  
  953. // ProCalc
  954.  
  955.   SCalcCapRus, "╩αδⁿΩ≤δ ≥ε"
  956.   SCalcErrorRus, "╬°ΦßΩα"
  957.   SCalcStayOnTopRus, "&╧εΓσ⌡ Σ≤πΦ⌡ εΩεφ"
  958.   SCalcCloseRus, "&╟αΩ√≥ⁿ"
  959.   SCalcCapUkr, "╩αδⁿΩ≤δ ≥ε"
  960.   SCalcErrorUkr, "╧ε∞ΦδΩα"
  961.   SCalcStayOnTopUkr, "&╧εΓσ⌡ iφ°Φ⌡ ΓiΩεφ"
  962.   SCalcCloseUkr, "╟&αΩΦ≥Φ"
  963. }
  964.  
  965.  
  966.  
  967.  
  968.