X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=Sort.pas;h=d013076ca50e89c42c1626bf5663a772bd42093d;hb=refs%2Ftags%2Fv1_55_1_697;hp=b2c6bcc805a820385c3c9f860839d843e716c56a;hpb=4781be10d20bce016d8297a8305807e17b5f27b8;p=gikonavigoeson%2Fgikonavi.git diff --git a/Sort.pas b/Sort.pas index b2c6bcc..d013076 100644 --- a/Sort.pas +++ b/Sort.pas @@ -3,21 +3,71 @@ unit Sort; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, - BoardGroup; + BoardGroup,DateUtils, + Setting, Math; function CategorySortProc(Item1, Item2: Pointer): integer; - function BoardSortProc(Item1, Item2: Pointer): integer; - function ThreadItemSortProc(Item1, Item2: Pointer): integer; + function BoardSortProc(List: TStringList; Item1, Item2: Integer): integer; + function ThreadItemSortProc(List: TStringList; Item1, Item2: Integer): integer; function CompareBool(Item1, Item2: Boolean): integer; function CompareInt(Item1, Item2: Integer): Integer; function CompareDate(Item1, Item2: TDateTime): Integer; + procedure SetSortDate(Date: TDateTime); + function GetSortDate(): TDateTime; + procedure SetSortOrder(Order: Boolean); + function GetSortOrder: Boolean; + procedure SetSortIndex(Index: Integer); + function GetSortIndex: Integer; + procedure SetSortNoFlag(Flag: Boolean); + function GetSortNoFlag: Boolean; + +implementation var - SortOrder: Boolean; - SortIndex: Integer; - SortNoFlag: Boolean; + FSortDate: TDateTime; + FSortOrder: Boolean; + FSortIndex: Integer; + FSortNoFlag: Boolean; -implementation +function CaclVigor(Thread: TThreadItem): Double; +var + span : Double; +begin + if (Thread.AgeSage <> gasArch) then begin + span := DaySpan(Sort.GetSortDate, Thread.CreateDate); + end else begin + span := DaySpan(Thread.LastModified, Thread.CreateDate); + end; + if (span > 0) then begin + Result := Thread.AllResCount / span; + end else begin + Result := 0; + end; +end; +procedure SetSortOrder(Order: Boolean); +begin + FSortOrder := Order; +end; +function GetSortOrder: Boolean; +begin + Result := FSortOrder; +end; +procedure SetSortIndex(Index: Integer); +begin + FSortIndex := Index; +end; +function GetSortIndex: Integer; +begin + Result := FSortIndex; +end; +procedure SetSortNoFlag(Flag: Boolean); +begin + FSortNoFlag := Flag; +end; +function GetSortNoFlag: Boolean; +begin + Result := FSortNoFlag; +end; function CategorySortProc(Item1, Item2: Pointer): integer; var @@ -27,57 +77,86 @@ begin CategoryItem1 := TCategory(Item1); CategoryItem2 := TCategory(Item2); - if SortNoFlag then - Result := CompareInt(CategoryItem1.No, CategoryItem2.No) + case TGikoBBSColumnID( FSortIndex ) of + gbbscTitle: + if FSortNoFlag then + Result := CompareInt(CategoryItem1.No, CategoryItem2.No) + else + Result := AnsiCompareText(CategoryItem1.Title, CategoryItem2.Title); else - Result := AnsiCompareText(CategoryItem1.Title, CategoryItem2.Title); + Result := CompareInt(CategoryItem1.No, CategoryItem2.No) + end; - if not SortOrder then + if not FSortOrder then Result := Result * -1; end; -function BoardSortProc(Item1, Item2: Pointer): integer; +function BoardSortProc(List: TStringList; Item1, Item2: Integer): integer; var BoardItem1: TBoard; BoardItem2: TBoard; begin - BoardItem1 := TBoard(Item1); - BoardItem2 := TBoard(Item2); - if SortIndex = 0 then - if SortNoFlag then + BoardItem1 := TBoard(List.Objects[Item1]); + BoardItem2 := TBoard(List.Objects[Item2]); + case TGikoCategoryColumnID( FSortIndex ) of + gccTitle: + if FSortNoFlag then Result := CompareInt(BoardItem1.No, BoardItem2.No) else - Result := AnsiCompareText(BoardItem1.Title, BoardItem2.Title) - else if SortIndex = 1 then - Result := CompareInt(BoardItem1.Count, BoardItem2.Count) - else + Result := AnsiCompareText(BoardItem1.Title, BoardItem2.Title); + + gccRoundName: + Result := CompareInt(BoardItem1.Count, BoardItem2.Count); + + gccLastModified: Result := CompareDate(BoardItem1.RoundDate, BoardItem2.RoundDate); + else + Result := CompareInt(BoardItem1.No, BoardItem2.No) + end; - if not SortOrder then + if not FSortOrder then Result := Result * -1; end; -function ThreadItemSortProc(Item1, Item2: Pointer): integer; +function ThreadItemSortProc(List: TStringList; Item1, Item2: Integer): integer; var ThreadItem1: TThreadItem; ThreadItem2: TThreadItem; begin - ThreadItem1 := TThreadItem(Item1); - ThreadItem2 := TThreadItem(Item2); - case SortIndex of - 0: + ThreadItem1 := TThreadItem(List.Objects[ Item1 ]); + ThreadItem2 := TThreadItem(List.Objects[ Item2 ]); + case TGikoBoardColumnID( FSortIndex ) of + gbcTitle: begin - if SortNoFlag then + if FSortNoFlag then Result := CompareInt(ThreadItem1.No, ThreadItem2.No) else Result := AnsiCompareText(ThreadItem1.Title, ThreadItem2.Title) end; - 1: Result := CompareInt(ThreadItem1.AllResCount, ThreadItem2.AllResCount); - 2: Result := CompareInt(ThreadItem1.Count, ThreadItem2.Count); - 3: Result := CompareInt(ThreadItem1.NewResCount, ThreadItem2.NewResCount); - 4: Result := 0; - 5: Result := AnsiCompareText(ThreadItem1.RoundName, ThreadItem2.RoundName); - 6: Result := CompareDate(ThreadItem1.LastModified, ThreadItem2.LastModified); + + gbcAllCount: Result := CompareInt(ThreadItem1.AllResCount, ThreadItem2.AllResCount); + gbcLocalCount: Result := CompareInt(ThreadItem1.Count, ThreadItem2.Count); + gbcNonAcqCount: + begin + if ThreadItem1.IsLogFile and ThreadItem2.IsLogFile then + Result := CompareInt(ThreadItem1.AllResCount - ThreadItem1.Count, ThreadItem2.AllResCount - ThreadItem2.Count) + else if ThreadItem1.IsLogFile then + Result := 1 + else if ThreadItem2.IsLogFile then + Result := -1 + else + Result := 0; + end; + + gbcNewCount: Result := CompareInt(ThreadItem1.NewResCount, ThreadItem2.NewResCount); + gbcUnReadCount: Result := 0; + gbcRoundName: Result := AnsiCompareText(ThreadItem1.RoundName, ThreadItem2.RoundName); + gbcRoundDate: Result := CompareDateTime(ThreadItem1.RoundDate, ThreadItem2.RoundDate); {gbcLastModified:} + gbcCreated: Result := CompareDateTime(ThreadItem1.CreateDate, ThreadItem2.CreateDate); + gbcLastModified: Result := CompareDateTime(ThreadItem1.LastModified, ThreadItem2.LastModified); {gbcLastModified:} + gbcVigor: Result := CompareValue(CaclVigor(ThreadItem1), CaclVigor(ThreadItem2)); + else + Result := 0; end; { if SortIndex = 0 then @@ -93,8 +172,16 @@ begin else Result := CompareDate(ThreadItem1.LastModified, ThreadItem2.LastModified); } - if not SortOrder then + if not FSortOrder then Result := Result * -1; + + // ƒ\[ƒg•]‰¿‚ª“¯‚¶ê‡‚́A‘æ1ƒJƒ‰ƒ€‚̏¸‡‚Ƀ\[ƒg + if Result = 0 then begin + if FSortNoFlag then + Result := CompareInt(ThreadItem1.No, ThreadItem2.No) + else + Result := AnsiCompareText(ThreadItem1.Title, ThreadItem2.Title) + end; end; function CompareBool(Item1, Item2: Boolean): Integer; @@ -126,5 +213,12 @@ begin else Result := 0; end; - +procedure SetSortDate(Date: TDateTime); +begin + FSortDate := Date; +end; +function GetSortDate(): TDateTime; +begin + Result := FSortDate; +end; end.