home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 January / Chip_1999-01_cd.bin / zkuste / delphi / D1 / SYSINFO.ZIP / SYSINFO.PAS < prev    next >
Pascal/Delphi Source File  |  1996-01-14  |  9KB  |  334 lines

  1. unit SysInfo;
  2.  
  3. {---------------------------------------------------------------------------------}
  4. {                                                                                 }
  5. { TSystemInfo                                                                     }
  6. {                                                                                 }
  7. { A label that shows something about the current system.  The "text" property     }
  8. { gives programs read-only access to the displayed value.                         }
  9. {                                                                                 }
  10. { Freeware.  Use it at your own risk.                                             }
  11. {                                                                                 }
  12. { S Armstrong     13/1/96                                                         }
  13. { 100717.3531@compuserve.com                                                      }
  14. {---------------------------------------------------------------------------------}
  15.  
  16.  
  17. interface
  18.  
  19. uses
  20.   Classes, StdCtrls, Controls, Graphics, Menus, WinTypes, WinProcs, SysUtils;
  21.  
  22. type
  23.   TAttribute = (atCompanyName,
  24.                 atCoProcessor,
  25.                 atCPU,
  26.                 atDiskSize,
  27.                 atDosVersion,
  28.                 atFreeDisk,
  29.                 atFreeGDIResources,
  30.                 atFreeMemory,
  31.                 atFreeSystemResources,
  32.                 atFreeUserResources,
  33.                 atSystemDirectory,
  34.                 atTempDisk,
  35.                 atTempDiskSize,
  36.                 atTempFreeDisk,
  37.                 atUserName,
  38.                 atWindowsDirectory,
  39.                 atWindowsDisk,
  40.                 atWindowsDiskSize,
  41.                 atWindowsFreeDisk,
  42.                 atWindowsMode,
  43.                 atWindowsVersion);
  44.  
  45.   TInvalidDiskException = class(Exception);
  46.  
  47.   TChangeProcedure = procedure( Sender: TObject ) of Object;
  48.  
  49.   TSystemInfo = class(TCustomLabel)
  50.   private
  51.     { Private declarations }
  52.     FAttribute: TAttribute;
  53.     FDisk: char;
  54.  
  55.     FOnChange: TChangeProcedure;
  56.  
  57.     function  FormatBytes(b: LongInt): string;
  58.     function  ReadText: string;
  59.     procedure SetCaption;
  60.     procedure SetAttribute(at: TAttribute);
  61.     procedure SetDisk(d: char);
  62.   protected
  63.     { Protected declarations }
  64.   public
  65.     { Public declarations }
  66.     constructor Create( Owner: TComponent ); override;
  67.     procedure Refresh;
  68.     property Text: string read ReadText;
  69.   published
  70.     { Published declarations }
  71.     property Align;
  72.     property Alignment;
  73.     property Attribute: TAttribute read FAttribute write SetAttribute;
  74.     property AutoSize;
  75.     property Color;
  76.     property Disk: char read FDisk write SetDisk;
  77.     property DragCursor;
  78.     property DragMode;
  79.     property Enabled;
  80.     property FocusControl;
  81.     property Font;
  82.     property ParentColor;
  83.     property ParentFont;
  84.     property ParentShowHint;
  85.     property PopupMenu;
  86.     property ShowAccelChar;
  87.     property ShowHint;
  88.     property Transparent;
  89.     property Visible;
  90.     property WordWrap;
  91.  
  92.     property OnChange: TChangeProcedure read FOnChange write FOnChange;
  93.     property OnClick;
  94.     property OnDblClick;
  95.     property OnDragDrop;
  96.     property OnDragOver;
  97.     property OnEndDrag;
  98.     property OnMouseDown;
  99.     property OnMouseMove;
  100.     property OnMouseUp;
  101.   end;
  102.  
  103. procedure Register;
  104.  
  105. implementation
  106.  
  107. uses
  108.   CpuTyp;
  109.  
  110. procedure Register;
  111. begin
  112.   RegisterComponents('Extra', [TSystemInfo]);
  113. end;
  114.  
  115. constructor TSystemInfo.Create(Owner: TComponent);
  116. begin
  117.   inherited Create(Owner);
  118.   FDisk := 'C';
  119.   SetCaption;
  120. end;
  121.  
  122. function TSystemInfo.ReadText: string;
  123. begin
  124.    result := caption;
  125. end;
  126.  
  127. procedure TSystemInfo.SetDisk(d: char);
  128. begin
  129.   d := UpCase(d);
  130.   if not (d in ['A'..'Z']) then { disallow all but drive letters}
  131.     { ignore that the specified disk may not exist on this machine }
  132.     raise TInvalidDiskException.Create(d + ' is not a valid disk letter')
  133.   else if FDisk <> d then begin
  134.     FDisk := d;
  135.     if (FAttribute = atDiskSize) or
  136.        (FAttribute = atFreeDisk) then
  137.        SetCaption;
  138.   end;
  139. end;
  140.  
  141. procedure TSystemInfo.SetAttribute(at: TAttribute);
  142. begin
  143.   if FAttribute <> at then begin
  144.     FAttribute := at;
  145.     SetCaption;
  146.   end;
  147. end;
  148.  
  149. function TSystemInfo.FormatBytes(b: LongInt): string;
  150. var
  151.    l,r: integer;
  152. begin
  153.    if b = -1 then
  154.       result := ''
  155.    else if b > 1048576 then begin
  156.       l := b div 1048576;
  157.       r := (b mod 1048576) div 1024;
  158.       while (r > 0) and (r mod 10 = 0) do
  159.          r := r div 10;
  160.       result := format('%d.%d MB',[l,r]);
  161.    end else  if b > 1000 then begin
  162.       l := b div 1024;
  163.       r := b mod 1024;
  164.       while (r > 0) and (r mod 10 = 0) do
  165.          r := r div 10;
  166.       result := format('%d.%d KB',[l,r]);
  167.    end else
  168.       result := IntToStr(b) + ' B';
  169. end;
  170.  
  171. procedure TSystemInfo.Refresh;
  172. var
  173.    old: string;
  174. begin
  175.    old := caption;
  176.    SetCaption;
  177.    if (Assigned(FOnChange)) and (caption <> old) then
  178.       FOnChange(Self);
  179. end;
  180.  
  181. procedure TSystemInfo.SetCaption;
  182. var
  183.    Version: Word;
  184.    winFlags: LongInt;
  185.    fileHandle: THandle;
  186.    buffer: array [0..143] of Char;
  187.    d: string[1];
  188. begin
  189.   case FAttribute of
  190.  
  191.   atCompanyName:
  192.      begin
  193.         fileHandle := LoadLibrary('USER');
  194.         if fileHandle >= HINSTANCE_ERROR then begin
  195.            If LoadString(fileHandle, 515, @Buffer, sizeof(buffer)) <> 0 Then
  196.               Caption := buffer;
  197.            FreeLibrary(fileHandle);
  198.         end;
  199.      end;
  200.  
  201.   atCoProcessor:
  202.      begin
  203.         winFlags := GetWinFlags;
  204.         If winFlags And WF_80x87 > 0 Then
  205.            Caption := 'Present'
  206.         else
  207.            Caption := 'Absent';
  208.      end;
  209.  
  210.   atCPU:
  211.      begin
  212. {        winFlags := GetWinFlags;
  213.         if winFlags And WF_CPU486 > 0 Then
  214.            Caption := '486'
  215.         else if winFlags And WF_CPU386 > 0 Then
  216.            Caption := '386'
  217.         else if winFlags And WF_CPU286 > 0 Then
  218.            Caption := '286'; }
  219.         Caption := CpuTypeString;
  220.      end;
  221.  
  222.   atDiskSize:
  223.      caption := FormatBytes(DiskSize(ord(FDisk) - ord('A') + 1));
  224.  
  225.   atDosVersion:
  226.      begin
  227.         Version := HiWord(GetVersion);
  228.         if HI(version) >= 10 then begin
  229.            if (HI(version) = 20) and (LO(version) = 30) then
  230.               Caption := 'OS/2 Warp v3' { v2.30 }
  231.            else
  232.               Caption := 'OS/2 ' + IntToStr(HI(version) DIV 10) + IntToStr(LO(version));
  233.         end else
  234.            Caption := IntToStr(HI(Version)) + '.' + IntToStr(LO(Version));
  235.      end;
  236.  
  237.   atFreeDisk:
  238.      caption := FormatBytes(DiskFree(ord(FDisk) - ord('A') + 1));
  239.  
  240.   atFreeMemory:
  241.     caption := FormatBytes(GetFreeSpace(0));
  242.  
  243.   atFreeGDIResources:
  244.     Caption := IntToStr(GetFreeSystemResources(GFSR_GDIRESOURCES)) + '%';
  245.  
  246.   atFreeSystemResources:
  247.     Caption := IntToStr(GetFreeSystemResources(GFSR_SYSTEMRESOURCES)) + '%';
  248.  
  249.   atFreeUserResources:
  250.     Caption := IntToStr(GetFreeSystemResources(GFSR_USERRESOURCES)) + '%';
  251.  
  252.   atSystemDirectory:
  253.     if GetSystemDirectory(buffer, sizeof(buffer)) > 0 then
  254.        caption := StrPas(buffer)
  255.     else
  256.        caption := '';
  257.  
  258.   atTempDisk:
  259.      begin
  260.         buffer[0] := GetTempDrive(' ');
  261.         buffer[1] := ':';
  262.         buffer[2] := chr(0);
  263.         caption := StrPas(buffer);
  264.      end;
  265.  
  266.   atTempDiskSize:
  267.      caption := FormatBytes(DiskSize(ord(GetTempDrive(' ')) - ord('A') + 1));
  268.  
  269.   atTempFreeDisk:
  270.      caption := FormatBytes(DiskFree(ord(GetTempDrive(' ')) - ord('A') + 1));
  271.  
  272.   atUserName:
  273.      begin
  274.         fileHandle := LoadLibrary('USER');
  275.         if fileHandle >= HINSTANCE_ERROR then begin
  276.            If LoadString(fileHandle, 514, @buffer, sizeof(buffer)) <> 0 Then
  277.               Caption := buffer;
  278.            FreeLibrary(fileHandle);
  279.         end;
  280.      end;
  281.  
  282.   atWindowsDirectory:
  283.     if GetWindowsDirectory(buffer, sizeof(buffer)) > 0 then
  284.        caption := StrPas(buffer)
  285.     else
  286.        caption := '';
  287.  
  288.   atWindowsDisk:
  289.      begin
  290.         GetWindowsDirectory(buffer, sizeof(buffer));
  291.         caption := Copy(UpperCase(StrPas(buffer)),1,2);
  292.      end;
  293.  
  294.   atWindowsDiskSize:
  295.      begin
  296.         GetWindowsDirectory(buffer, sizeof(buffer));
  297.         d := UpperCase(StrPas(buffer));
  298.         caption := FormatBytes(DiskSize(ord(d[1]) - ord('A') + 1));
  299.      end;
  300.  
  301.   atWindowsFreeDisk:
  302.      begin
  303.         GetWindowsDirectory(buffer, sizeof(buffer));
  304.         d := UpperCase(StrPas(buffer));
  305.         caption := FormatBytes(DiskFree(ord(d[1]) - ord('A') + 1));
  306.      end;
  307.  
  308.   atWindowsMode:
  309.      begin
  310.         winFlags := GetWinFlags;
  311.         if winFlags And WF_ENHANCED > 0 Then
  312.            Caption := '386 Enhanced'
  313.         else if winFlags And WF_STANDARD > 0 Then
  314.            Caption := 'Standard'
  315.         else if winFlags And WF_PMODE > 0 Then
  316.            Caption := 'Protected'
  317.         else
  318.            Caption := 'Non-Protected';
  319.      end;
  320.  
  321.   atWindowsVersion:
  322.      begin
  323.         Version := LoWord(GetVersion);
  324.         Caption := IntToStr(LO(Version)) + '.' + IntToStr(HI(Version));
  325.      end;
  326.  
  327.   else
  328.       caption := '';
  329.   end;
  330. end;
  331.  
  332.  
  333. end.
  334.