NMExtstr.pas
上传用户:szzdds
上传日期:2013-09-18
资源大小:293k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit NMExtstr;
  2. {$X+}
  3. {$R-}
  4. {$IFDEF VER100}
  5. {$DEFINE NMF3}
  6. {$ENDIF}
  7. {$IFDEF VER110}
  8. {$DEFINE NMF3}
  9. {$ENDIF}
  10. {$IFDEF VER120}
  11. {$DEFINE NMF3}
  12. {$ENDIF}
  13. {$IFDEF VER125}
  14. {$DEFINE NMF3}
  15. {$ENDIF}
  16. interface
  17. uses  Classes, Sysutils;
  18. {$IFDEF VER110}
  19. {$ObjExportAll On}
  20. {$ENDIF}
  21. {$IFDEF VER120}
  22. {$ObjExportAll On}
  23. {$ENDIF}
  24. {$IFDEF VER125}
  25. {$ObjExportAll On}
  26. {$ENDIF}
  27. //  CompName='NMExtStr';
  28. //  Major_Version='4';
  29. //  Minor_Version='02';
  30. //  Date_Version='012798';
  31. type
  32.     TExStringList = class ( tstringlist )
  33.     protected
  34.       function IndexOfName(const Name: string): Integer;
  35.       function GetValue(const Name: string): string;
  36.       procedure SetValue(const Name, Value: string);
  37.     public
  38.       property Values[const Name: string]: string read GetValue write SetValue; 
  39. end;
  40. implementation
  41. uses Consts, TypInfo;
  42. function TExStringList.GetValue(const Name: string): string;
  43. var
  44.   I: Integer;
  45. begin
  46.   I := IndexOfName(Name);
  47.   if I >= 0 then
  48.     begin
  49.       Result := Copy(Get(I), Length(Name) + 2, MaxInt);
  50.       if Result[1]=' ' then Result:= Copy(Result, 2, MaxInt)
  51.     end
  52.     else
  53.     Result := '';
  54. end;
  55. function TExStringList.IndexOfName(const Name: string): Integer;
  56. var
  57.   P: Integer;
  58.   S: string;
  59.   top, bottom : integer;
  60.   test : integer;
  61.   done : boolean;
  62. begin
  63.   if sorted then
  64.     begin
  65.       done := false;
  66.       top := 0;
  67.       bottom := getcount -1;
  68.       repeat
  69.         result := ((bottom - top) div 2 ) + top;
  70.         S := Get(Result);
  71.         P := Pos(':', S);
  72.         test := AnsiCompareText(Copy(S, 1, P-1), Name);
  73.         if test = 0 then
  74.           done := true
  75.         else if test < 0 then
  76.                top := result +1
  77.              else
  78.                bottom := result - 1;
  79.         if top  = bottom + 1 then
  80.           begin
  81.             result := -1;
  82.             exit;
  83.           end;                                                             
  84.       until done;
  85.     end
  86.   else
  87.     begin
  88.       for Result := 0 to GetCount - 1 do
  89.         begin
  90.           S := Get(Result);
  91.           P := Pos(':', S);
  92.           if (P <> 0) and (AnsiCompareText(Copy(S, 1, P - 1), Name) = 0) then Exit;
  93.         end;
  94.       Result := -1;
  95.     end;
  96. end;
  97. procedure TExStringList.SetValue(const Name, Value: string);
  98. var
  99.   I: Integer;
  100. begin
  101.   I := IndexOfName(Name);
  102.   if Value <> '' then
  103.   begin
  104.     if I < 0 then I := Add('');
  105.     Put(I, Name + ': ' + Value);
  106.   end else
  107.   begin
  108.     if I >= 0 then Delete(I);
  109.   end;
  110. end;
  111. end.