Advertisement
Guest User

код

a guest
Sep 18th, 2014
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.52 KB | None | 0 0
  1. unit uMembers;
  2.  
  3. interface
  4.  
  5. uses
  6.   //============================== Модули проекта ==============================
  7.   uXmlUtils,
  8.   //=============================== Левые модули ===============================
  9.   ECXMLParser, FileWorks,
  10.   //=================== Системные модули и модули компонентов ==================
  11.   Windows, SysUtils, Classes, Contnrs, Forms;
  12.  
  13. type
  14.   // Класс - участник соревнования
  15.   TMember = class
  16.   private
  17.     // Поля
  18.     FName: string;    // Имя
  19.     FGender: Boolean; // Пол (True = Ж, False = М)
  20.     FRating: Cardinal; // Рейтинг
  21.     FPlace: Cardinal; // Место в турнирной таблице
  22.     FLastVisit: TDateTime; // Время последного захода
  23.     FModified: Boolean; // Флаг изменённости
  24.  
  25.     // Поля событий
  26.     //FOnChange: TNotifyEvent; // Событие изменения
  27.  
  28.     // Функции доступа к полям/свойствам
  29.     procedure SetName(const ANew: string);
  30.     procedure SetGender(const ANew: Boolean);
  31.     procedure SetRating(const ANew: Cardinal);
  32.     procedure SetLastVisit(const ANew: TDateTime);
  33.  
  34.     // Технологические функции
  35.  
  36.   public
  37.     // Конструктор и деструктор
  38.     constructor Create;
  39.  
  40.     // Методы
  41.     procedure SaveToXML(ANode: TXMLItem);
  42.     procedure LoadFromXML(ANode: TXMLItem);
  43.     procedure IncRating;
  44.     procedure DecRating;
  45.  
  46.     // Свойства
  47.     property Name: string read FName write SetName;
  48.     property Gender: Boolean read FGender write SetGender;
  49.     property Rating: Cardinal read FRating write SetRating;
  50.     property Place: Cardinal read FPlace write FPlace;
  51.     property LastVisit: TDateTime read FLastVisit write SetLastVisit;
  52.     property Modified: Boolean read FModified write FModified;
  53.  
  54.     // События
  55.     //property OnChange: TNotifyEvent read FOnChange write FOnChange;
  56.   end;
  57.  
  58.   // Тип сортировки
  59.   TMembersSortType = (mstByName, mstByRating, mstByLastVisit, mstByPlace);
  60.  
  61.  
  62.   // Класс - список участников
  63.   TMemberList = class
  64.   private
  65.     // Поля
  66.     FMembers: TObjectList;
  67.     FModified: Boolean;
  68.     FStartTime: TDateTime; // Дата/время начала ведения статистики
  69.     FLastSaveTime: TDateTime; // Дата последнего сохранения файла
  70.     FSortedBy: TMembersSortType;
  71.  
  72.     // Функции доступа к полям/свойствам
  73.     function GetCount: Integer;
  74.     function GetMember(const Index: Integer): TMember;
  75.     function GetModified: Boolean;
  76.  
  77.     // Технологические функции
  78.   public
  79.     // Конструктор и деструктор
  80.     constructor Create;
  81.     destructor Destroy; override;
  82.  
  83.     // Методы
  84.     function NewMember: TMember;
  85.     procedure AddMember(AMember: TMember);
  86.     procedure DeleteMember(AMember: TMember);
  87.     function LoadFromFile(const FileName: string): Boolean;
  88.     function SaveToFile(const FileName: string): Boolean;
  89.     procedure CalcPlaces;
  90.     procedure Sort(const SortType: TMembersSortType);
  91.  
  92.     // Свойства
  93.     property Count: Integer read GetCount;
  94.     property Members[const Index: Integer]: TMember read GetMember; default;
  95.     property Modified: Boolean read GetModified write FModified;
  96.     property StartTime: TDateTime read FStartTime;
  97.     property LastSaveTime: TDateTime read FLastSaveTime write FLastSaveTime;
  98.     property SortedBy: TMembersSortType read FSortedBy;
  99.  
  100.     // События
  101.   end;
  102.  
  103. function GetFileLastSaveTime(const FileName: string; var T: TDateTime): Boolean;
  104. function CompareByName(Item1, Item2: Pointer): Integer;
  105. function CompareByRating(Item1, Item2: Pointer): Integer;
  106. function CompareByLastVisit(Item1, Item2: Pointer): Integer;
  107. function CompareByPlace(Item1, Item2: Pointer): Integer;
  108.  
  109. var
  110.   SortDirection: Integer = -1; // Для процедур сравнения
  111.  
  112. implementation
  113.  
  114. uses Math, DateUtils;
  115.  
  116. { TMember }
  117.  
  118. constructor TMember.Create;
  119. begin
  120.   // Инициализация
  121.   FName:= 'Новый кандидат';
  122.   FGender:= False;
  123.   FRating:= 0;
  124.   FLastVisit:= Now();
  125.   FModified:= False;
  126. end;
  127.  
  128. procedure TMember.DecRating;
  129. begin
  130.   if FRating > 0
  131.     then begin
  132.            Dec(FRating);
  133.            FModified:= True;
  134.          end;
  135. end;
  136.  
  137. procedure TMember.IncRating;
  138. begin
  139.   Inc(FRating);
  140.   FLastVisit:= Now();
  141.   FModified:= True;
  142. end;
  143.  
  144. procedure TMember.LoadFromXML(ANode: TXMLItem);
  145. begin
  146.   FName:=      XmlGetStringParam(ANode,   'Name',      FName);
  147.   FGender:=    XmlGetBoolParam(ANode,     'Gender',    FGender);
  148.   FRating:=    XmlGetIntegerParam(ANode,  'Rating',    FRating);
  149.   FLastVisit:= XmlGetDateTimeParam(ANode, 'LastVisit', FLastVisit);
  150.   FModified:=  False;
  151. end;
  152.  
  153. procedure TMember.SaveToXML(ANode: TXMLItem);
  154. begin
  155.   XmlAddStringParam(ANode,   'Name',      FName);
  156.   XmlAddBoolParam(ANode,     'Gender',    FGender);
  157.   XmlAddIntegerParam(ANode,  'Rating',    FRating);
  158.   XmlAddDateTimeParam(ANode, 'LastVisit', FLastVisit);
  159.   FModified:=  False;
  160. end;
  161.  
  162. procedure TMember.SetGender(const ANew: Boolean);
  163. begin
  164.   if FGender <> ANew
  165.     then begin
  166.            FGender:= ANew;
  167.            FModified:= True;
  168.          end;
  169. end;
  170.  
  171. procedure TMember.SetLastVisit(const ANew: TDateTime);
  172. begin
  173.   if FLastVisit <> ANew
  174.     then begin
  175.            FLastVisit:= ANew;
  176.            FModified:= True;
  177.          end;
  178. end;
  179.  
  180. procedure TMember.SetName(const ANew: string);
  181. begin
  182.   if FName <> ANew
  183.     then begin
  184.            FName:= ANew;
  185.            FModified:= True;
  186.          end;
  187. end;
  188.  
  189. procedure TMember.SetRating(const ANew: Cardinal);
  190. begin
  191.   if FRating <> ANew
  192.     then begin
  193.            FRating:= ANew;
  194.            FModified:= True;
  195.          end;
  196. end;
  197.  
  198. { TMemberList }
  199.  
  200. constructor TMemberList.Create;
  201. begin
  202.   FMembers:= TObjectList.Create(True);
  203. end;
  204.  
  205. destructor TMemberList.Destroy;
  206. begin
  207.   FMembers.Free();
  208.   inherited;
  209. end;
  210.  
  211. function TMemberList.GetCount: Integer;
  212. begin
  213.   Result:= FMembers.Count;
  214. end;
  215.  
  216. function TMemberList.GetMember(const Index: Integer): TMember;
  217. begin
  218.   if (Index > -1) and (Index < Self.Count)
  219.     then Result:= TMember(FMembers[Index])
  220.     else Result:= nil;
  221. end;
  222.  
  223. function TMemberList.GetModified: Boolean;
  224. var
  225.   Index: Integer;
  226. begin
  227.   Result:= FModified;
  228.  
  229.   if not Result
  230.     then for Index:= 0 to FMembers.Count - 1 do
  231.            if TMember(FMembers[Index]).Modified
  232.              then begin
  233.                     Result:= True;
  234.                     Exit;
  235.                   end;
  236. end;
  237.  
  238. function TMemberList.LoadFromFile(const FileName: string): Boolean;
  239. var
  240.   Parser: TECXMLParser;
  241.   Index: Integer;
  242.   Member: TMember;
  243. begin
  244.   Result:= False;
  245.   Parser:= TECXMLParser.Create(nil);
  246.   try
  247.     // Попытка загрузки
  248.     try
  249.       Parser.LoadFromFile(FileName);
  250.       Result:= GetFileLastSaveTime(FileName, FLastSaveTime);
  251.     except on E: Exception do
  252.              begin
  253.                Application.MessageBox(PChar('Не могу прочитать "' + FileName + '".'#13#10 + E.Message),
  254.                                       PChar('Ошибка'),
  255.                                       MB_OK + MB_ICONERROR);
  256.              end;
  257.     end;
  258.  
  259.     if Result
  260.       then begin
  261.              Self.FStartTime:= XmlGetDateTimeParam(Parser.Root, 'StartTime', Now());
  262.              FMembers.Clear();
  263.  
  264.              for Index:= 0 to Parser.Root.Count - 1 do
  265.                begin
  266.                  Member:= NewMember();
  267.                  Member.LoadFromXML(Parser.Root[Index]);
  268.                end;
  269.  
  270.              // Сортировка по имени
  271.              SortDirection:= -1;
  272.              Sort(mstByName);
  273.              FModified:= False;
  274.            end;
  275.   finally
  276.     Parser.Free();
  277.   end;
  278. end;
  279.  
  280. function TMemberList.SaveToFile(const FileName: string): Boolean;
  281. var
  282.   Parser: TECXMLParser;
  283.   Index: Integer;
  284.   Item: TXMLItem;
  285. begin
  286.   Result:= False;
  287.   Parser:= TECXMLParser.Create(nil);
  288.   try
  289.     Parser.Root.Name:= 'ChampionshipBase';
  290.     XmlAddIntegerParam(Parser.Root, 'Count', Self.Count);
  291.     XmlAddDateTimeParam(Parser.Root, 'StartTime', FStartTime);
  292.  
  293.     for Index:= 0 to Self.Count - 1 do
  294.       begin
  295.         Item:= Parser.Root.New();
  296.         Item.Name:= 'Member' + IntToStr(Index);
  297.         Self.Members[Index].SaveToXML(Item);
  298.       end;
  299.  
  300.     // Попытка сохранения.
  301.     try
  302.       Parser.SaveToFile(FileName);
  303.       FModified:= False;
  304.       Result:= GetFileLastSaveTime(FileName, FLastSaveTime);
  305.     except on E: Exception do
  306.       Application.MessageBox(PChar('Не могу сохранить "' + FileName + '".'#13#10 + E.Message),
  307.                              PChar('Ошибка'),
  308.                              MB_OK + MB_ICONERROR);
  309.     end;
  310.   finally
  311.     Parser.Free();
  312.   end;
  313. end;
  314.  
  315. function TMemberList.NewMember: TMember;
  316. begin
  317.   Result:= TMember.Create();
  318.   FMembers.Add(Result);
  319. end;
  320.  
  321. procedure TMemberList.AddMember(AMember: TMember);
  322. begin
  323.   FMembers.Add(AMember);
  324. end;
  325.  
  326. procedure TMemberList.DeleteMember(AMember: TMember);
  327. var
  328.   Index: Integer;
  329. begin
  330.   for Index:= 0 to Self.Count - 1 do
  331.     if Self.FMembers[Index] = AMember
  332.       then begin
  333.              Self.FMembers.Delete(Index);
  334.              Break;
  335.            end;
  336. end;
  337.  
  338. function CampareMembers(Item1, Item2: Pointer): Integer;
  339. var
  340.   M1, M2: TMember;
  341. begin
  342.   M1:= TMember(Item1);
  343.   M2:= TMember(Item2);
  344.  
  345.   if M1.Rating < M2.Rating
  346.     then Result:= +1
  347.     else if M1.Rating > M2.Rating
  348.            then Result:= -1
  349.            else Result:= 0;
  350. end;
  351.  
  352. procedure TMemberList.CalcPlaces;
  353. var
  354.   Temp: TList;
  355.   Index: Integer;
  356.   R, P: Cardinal;
  357.   Member: TMember;
  358. begin
  359.   Temp:= TList.Create();
  360.   try
  361.     Temp.Assign(Self.FMembers);
  362.     Temp.Sort(CampareMembers);
  363.  
  364.     R:= 0;
  365.     P:= 1;
  366.     for Index:= 0 to Temp.Count - 1 do
  367.       begin
  368.         Member:= TMember(Temp[Index]);
  369.  
  370.         if Member.Rating < R
  371.           then Inc(P);
  372.  
  373.         Member.Place:= P;
  374.         R:= Member.Rating;
  375.       end;
  376.   finally
  377.     Temp.Free();
  378.   end;
  379. end;
  380.  
  381. function GetFileLastSaveTime(const FileName: string; var T: TDateTime): Boolean;
  382. var
  383.   Stamp: TFileDateTimeStamp;
  384. begin
  385.   Result:= GetFileDateTimeStamp(FileName, Stamp);
  386.   if Result
  387.     then T:= Stamp.LastWrite;
  388. end;
  389.  
  390. procedure TMemberList.Sort(const SortType: TMembersSortType);
  391. var
  392.   CompareProc: TListSortCompare;
  393. begin
  394.   // Сортировка
  395.   SortDirection:= -1 * SortDirection;
  396.  
  397.   case SortType of
  398.     mstByName:      CompareProc:= CompareByName;
  399.     mstByRating:    CompareProc:= CompareByRating;
  400.     mstByLastVisit: CompareProc:= CompareByLastVisit;
  401.   else
  402.                     CompareProc:= CompareByPlace;
  403.   end; //case
  404.  
  405.   FMembers.Sort(CompareProc);
  406.   FSortedBy:= SortType;
  407.   //FModified:= True;
  408. end;
  409.  
  410. function CompareByName(Item1, Item2: Pointer): Integer;
  411. begin
  412.   Result:= SortDirection * CompareText(TMember(Item1).Name, TMember(Item2).Name);
  413. end;
  414.  
  415. function CompareByRating(Item1, Item2: Pointer): Integer;
  416. begin
  417.   Result:= SortDirection * CompareValue(TMember(Item1).Rating, TMember(Item2).Rating);
  418. end;
  419.  
  420. function CompareByLastVisit(Item1, Item2: Pointer): Integer;
  421. begin
  422.   Result:= SortDirection * CompareDateTime(TMember(Item1).LastVisit, TMember(Item2).LastVisit);
  423. end;
  424.  
  425. function CompareByPlace(Item1, Item2: Pointer): Integer;
  426. begin
  427.   Result:= SortDirection * CompareValue(TMember(Item1).Place, TMember(Item2).Place);
  428. end;
  429.  
  430. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement