home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / Chip_2003-01_cd1.bin / zkuste / delphi / kompon / d56 / VKDBF.ZIP / VKDBFMemMgr.pas < prev    next >
Pascal/Delphi Source File  |  2002-05-30  |  6KB  |  269 lines

  1. unit VKDBFMemMgr;
  2.  
  3. interface
  4.  
  5. uses
  6.   contnrs, Dialogs, sysutils;
  7.  
  8. type
  9.  
  10.   {TVKDBFOneAlloc}
  11.   TVKDBFOneAlloc = class
  12.   private
  13.  
  14.     FMemory: Pointer;
  15.     FCaller: TObject;
  16.     FCaption: String;
  17.     FSize: Cardinal;
  18.  
  19.   public
  20.  
  21.     constructor Create; overload;
  22.     constructor Create(Caller: TObject; Caption: String; Size: Cardinal); overload;
  23.     constructor Create(Caller: TObject; Size: Cardinal); overload;
  24.     destructor Destroy; override;
  25.  
  26.     procedure GetMem(Size: Cardinal);
  27.     procedure ReallocMem(NewSize: Cardinal);
  28.     procedure FreeMem;
  29.  
  30.     property Memory: Pointer read FMemory;
  31.     property Caller: TObject read FCaller write FCaller;
  32.     property Caption: String read FCaption write FCaption;
  33.     property Size: Cardinal read FSize;
  34.  
  35.   end;
  36.  
  37.   {TVKDBFMemMgr}
  38.   TVKDBFMemMgr = class(TObjectList)
  39.   private
  40.   public
  41.     constructor Create;
  42.     destructor Destroy; override;
  43.  
  44.     function FindIndex(p: Pointer; out Ind: Integer): boolean;
  45.     function FindCaption(Capt: String; out Ind: Integer): boolean;
  46.  
  47.     procedure FreeForCaption(Capt: String);
  48.  
  49.     function GetMem(Caller: TObject; size: Integer): Pointer; overload;
  50.     function ReallocMem(p: Pointer; size: Integer): Pointer; overload;
  51.     procedure FreeMem(p: Pointer); overload;
  52.  
  53.     function GetMem(Capt: String; size: Integer): Pointer; overload;
  54.  
  55.     function GetSize(p: Pointer): Integer;
  56.  
  57.   end;
  58.  
  59. var
  60.   oMem: TVKDBFMemMgr;
  61.  
  62. implementation
  63.  
  64. { TVKDBFMemMgr }
  65.  
  66. constructor TVKDBFMemMgr.Create;
  67. begin
  68.   inherited Create;
  69. end;
  70.  
  71. destructor TVKDBFMemMgr.Destroy;
  72. begin
  73.   inherited Destroy;
  74. end;
  75.  
  76. function TVKDBFMemMgr.FindCaption(Capt: String; out Ind: Integer): boolean;
  77. var
  78.   i: Integer;
  79. begin
  80.   Result := false;
  81.   Ind := -1;
  82.   for i := 0 to Count - 1 do
  83.     if TVKDBFOneAlloc(Items[i]).Caption = Capt then begin
  84.       Result := true;
  85.       Ind := i;
  86.       Exit;
  87.     end;
  88. end;
  89.  
  90. function TVKDBFMemMgr.FindIndex(p: Pointer; out Ind: Integer): boolean;
  91. var
  92.   B: TVKDBFOneAlloc;
  93.   beg, Mid: Integer;
  94. begin
  95.   Ind := Count;
  96.   if ( Ind > 0 ) then begin
  97.     beg := 0;
  98.     B := TVKDBFOneAlloc(Items[beg]);
  99.     if ( Integer(p) > Integer(B.FMemory) ) then begin
  100.       repeat
  101.         Mid := (Ind + beg) div 2;
  102.         B := TVKDBFOneAlloc(Items[Mid]);
  103.         if ( Integer(p) > Integer(B.FMemory) ) then
  104.            beg := Mid
  105.         else
  106.            Ind := Mid;
  107.       until ( ((Ind - beg) div 2) = 0 );
  108.     end else
  109.       Ind := beg;
  110.     if Ind < Count then begin
  111.       B := TVKDBFOneAlloc(Items[Ind]);
  112.       Result := (Integer(p) = Integer(B.FMemory));
  113.     end else
  114.       Result := false;
  115.   end else
  116.     Result := false;
  117. end;
  118.  
  119. procedure TVKDBFMemMgr.FreeForCaption(Capt: String);
  120. var
  121.   i: Integer;
  122. begin
  123.   while FindCaption(Capt, i) do Delete(i);
  124. end;
  125.  
  126. procedure TVKDBFMemMgr.FreeMem(p: Pointer);
  127. var
  128.   i: Integer;
  129. begin
  130.   if (p <> nil) and FindIndex(p, i) then Delete(i);
  131. end;
  132.  
  133. function TVKDBFMemMgr.GetMem(Caller: TObject; size: Integer): Pointer;
  134. var
  135.   Obj: TVKDBFOneAlloc;
  136.   i: Integer;
  137. begin
  138.   Obj := TVKDBFOneAlloc.Create(Caller, size);
  139.   FindIndex(Obj.FMemory, i);
  140.   Insert(i, Obj);
  141.   Result := Obj.FMemory;
  142. end;
  143.  
  144. function TVKDBFMemMgr.GetMem(Capt: String; size: Integer): Pointer;
  145. var
  146.   Obj: TVKDBFOneAlloc;
  147.   i: Integer;
  148. begin
  149.   Obj := TVKDBFOneAlloc.Create(nil, Capt, size);
  150.   FindIndex(Obj.FMemory, i);
  151.   Insert(i, Obj);
  152.   Result := Obj.FMemory;
  153. end;
  154.  
  155. function TVKDBFMemMgr.GetSize(p: Pointer): Integer;
  156. var
  157.   Obj: TVKDBFOneAlloc;
  158.   i: Integer;
  159. begin
  160.   if p <> nil then begin
  161.     if FindIndex(p, i) then begin
  162.       Obj := TVKDBFOneAlloc(Items[i]);
  163.       Result := Obj.FSize;
  164.     end else
  165.       Result := 0;
  166.   end else
  167.     Result := 0;
  168. end;
  169.  
  170. function TVKDBFMemMgr.ReallocMem(p: Pointer; size: Integer): Pointer;
  171. var
  172.   Obj: TVKDBFOneAlloc;
  173.   i: Integer;
  174.   Old: Pointer;
  175. begin
  176.   if p <> nil then begin
  177.     if FindIndex(p, i) then begin
  178.       Obj := TVKDBFOneAlloc(Items[i]);
  179.       Old := Obj.FMemory;
  180.       Obj.ReallocMem(size);
  181.       Result := Obj.FMemory;
  182.       if Integer(Old) <> Integer(Obj.FMemory) then begin
  183.         OwnsObjects := false;
  184.         try
  185.           Delete(i);
  186.           FindIndex(Obj.FMemory, i);
  187.           Insert(i, Obj);
  188.         finally
  189.           OwnsObjects := true;
  190.         end;
  191.       end;
  192.     end else
  193.       Result := nil;
  194.   end else
  195.     Result := self.GetMem(self, size);
  196. end;
  197.  
  198. { TVKDBFOneAlloc }
  199.  
  200. constructor TVKDBFOneAlloc.Create;
  201. begin
  202.   FMemory := nil;
  203.   FCaller := nil;
  204.   FSize := 0;
  205.   FCaption := '';
  206. end;
  207.  
  208. constructor TVKDBFOneAlloc.Create(Caller: TObject; Caption: String; Size: Cardinal);
  209. begin
  210.   Create;
  211.   self.GetMem(Size);
  212.   FCaller := Caller;
  213.   FCaption := Caption;
  214. end;
  215.  
  216. constructor TVKDBFOneAlloc.Create(Caller: TObject; Size: Cardinal);
  217. begin
  218.   if Size > 0 then begin
  219.   Create;
  220.   self.GetMem(Size);
  221.   FCaller := Caller;
  222.   if FCaller <> nil then
  223.     FCaption := FCaller.ClassName;
  224.   end else
  225.     raise Exception.Create('TVKDBFOneAlloc: Can not allocate 0 bytes memory!');
  226. end;
  227.  
  228. destructor TVKDBFOneAlloc.Destroy;
  229. begin
  230.   self.FreeMem;
  231.   inherited Destroy;
  232. end;
  233.  
  234. procedure TVKDBFOneAlloc.FreeMem;
  235. begin
  236.   if FMemory <> nil then begin
  237.     System.FreeMem(FMemory);
  238.     FMemory := nil;
  239.     FSize := 0;
  240.   end;
  241. end;
  242.  
  243. procedure TVKDBFOneAlloc.GetMem(Size: Cardinal);
  244. begin
  245.   if FMemory = nil then begin
  246.     System.GetMem(FMemory, Size);
  247.     FSize := Size;
  248.   end else begin
  249.     System.ReallocMem(FMemory, Size);
  250.     FSize := Size;
  251.   end;
  252. end;
  253.  
  254. procedure TVKDBFOneAlloc.ReallocMem(NewSize: Cardinal);
  255. begin
  256.   System.ReallocMem(FMemory, NewSize);
  257.   FSize := NewSize;
  258. end;
  259.  
  260. initialization
  261.  
  262.     oMem := TVKDBFMemMgr.Create;
  263.  
  264. finalization
  265.  
  266.     oMem.Free;
  267.  
  268. end.
  269.