Changeset 171 for trunk/LocalPlayer


Ignore:
Timestamp:
Jun 15, 2019, 7:20:36 PM (5 years ago)
Author:
chronos
Message:
  • Fixed: Incorrectly appended lines in Help form causing exception.
  • Modified: Refactored code in Help form for better readability.
  • Fixed: Mouse sheel scrolling sensitivity.
Location:
trunk/LocalPlayer
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/LocalPlayer/Help.pas

    r170 r171  
    77  Protocol, ScreenTools, BaseWin, StringTables, Math,
    88  LCLIntf, LCLType, LMessages, Messages, SysUtils, Classes, Graphics, Controls, Forms,
    9   ExtCtrls, ButtonB, PVSB, Types;
     9  ExtCtrls, ButtonB, PVSB, Types, fgl;
    1010
    1111const
     
    4141  THyperText = class(TStringList)
    4242  public
    43     procedure AddLine(s: String = ''; Format: integer = 0; Picpix: integer = 0;
     43    procedure AddLine(s: String = ''; Format: integer = 0; Picpix: Integer = 0;
    4444      LinkCategory: integer = 0; LinkIndex: integer = 0);
    45     procedure LF;
     45    procedure LineFeed;
     46    procedure AppendList(Source: THyperText);
    4647    destructor Destroy; override;
     48  end;
     49
     50  { THistItem }
     51
     52  THistItem = class
     53    Kind: Integer;
     54    No: Integer;
     55    Pos: Integer;
     56    SearchContent: string;
     57    procedure Assign(Source: THistItem);
     58  end;
     59
     60  { THistItems }
     61
     62  THistItems = class(TFPGObjectList<THistItem>)
     63    function AddNew(Kind, No, Pos: Integer; SearchContent: string): THistItem;
    4764  end;
    4865
     
    7289    procedure OffscreenPaint; override;
    7390  private
    74     Kind, no, Sel, nHist, CaptionColor: integer;
    75     hADVHELP, hIMPHELP, hFEATUREHELP, hGOVHELP, hSPECIALMODEL,
    76       hJOBHELP: integer;
    77     SearchContent, NewSearchContent: string;
     91    Kind: Integer;
     92    no: Integer;
     93    Sel: Integer;
     94    CaptionColor: Integer;
     95    hADVHELP, hIMPHELP, hFEATUREHELP, hGOVHELP, hSPECIALMODEL, hJOBHELP: Integer;
     96    SearchContent: string;
     97    NewSearchContent: string;
    7898    CaptionFont: TFont;
    79     MainText, SearchResult: THyperText;
     99    MainText: THyperText;
     100    SearchResult: THyperText;
    80101    HelpText: TStringTable;
    81102    ExtPic, TerrIcon: TBitmap;
    82     sb: TPVScrollbar;
    83     x0: array [-2 .. 18] of integer;
    84     HistKind: array [0 .. MaxHist - 1] of integer;
    85     HistNo: array [0 .. MaxHist - 1] of integer;
    86     HistPos: array [0 .. MaxHist - 1] of integer;
    87     HistSearchContent: array [0 .. MaxHist - 1] of shortstring;
     103    ScrollBar: TPVScrollbar;
     104    x0: array [-2..180] of Integer;
     105    procedure PaintTerrIcon(x, y, xSrc, ySrc: Integer);
    88106    procedure ScrollBarUpdate(Sender: TObject);
    89     procedure line(ca: TCanvas; i: integer; lit: boolean);
    90     procedure Prepare(sbPos: integer = 0);
     107    procedure Line(ca: TCanvas; i: Integer; lit: Boolean);
     108    procedure Prepare(sbPos: Integer = 0);
    91109    procedure ShowNewContentProcExecute(NewMode: Integer; HelpContext: string);
    92     procedure WaterSign(x0, y0, iix: integer);
     110    procedure WaterSign(x0, y0, iix: Integer);
    93111    procedure Search(SearchString: string);
    94112    procedure OnScroll(var m: TMessage); message WM_VSCROLL;
    95113    procedure OnMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
    96114  public
    97     Difficulty: integer;
    98     procedure ShowNewContent(NewMode, Category, Index: integer);
     115    HistItems: THistItems;
     116    Difficulty: Integer;
    99117    procedure ClearHistory;
    100     function TextIndex(Item: string): integer;
     118    procedure ShowNewContent(NewMode, Category, Index: Integer);
     119    function TextIndex(Item: string): Integer;
    101120  end;
    102121
     
    112131
    113132type
     133
     134  { THelpLineInfo }
     135
    114136  THelpLineInfo = class
    115     Format, Picpix: Byte;
     137    Format: Byte;
     138    Picpix: Byte;
    116139    Link: Word;
    117   end;
     140    procedure Assign(Source: THelpLineInfo);
     141  end;
     142
     143{ THelpLineInfo }
     144
     145procedure THelpLineInfo.Assign(Source: THelpLineInfo);
     146begin
     147  Format := Source.Format;
     148  PicPix := Source.PicPix;
     149  Link := Source.Link;
     150end;
     151
     152{ THistItem }
     153
     154procedure THistItem.Assign(Source: THistItem);
     155begin
     156  Kind := Source.Kind;
     157  No := Source.No;
     158  Pos := Source.Pos;
     159  SearchContent := Source.SearchContent;
     160end;
     161
     162{ THistItems }
     163
     164function THistItems.AddNew(Kind, No, Pos: Integer; SearchContent: string
     165  ): THistItem;
     166begin
     167  Result := THistItem.Create;
     168  Result.Kind := Kind;
     169  Result.No := No;
     170  Result.Pos := Pos;
     171  Result.SearchContent := SearchContent;
     172  Add(Result);
     173end;
    118174
    119175procedure THyperText.AddLine(s: String; Format: integer; Picpix: integer;
     
    131187end;
    132188
    133 procedure THyperText.LF;
     189procedure THyperText.LineFeed;
    134190begin
    135191  AddLine;
     192end;
     193
     194procedure THyperText.AppendList(Source: THyperText);
     195var
     196  I: Integer;
     197  HelpLineInfo: THelpLineInfo;
     198begin
     199  for I := 0 to Source.Count - 1 do begin
     200    HelpLineInfo := THelpLineInfo.Create;
     201    HelpLineInfo.Assign(THelpLineInfo(Source.Objects[I]));
     202    AddObject(Source.Strings[I], HelpLineInfo);
     203  end;
    136204end;
    137205
     
    199267begin
    200268  inherited;
     269  HistItems := THistItems.Create;
     270
    201271  CaptionLeft := BackBtn.Left + BackBtn.Width;
    202272  CaptionRight := SearchBtn.Left;
     
    206276  SearchResult := THyperText.Create;
    207277  SearchResult.OwnsObjects := True;
    208   sb := TPVScrollbar.Create(Self);
    209   sb.SetBorderSpacing(36, 9, 11);
    210   sb.OnUpdate := ScrollBarUpdate;
     278  ScrollBar := TPVScrollbar.Create(Self);
     279  ScrollBar.SetBorderSpacing(36, 9, 11);
     280  ScrollBar.OnUpdate := ScrollBarUpdate;
    211281
    212282  HelpText := TStringTable.Create;
     
    234304  TerrIcon.Canvas.FillRect(0, 0, TerrIcon.Width, TerrIcon.Height);
    235305  SearchContent := '';
    236   nHist := -1;
    237306  ShowNewContentProc := ShowNewContentProcExecute;
    238307end;
     
    245314end;
    246315
    247 procedure THelpDlg.ClearHistory;
    248 begin
    249   nHist := -1;
    250 end;
    251 
    252316procedure THelpDlg.FormDestroy(Sender: TObject);
    253317begin
    254318  ShowNewContentProc := nil;
    255   FreeAndNil(sb);
     319  FreeAndNil(ScrollBar);
    256320  FreeAndNil(MainText);
    257321  FreeAndNil(SearchResult);
     
    260324  FreeAndNil(HelpText);
    261325  // FreeAndNil(CaptionFont);
     326  FreeAndNil(HistItems);
    262327end;
    263328
     
    265330  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    266331begin
    267   if sb.ProcessMouseWheel(WheelDelta) then begin
     332  if ScrollBar.ProcessMouseWheel(WheelDelta) then begin
    268333    PaintBox1MouseMove(nil, [], MousePos.X - Left,
    269334      MousePos.Y - Top);
     
    279344begin
    280345  { TODO: Handled by MouseWheel event
    281   if sb.Process(m) then begin
     346  if ScrollBar.Process(m) then begin
    282347    Sel := -1;
    283348    SmartUpdateContent(true)
     
    289354begin
    290355  if Sel <> -1 then begin
    291     line(Canvas, Sel, false);
     356    Line(Canvas, Sel, false);
    292357    Sel := -1
    293358  end
    294359end;
    295360
     361procedure THelpDlg.ClearHistory;
     362begin
     363  HistItems.Clear;
     364end;
     365
    296366procedure THelpDlg.FormPaint(Sender: TObject);
    297367begin
     
    300370end;
    301371
    302 procedure THelpDlg.line(ca: TCanvas; i: integer; lit: boolean);
     372procedure THelpDlg.Line(ca: TCanvas; i: Integer; lit: Boolean);
    303373var
    304   TextColor, x, y: integer;
     374  TextColor, x, y: Integer;
    305375  TextSize: TSize;
    306376  s: string;
    307377begin
    308   s := MainText[sb.Position + i];
     378  s := MainText[ScrollBar.Position + i];
    309379  if s = '' then
    310     exit;
     380    Exit;
    311381  x := x0[i];
    312382  y := 2 + i * 24;
     
    316386    y := y + WideFrame
    317387  end;
    318   if THelpLineInfo(MainText.Objects[sb.Position + i]).Format
     388  if THelpLineInfo(MainText.Objects[ScrollBar.Position + i]).Format
    319389    in [pkCaption, pkBigTer, pkRightIcon, pkBigFeature] then
    320390  begin
     
    332402    ca.Font.Assign(UniFont[ftNormal]);
    333403  end
    334   else if THelpLineInfo(MainText.Objects[sb.Position + i]).Format = pkSection
     404  else if THelpLineInfo(MainText.Objects[ScrollBar.Position + i]).Format = pkSection
    335405  then
    336406  begin
     
    351421        TextSize.cy := WideFrame + InnerHeight - y;
    352422      FillSeamless(ca, x, y, TextSize.cx, TextSize.cy, -SideFrame,
    353         sb.Position * 24 - WideFrame, Paper);
     423        ScrollBar.Position * 24 - WideFrame, Paper);
    354424    end;
    355425    BiColorTextOut(ca, TextColor, $7F007F, x, y, s);
     
    357427      with ca do
    358428      begin
    359         assert(ca = Canvas);
    360         pen.color := TextColor;
    361         moveto(x + 1, y + TextSize.cy - 2);
    362         lineto(x + TextSize.cx, y + TextSize.cy - 2);
     429        Assert(ca = Canvas);
     430        Pen.Color := TextColor;
     431        MoveTo(x + 1, y + TextSize.cy - 2);
     432        LineTo(x + TextSize.cx, y + TextSize.cy - 2);
    363433      end;
    364434    if (Kind = hkMisc) and (no = miscMain) then
     
    373443var
    374444  x, y, dx, dy, xSrc, ySrc, sum, xx: integer;
    375   Heaven: array [0 .. nHeaven] of integer;
     445  Heaven: array [0..nHeaven] of integer;
    376446  PaintPtr, CoalPtr: TPixelPointer;
    377   ImpPtr: array [-1 .. 1] of TPixelPointer;
     447  ImpPtr: array [-1..1] of TPixelPointer;
    378448begin
    379449  // assume eiffel tower has free common heaven
     
    424494end;
    425495
     496procedure THelpDlg.PaintTerrIcon(x, y, xSrc, ySrc: integer);
     497begin
     498  Frame(OffScreen.Canvas, x - 1, y - 1, x + xSizeBig, y + ySizeBig,
     499    $000000, $000000);
     500  if 2 * yyt < 40 then begin
     501    Sprite(OffScreen, HGrTerrain, x, y, 56, 2 * yyt, xSrc, ySrc);
     502    Sprite(OffScreen, HGrTerrain, x, y + 2 * yyt, 56, 40 - 2 * yyt,
     503      xSrc, ySrc);
     504  end else
     505    Sprite(OffScreen, HGrTerrain, x, y, 56, 40, xSrc, ySrc);
     506  Sprite(OffScreen, HGrTerrain, x, y, xxt, yyt, xSrc + xxt, ySrc + yyt);
     507  Sprite(OffScreen, HGrTerrain, x, y + yyt, xxt, 40 - yyt, xSrc + xxt, ySrc);
     508  Sprite(OffScreen, HGrTerrain, x + xxt, y, 56 - xxt, yyt, xSrc, ySrc + yyt);
     509  Sprite(OffScreen, HGrTerrain, x + xxt, y + yyt, 56 - xxt, 40 - yyt,
     510    xSrc, ySrc);
     511end;
     512
    426513procedure THelpDlg.OffscreenPaint;
    427 
    428   procedure PaintTerrIcon(x, y, xSrc, ySrc: integer);
    429   begin
    430     Frame(OffScreen.Canvas, x - 1, y - 1, x + xSizeBig, y + ySizeBig,
    431       $000000, $000000);
    432     if 2 * yyt < 40 then
    433     begin
    434       Sprite(OffScreen, HGrTerrain, x, y, 56, 2 * yyt, xSrc, ySrc);
    435       Sprite(OffScreen, HGrTerrain, x, y + 2 * yyt, 56, 40 - 2 * yyt,
    436         xSrc, ySrc);
    437     end
    438     else
    439       Sprite(OffScreen, HGrTerrain, x, y, 56, 40, xSrc, ySrc);
    440     Sprite(OffScreen, HGrTerrain, x, y, xxt, yyt, xSrc + xxt, ySrc + yyt);
    441     Sprite(OffScreen, HGrTerrain, x, y + yyt, xxt, 40 - yyt, xSrc + xxt, ySrc);
    442     Sprite(OffScreen, HGrTerrain, x + xxt, y, 56 - xxt, yyt, xSrc, ySrc + yyt);
    443     Sprite(OffScreen, HGrTerrain, x + xxt, y + yyt, 56 - xxt, 40 - yyt,
    444       xSrc, ySrc);
    445   end;
    446 
    447514var
    448   i, j, yl, srcno, ofs, cnt, y: integer;
     515  i, j, yl, srcno, ofs, cnt, y: Integer;
    449516  s: string;
    450517  HelpLineInfo: THelpLineInfo;
     
    453520  CaptionColor := Colors.Canvas.Pixels[clkMisc, cliPaperCaption];
    454521  FillSeamless(OffScreen.Canvas, 0, 0, InnerWidth, InnerHeight, 0,
    455     sb.Position * 24, Paper);
     522    ScrollBar.Position * 24, Paper);
    456523  with OffScreen.Canvas do
    457524  begin
    458525    Font.Assign(UniFont[ftNormal]);
    459     for i := -sb.Position to InnerHeight div 24 do
    460       if sb.Position + i < MainText.Count then
     526    for i := -ScrollBar.Position to InnerHeight div 24 do
     527      if ScrollBar.Position + i < MainText.Count then
    461528      begin
    462         HelpLineInfo := THelpLineInfo(MainText.Objects[sb.Position + i]);
     529        HelpLineInfo := THelpLineInfo(MainText.Objects[ScrollBar.Position + i]);
    463530        if HelpLineInfo.Format = pkExternal then
    464531        begin
     
    471538      end;
    472539    for i := -2 to InnerHeight div 24 do
    473       if (sb.Position + i >= 0) and (sb.Position + i < MainText.Count) then
     540      if (ScrollBar.Position + i >= 0) and (ScrollBar.Position + i < MainText.Count) then
    474541      begin
    475         HelpLineInfo := THelpLineInfo(MainText.Objects[sb.Position + i]);
     542        HelpLineInfo := THelpLineInfo(MainText.Objects[ScrollBar.Position + i]);
    476543        if HelpLineInfo.Link <> 0 then
    477544        begin
     
    777844            x0[i] := 64 + 8 + 8;
    778845        else
    779           x0[i] := x0[i] + 8
     846          x0[i] := x0[i] + 8;
    780847        end;
    781         Self.line(OffScreen.Canvas, i, false)
     848        Self.Line(OffScreen.Canvas, i, False)
    782849      end;
    783850  end;
    784851  MarkUsedOffscreen(InnerWidth, InnerHeight + 13 + 48);
    785 end; { OffscreenPaint }
     852end;
    786853
    787854procedure THelpDlg.ScrollBarUpdate(Sender: TObject);
     
    793860procedure THelpDlg.Prepare(sbPos: integer = 0);
    794861var
    795   i, j, special, Domain, Headline, TerrType, TerrSubType: integer;
     862  i, j, Special, Domain, Headline, TerrType, TerrSubType: integer;
    796863  s: string;
    797864  ps: pchar;
    798865  List: THyperText;
    799   CheckSeeAlso: boolean;
    800 
    801   procedure AddAdv(i: integer);
     866  CheckSeeAlso: Boolean;
     867
     868  procedure AddAdvance(i: integer);
    802869  begin
    803870    MainText.AddLine(Phrases.Lookup('ADVANCES', i), pkAdvIcon, i,
     
    811878  end;
    812879
    813   procedure AddImp(i: integer);
     880  procedure AddImprovement(i: integer);
    814881  begin
    815882    MainText.AddLine(Phrases.Lookup('IMPROVEMENTS', i), pkSmallIcon, i,
     
    823890  end;
    824891
    825   procedure AddTer(i: integer);
     892  procedure AddTerrain(i: integer);
    826893  begin
    827894    if MainText.Count > 1 then
    828895    begin
    829       MainText.LF;
     896      MainText.LineFeed;
    830897    end;
    831898    MainText.AddLine(Phrases.Lookup('TERRAIN', i), pkTer, i, hkTer, i);
     
    844911  begin
    845912    if MainText.Count > 1 then
    846       MainText.LF;
     913      MainText.LineFeed;
    847914    FindStdModelPicture(SpecialModelPictureCode[i], pix, Name);
    848915    MainText.AddLine(Name, pkModel, pix, hkModel + hkCrossLink, i)
     
    858925      begin
    859926        AddLine('', pkLogo);
    860         LF;
     927        LineFeed;
    861928      end
    862929      else if Item = 'TECHFORMULA' then
     
    874941        for i := 1 to 3 do
    875942        begin
    876           LF;
     943          LineFeed;
    877944          AddLine(Phrases.Lookup('TERRAIN', 3 * 12 + i), pkTer, 3 * 12 + i);
    878945        end
     
    885952  end;
    886953
    887   procedure DecodeItem(s: string; var Category, Index: integer);
     954  procedure DecodeItem(s: string; var Category, Index: Integer);
    888955  var
    889     i: integer;
    890   begin
    891     if (length(s) > 0) and (s[1] = ':') then
    892     begin
     956    i: Integer;
     957  begin
     958    if (Length(s) > 0) and (s[1] = ':') then begin
    893959      Category := hkMisc;
    894960      Index := 0;
    895961      for i := 3 to length(s) do
    896         Index := Index * 10 + ord(s[i]) - 48;
     962        Index := Index * 10 + Ord(s[i]) - 48;
    897963      case s[2] of
    898         'A':
    899           Category := hkAdv;
    900         'B':
    901           Category := hkImp;
    902         'T':
    903           Category := hkTer;
    904         'F':
    905           Category := hkFeature;
    906         'E':
    907           Category := hkInternet;
    908         'S':
    909           Category := hkModel;
    910         'C':
    911           Index := miscCredits;
    912         'J':
    913           Index := miscJobList;
    914         'G':
    915           Index := miscGovList;
     964        'A': Category := hkAdv;
     965        'B': Category := hkImp;
     966        'T': Category := hkTer;
     967        'F': Category := hkFeature;
     968        'E': Category := hkInternet;
     969        'S': Category := hkModel;
     970        'C': Index := miscCredits;
     971        'J': Index := miscJobList;
     972        'G': Index := miscGovList;
    916973      end;
    917974      if (Category <> hkMisc) and (Index = 0) then
    918975        Index := 200;
    919     end
    920     else
    921     begin
     976    end else begin
    922977      Category := hkText;
    923       Index := HelpText.Gethandle(copy(s, 1, 255));
     978      Index := HelpText.Gethandle(Copy(s, 1, 255));
    924979    end;
    925980  end;
     
    943998        repeat
    944999          inc(p)
    945         until (p > length(s)) or (s[p] = '\');
    946         Caption := copy(s, 2, p - 2);
     1000        until (p > Length(s)) or (s[p] = '\');
     1001        Caption := Copy(s, 2, p - 2);
    9471002        Delete(s, 1, p);
    9481003      end
     
    9521007        repeat
    9531008          inc(p)
    954         until (p > length(s)) or (s[p] = '\');
    955         AddStandardBlock(copy(s, 2, p - 2));
     1009        until (p > Length(s)) or (s[p] = '\');
     1010        AddStandardBlock(Copy(s, 2, p - 2));
    9561011        Delete(s, 1, p);
    9571012      end
    9581013      else if s[1] = '@' then
    9591014      begin // image
    960         if (length(s) >= 2) and (s[2] = '@') then
     1015        if (Length(s) >= 2) and (s[2] = '@') then
    9611016        begin // generate from icon
    9621017          Picpix := 0;
    9631018          p := 3;
    964           while (p <= length(s)) and (s[p] <> '\') do
     1019          while (p <= Length(s)) and (s[p] <> '\') do
    9651020          begin
    966             Picpix := Picpix * 10 + ord(s[p]) - 48;
     1021            Picpix := Picpix * 10 + Ord(s[p]) - 48;
    9671022            inc(p)
    9681023          end;
     
    9701025            Picpix := 0;
    9711026          MainText.AddLine('', pkIllu, Picpix);
    972           MainText.LF;
    973           MainText.LF;
     1027          MainText.LineFeed;
     1028          MainText.LineFeed;
    9741029        end
    9751030        else
     
    9771032          p := 1;
    9781033          repeat
    979             inc(p)
    980           until (p > length(s)) or (s[p] = '\');
     1034            Inc(p)
     1035          until (p > Length(s)) or (s[p] = '\');
    9811036          if LoadGraphicFile(ExtPic, LocalizedFilePath('Help' +
    982             DirectorySeparator + copy(s, 2, p - 2)) + '.png') then
     1037            DirectorySeparator + Copy(s, 2, p - 2)) + '.png') then
    9831038          begin
    9841039            MainText.AddLine('', pkExternal);
    9851040            for i := 0 to (ExtPic.Height - 12) div 24 do
    986               MainText.LF;
     1041              MainText.LineFeed;
    9871042          end;
    9881043        end;
     
    9971052              repeat
    9981053                inc(p)
    999               until (p > length(s)) or (s[p] = '\') or (s[p] = ' ');
    1000               DecodeItem(copy(s, 2, p - 2), LinkCategory, LinkIndex);
     1054              until (p > Length(s)) or (s[p] = '\') or (s[p] = ' ');
     1055              DecodeItem(Copy(s, 2, p - 2), LinkCategory, LinkIndex);
    10011056              CurrentFormat := 0;
    10021057              if (LinkCategory <> hkText) and (LinkIndex < 200) then
     
    10161071                    begin
    10171072                      CurrentFormat := pkTer;
    1018                       Picpix := LinkIndex
     1073                      Picpix := LinkIndex;
    10191074                    end;
    10201075                  hkFeature:
     
    10321087              if s[1] = ':' then
    10331088                LinkCategory := LinkCategory + hkCrossLink;
    1034               if (p > length(s)) or (s[p] = ' ') then
     1089              if (p > Length(s)) or (s[p] = ' ') then
    10351090                Delete(s, 1, p)
    10361091              else
     
    10381093            end;
    10391094          '!': // highlited
    1040             if (length(s) >= 2) and (s[2] = '!') then
     1095            if (Length(s) >= 2) and (s[2] = '!') then
    10411096            begin
    10421097              if MainText.Count > 1 then
    1043                 MainText.LF;
     1098                MainText.LineFeed;
    10441099              FollowFormat := pkCaption;
    10451100              CurrentFormat := pkCaption;
     
    10681123        repeat
    10691124          repeat
    1070             inc(p)
    1071           until (p > length(s)) or (s[p] = ' ') or (s[p] = '\');
    1072           if (BiColorTextWidth(OffScreen.Canvas, copy(s, 1, p - 1)) <=
     1125            Inc(p)
     1126          until (p > Length(s)) or (s[p] = ' ') or (s[p] = '\');
     1127          if (BiColorTextWidth(OffScreen.Canvas, Copy(s, 1, p - 1)) <=
    10731128            RightMargin - ofs) then
    10741129            l := p - 1
    10751130          else
    10761131            Break;
    1077         until (p >= length(s)) or (s[l + 1] = '\');
    1078         MainText.AddLine(copy(s, 1, l), CurrentFormat, Picpix, LinkCategory,
     1132        until (p >= Length(s)) or (s[l + 1] = '\');
     1133        MainText.AddLine(Copy(s, 1, l), CurrentFormat, Picpix, LinkCategory,
    10791134          LinkIndex);
    1080         if (l < length(s)) and (s[l + 1] = '\') then
     1135        if (l < Length(s)) and (s[l + 1] = '\') then
    10811136          FollowFormat := pkNormal;
    10821137        Delete(s, 1, l + 1);
     
    10901145  end;
    10911146
    1092   procedure AddModelText(i: integer);
     1147  procedure AddModelText(i: Integer);
    10931148  var
    1094     pix: integer;
     1149    pix: Integer;
    10951150    s: string;
    10961151  begin
    1097     with MainText do
    1098     begin
    1099       if Count > 1 then
    1100       begin
    1101         LF;
    1102         LF;
     1152    with MainText do begin
     1153      if Count > 1 then begin
     1154        LineFeed;
     1155        LineFeed;
    11031156      end;
    11041157      FindStdModelPicture(SpecialModelPictureCode[i], pix, s);
     
    11341187  procedure AddJobList;
    11351188  var
    1136     i, JobCost: integer;
    1137   begin
    1138     with MainText do
    1139     begin
    1140       for i := 0 to nJobHelp - 1 do
    1141       begin
    1142         if i > 0 then
    1143         begin
    1144           LF;
    1145           LF
     1189    i, JobCost: Integer;
     1190  begin
     1191    with MainText do begin
     1192      for i := 0 to nJobHelp - 1 do begin
     1193        if i > 0 then begin
     1194          LineFeed;
     1195          LineFeed;
    11461196        end;
    11471197        AddLine(Phrases.Lookup('JOBRESULT', JobHelp[i]), pkSection);
     
    11521202        JobCost := -1;
    11531203        case JobHelp[i] of
    1154           jCanal:
    1155             JobCost := CanalWork;
    1156           jFort:
    1157             JobCost := FortWork;
    1158           jBase:
    1159             JobCost := BaseWork;
     1204          jCanal: JobCost := CanalWork;
     1205          jFort: JobCost := FortWork;
     1206          jBase: JobCost := BaseWork;
    11601207        end;
    11611208        if JobCost >= 0 then
     
    11641211        else
    11651212          AddTextual(HelpText.Lookup('JOBCOSTVAR'));
    1166         if JobPreq[JobHelp[i]] <> preNone then
    1167         begin
     1213        if JobPreq[JobHelp[i]] <> preNone then begin
    11681214          AddPreqAdv(JobPreq[JobHelp[i]]);
    11691215          MainText[Count - 1] := Format(HelpText.Lookup('REQUIRED'),
     
    11761222  procedure AddGraphicCredits;
    11771223  var
    1178     i: integer;
     1224    i: Integer;
    11791225    s: string;
    11801226    sr: TSearchRec;
    1181     List, plus: TStringList;
     1227    List, Plus: TStringList;
    11821228  begin
    11831229    List := TStringList.Create;
    1184     plus := TStringList.Create;
     1230    Plus := TStringList.Create;
    11851231    if FindFirst(HomeDir + 'Graphics' + DirectorySeparator + '*.credits.txt', $27, sr) = 0 then
    11861232      repeat
    1187         plus.LoadFromFile(HomeDir + 'Graphics' + DirectorySeparator + sr.Name);
    1188         List.AddStrings(plus);
     1233        Plus.LoadFromFile(HomeDir + 'Graphics' + DirectorySeparator + sr.Name);
     1234        List.AddStrings(Plus);
    11891235      until FindNext(sr) <> 0;
    11901236    FindClose(sr);
    1191     plus.Free;
     1237    Plus.Free;
    11921238
    11931239    List.Sort;
     
    11971243        List.Delete(i)
    11981244      else
    1199         inc(i);
    1200 
    1201     for i := 0 to List.Count - 1 do
    1202     begin
     1245        Inc(i);
     1246
     1247    for i := 0 to List.Count - 1 do begin
    12031248      s := List[i];
    12041249      while BiColorTextWidth(OffScreen.Canvas, s) > InnerWidth - 16 -
     
    12121257  procedure AddSoundCredits;
    12131258  var
    1214     i: integer;
     1259    i: Integer;
    12151260    s: string;
    12161261    List: TStringList;
     
    12181263    List := TStringList.Create;
    12191264    List.LoadFromFile(HomeDir + 'Sounds' + DirectorySeparator + 'sound.credits.txt');
    1220     for i := 0 to List.Count - 1 do
    1221     begin
     1265    for i := 0 to List.Count - 1 do begin
    12221266      s := List[i];
    12231267      while BiColorTextWidth(OffScreen.Canvas, s) > InnerWidth - 16 -
     
    12351279        MainText.Delete(Headline)
    12361280      else
    1237         MainText.LF;
     1281        MainText.LineFeed;
    12381282    MainText.AddLine(HelpText.Lookup(Item), pkSection);
    12391283    Headline := MainText.Count - 1;
     
    12411285
    12421286begin { Prepare }
    1243   with MainText do
    1244   begin
     1287  with MainText do begin
    12451288    OffScreen.Canvas.Font.Assign(UniFont[ftNormal]);
    1246     CheckSeeAlso := false;
     1289    CheckSeeAlso := False;
    12471290    Clear;
    12481291    Headline := -1;
    12491292    if (no >= 200) or not(Kind in [hkAdv, hkImp, hkTer, hkFeature]) then
    1250       LF;
     1293      LineFeed;
    12511294    case Kind of
    12521295      hkText:
     
    12601303                AddLine(HelpText.Lookup('HELPTITLE_QUICKSTART'), pkSpecialIcon,
    12611304                  0, { pkBigIcon,22, } hkText, HelpText.Gethandle('QUICK'));
    1262                 LF;
     1305                LineFeed;
    12631306                AddLine(HelpText.Lookup('HELPTITLE_CONCEPTS'), pkBigIcon, 6,
    12641307                  hkText, HelpText.Gethandle('CONCEPTS'));
    1265                 LF;
     1308                LineFeed;
    12661309                AddLine(HelpText.Lookup('HELPTITLE_TERLIST'), pkSpecialIcon, 1,
    12671310                  hkTer, 200);
    1268                 LF;
     1311                LineFeed;
    12691312                AddLine(HelpText.Lookup('HELPTITLE_JOBLIST'), pkSpecialIcon, 2,
    12701313                  hkMisc, miscJobList);
    1271                 LF;
     1314                LineFeed;
    12721315                AddLine(HelpText.Lookup('HELPTITLE_TECHLIST'), pkBigIcon, 39,
    12731316                  hkAdv, 200);
    1274                 LF;
     1317                LineFeed;
    12751318                FindStdModelPicture(SpecialModelPictureCode[6], i, s);
    12761319                AddLine(HelpText.Lookup('HELPTITLE_MODELLIST'), pkModel, i,
    12771320                  hkModel, 0);
    1278                 LF;
     1321                LineFeed;
    12791322                AddLine(HelpText.Lookup('HELPTITLE_FEATURELIST'), pkBigIcon, 28,
    12801323                  hkFeature, 200);
    1281                 LF;
     1324                LineFeed;
    12821325                AddLine(HelpText.Lookup('HELPTITLE_IMPLIST'), pkBigIcon,
    12831326                  7 * SystemIconLines + imCourt, hkImp, 200);
    1284                 LF;
     1327                LineFeed;
    12851328                AddLine(HelpText.Lookup('HELPTITLE_UNIQUELIST'), pkBigIcon,
    12861329                  7 * SystemIconLines + imStockEx, hkImp, 201);
    1287                 LF;
     1330                LineFeed;
    12881331                AddLine(HelpText.Lookup('HELPTITLE_WONDERLIST'), pkBigIcon,
    12891332                  7 * SystemIconLines, hkImp, 202);
    1290                 LF;
     1333                LineFeed;
    12911334                AddLine(HelpText.Lookup('HELPTITLE_GOVLIST'), pkBigIcon,
    12921335                  gDemocracy + 6, hkMisc, miscGovList);
    1293                 LF;
     1336                LineFeed;
    12941337                AddLine(HelpText.Lookup('HELPTITLE_KEYS'), pkBigIcon, 2, hkText,
    12951338                  HelpText.Gethandle('HOTKEYS'));
    1296                 LF;
     1339                LineFeed;
    12971340                AddLine(HelpText.Lookup('HELPTITLE_ABOUT'), pkBigIcon, 1,
    12981341                  hkText, HelpText.Gethandle('ABOUT'));
    1299                 LF;
     1342                LineFeed;
    13001343                AddLine(HelpText.Lookup('HELPTITLE_CREDITS'), pkBigIcon, 22,
    13011344                  hkMisc, miscCredits);
     
    13041347              begin
    13051348                AddItem('CREDITS');
    1306                 LF;
     1349                LineFeed;
    13071350                AddGraphicCredits;
    13081351                NextSection('CRED_CAPSOUND');
     
    13181361                Caption := HelpText.Lookup('HELPTITLE_JOBLIST');
    13191362                AddJobList;
    1320                 LF;
     1363                LineFeed;
    13211364                AddItem('TERIMPEXCLUDE');
    1322                 LF;
     1365                LineFeed;
    13231366                AddItem('TERIMPCITY');
    13241367              end;
     
    13291372                begin
    13301373                  AddLine(Phrases.Lookup('GOVERNMENT', i mod nGov), pkSection);
    1331                   LF;
     1374                  LineFeed;
    13321375                  if i = nGov then
    13331376                    AddLine('', pkBigIcon, 7 * SystemIconLines + imPalace)
    13341377                  else
    13351378                    AddLine('', pkBigIcon, i + 6);
    1336                   LF;
     1379                  LineFeed;
    13371380                  AddTextual(HelpText.LookupByHandle(hGOVHELP, i mod nGov));
    13381381                  if i mod nGov >= 2 then
     
    13441387                  if i < nGov then
    13451388                  begin
    1346                     LF;
    1347                     LF;
     1389                    LineFeed;
     1390                    LineFeed;
    13481391                  end
    13491392                end
     
    13531396                Caption := HelpText.Lookup('HELPTITLE_SEARCHRESULTS');
    13541397                AddTextual(Format(HelpText.Lookup('MATCHES'), [SearchContent]));
    1355                 MainText.AddStrings(SearchResult);
    1356               end
     1398                MainText.AppendList(SearchResult);
     1399              end;
    13571400          end; // case no
    13581401        end;
     
    13671410            if j > 0 then
    13681411            begin
    1369               LF;
    1370               LF;
     1412              LineFeed;
     1413              LineFeed;
    13711414            end;
    13721415            AddLine(HelpText.Lookup('TECHAGE', j), pkSection);
     
    13861429                  hkAdv, i);
    13871430            List.Sort;
    1388             AddStrings(List);
     1431            AppendList(List);
    13891432          end;
    1390           List.Free
     1433          List.Free;
    13911434        end
    13921435        else // single advance
    13931436        begin
    13941437          Caption := Phrases.Lookup('ADVANCES', no);
    1395           LF;
     1438          LineFeed;
    13961439          AddLine(Phrases.Lookup('ADVANCES', no), pkCaption);
    13971440          if no in FutureTech then
    13981441          begin
    13991442            AddLine(HelpText.Lookup('HELPSPEC_FUTURE'));
    1400             LF;
     1443            LineFeed;
    14011444            if no = futResearchTechnology then
    14021445              AddItem('FUTURETECHHELP100')
     
    14211464          for i := 0 to 27 do
    14221465            if Imp[i].Preq = no then
    1423               AddImp(i);
     1466              AddImprovement(i);
    14241467          for i := 28 to nImp - 1 do
    14251468            if (Imp[i].Preq = no) and (Imp[i].Kind <> ikCommon) then
    1426               AddImp(i);
     1469              AddImprovement(i);
    14271470          for i := 28 to nImp - 1 do
    14281471            if (Imp[i].Preq = no) and (Imp[i].Kind = ikCommon) then
    1429               AddImp(i);
     1472              AddImprovement(i);
    14301473          NextSection('MODELALLOW');
    14311474          for i := 0 to nSpecialModel - 1 do
     
    14401483            if (AdvPreq[i, 0] = no) or (AdvPreq[i, 1] = no) or
    14411484              (AdvPreq[i, 2] = no) then
    1442               AddAdv(i);
     1485              AddAdvance(i);
    14431486          NextSection('UPGRADEALLOW');
    14441487          for Domain := 0 to nDomains - 1 do
     
    14641507          for i := 0 to 27 do
    14651508            if (Imp[i].Preq <> preNA) and (Imp[i].Expiration = no) then
    1466               AddImp(i);
     1509              AddImprovement(i);
    14671510          NextSection('ADVEFFECT');
    14681511          s := HelpText.LookupByHandle(hADVHELP, no);
     
    14851528                i, hkImp, i);
    14861529          List.Sort;
    1487           AddStrings(List);
    1488           List.Free
     1530          AppendList(List);
     1531          List.Free;
    14891532        end
    14901533        else if no = 201 then
     
    14971540              AddLine(Phrases.Lookup('IMPROVEMENTS', i), pkSmallIcon, i,
    14981541                hkImp, i);
    1499           { LF;
    1500             LF;
     1542          { LineFeed;
     1543            LineFeed;
    15011544            AddLine(HelpText.Lookup('HELPTITLE_SHIPPARTLIST'),pkSection);
    15021545            for i:=28 to nImp-1 do
     
    15161559        begin // single building
    15171560          Caption := Phrases.Lookup('IMPROVEMENTS', no);
    1518           LF;
     1561          LineFeed;
    15191562          AddLine(Phrases.Lookup('IMPROVEMENTS', no), pkRightIcon, no);
    15201563          case Imp[no].Kind of
    1521             ikWonder:
    1522               AddLine(HelpText.Lookup('HELPSPEC_WONDER'));
    1523             ikCommon:
    1524               AddLine(HelpText.Lookup('HELPSPEC_IMP'));
    1525             ikShipPart:
    1526               AddLine(HelpText.Lookup('HELPSPEC_SHIPPART'));
     1564            ikWonder: AddLine(HelpText.Lookup('HELPSPEC_WONDER'));
     1565            ikCommon: AddLine(HelpText.Lookup('HELPSPEC_IMP'));
     1566            ikShipPart: AddLine(HelpText.Lookup('HELPSPEC_SHIPPART'));
    15271567          else
    15281568            AddLine(HelpText.Lookup('HELPSPEC_NAT'))
    15291569          end;
    1530           if Imp[no].Kind <> ikShipPart then
    1531           begin
     1570          if Imp[no].Kind <> ikShipPart then begin
    15321571            NextSection('EFFECT');
    15331572            AddTextual(HelpText.LookupByHandle(hIMPHELP, no));
    15341573          end;
    1535           if no = woSun then
    1536           begin
     1574          if no = woSun then begin
    15371575            AddFeature(mcFirst);
    15381576            AddFeature(mcWill);
     
    15411579          if (no < 28) and not Phrases2FallenBackToEnglish then
    15421580          begin
    1543             LF;
     1581            LineFeed;
    15441582            if Imp[no].Expiration >= 0 then
    15451583              AddTextual(Phrases2.Lookup('HELP_WONDERMORALE1'))
     
    15711609                j := 1
    15721610              end;
    1573               AddImp(ImpReplacement[i].OldImp);
     1611              AddImprovement(ImpReplacement[i].OldImp);
    15741612            end;
    15751613          if Imp[no].Kind = ikShipPart then
    15761614          begin
    1577             LF;
     1615            LineFeed;
    15781616            if no = imShipComp then
    15791617              i := 1
     
    15961634          NextSection('SEEALSO');
    15971635          if (no < 28) and (Imp[no].Expiration >= 0) then
    1598             AddImp(woEiffel);
     1636            AddImprovement(woEiffel);
    15991637          for i := 0 to nImpReplacement - 1 do
    16001638            if ImpReplacement[i].OldImp = no then
    1601               AddImp(ImpReplacement[i].NewImp);
     1639              AddImprovement(ImpReplacement[i].NewImp);
    16021640          if no = imSupermarket then
    16031641            AddLine(HelpText.Lookup('HELPTITLE_JOBLIST'), pkNormal, 0,
     
    16121650          // AddLine(HelpText.Lookup('HELPTITLE_TERLIST'),pkSection);
    16131651          for i := 0 to nTerrainHelp - 1 do
    1614             AddTer(TerrainHelp[i]);
     1652            AddTerrain(TerrainHelp[i]);
    16151653        end
    16161654        else
     
    16281666          begin
    16291667            Caption := Phrases.Lookup('TERRAIN', no);
    1630             LF;
     1668            LineFeed;
    16311669            AddLine(Phrases.Lookup('TERRAIN', no), pkBigTer, no);
    16321670            AddLine(HelpText.Lookup('HELPSPEC_TER'));
    1633             LF;
     1671            LineFeed;
    16341672            if (ProdRes[TerrSubType] > 0) or (MineEff > 0) then
    16351673              AddLine(Format(HelpText.Lookup('RESPROD'),
     
    16571695            if no = 3 * 12 then
    16581696            begin
    1659               LF;
     1697              LineFeed;
    16601698              AddTextual(HelpText.Lookup('DEADLANDS'));
    16611699            end;
    16621700            if (TerrType = fDesert) and (no <> fDesert + 12) then
    16631701            begin
    1664               LF;
     1702              LineFeed;
    16651703              AddTextual(Format(HelpText.Lookup('HOSTILE'), [DesertThurst]));
    16661704            end;
    16671705            if TerrType = fArctic then
    16681706            begin
    1669               LF;
     1707              LineFeed;
    16701708              AddTextual(Format(HelpText.Lookup('HOSTILE'), [ArcticThurst]));
    16711709            end;
    16721710            if (no < 3 * 12) and (TransTerrain >= 0) then
    16731711            begin
    1674               LF;
     1712              LineFeed;
    16751713              i := TransTerrain;
    16761714              if (TerrType <> fGrass) and (i <> fGrass) then
    16771715                i := i + TerrSubType * 12;
    1678               // trafo to same special resource group
     1716              // trafo to same Special resource group
    16791717              AddLine(Format(HelpText.Lookup('TRAFO'),
    16801718                [Phrases.Lookup('TERRAIN', i)]), pkTer, i,
     
    16821720              if no = fSwamp + 12 then
    16831721              begin
    1684                 LF;
     1722                LineFeed;
    16851723                AddLine(Format(HelpText.Lookup('TRAFO'),
    16861724                  [Phrases.Lookup('TERRAIN', TransTerrain + 24)]), pkTer,
     
    16891727              else if i = fGrass then
    16901728              begin
    1691                 LF;
     1729                LineFeed;
    16921730                AddLine(Format(HelpText.Lookup('TRAFO'),
    16931731                  [Phrases.Lookup('TERRAIN', fGrass + 12)]), pkTer, fGrass + 12,
     
    16981736            if no = 3 * 12 then
    16991737            begin
    1700               LF;
    1701               for special := 1 to 3 do
     1738              LineFeed;
     1739              for Special := 1 to 3 do
    17021740              begin
    1703                 if special > 1 then
    1704                   LF;
    1705                 AddLine(Phrases.Lookup('TERRAIN', 3 * 12 + special), pkTer,
    1706                   3 * 12 + special);
     1741                if Special > 1 then
     1742                  LineFeed;
     1743                AddLine(Phrases.Lookup('TERRAIN', 3 * 12 + Special), pkTer,
     1744                  3 * 12 + Special);
    17071745              end
    17081746            end
    17091747            else if (no < 12) and (no <> fGrass) and (no <> fOcean) then
    17101748            begin
    1711               LF;
    1712               for special := 1 to 2 do
    1713                 if (no <> fArctic) and (no <> fSwamp) or (special < 2) then
     1749              LineFeed;
     1750              for Special := 1 to 2 do
     1751                if (no <> fArctic) and (no <> fSwamp) or (Special < 2) then
    17141752                begin
    1715                   if special > 1 then
    1716                     LF;
    1717                   AddLine(Phrases.Lookup('TERRAIN', no + special * 12), pkTer,
    1718                     no + special * 12);
    1719                   i := FoodRes[special] - FoodRes[0];
     1753                  if Special > 1 then
     1754                    LineFeed;
     1755                  AddLine(Phrases.Lookup('TERRAIN', no + Special * 12), pkTer,
     1756                    no + Special * 12);
     1757                  i := FoodRes[Special] - FoodRes[0];
    17201758                  if i <> 0 then
    17211759                    MainText[Count - 1] := MainText[Count - 1] +
    17221760                      Format(HelpText.Lookup('SPECIALFOOD'), [i]);
    1723                   i := ProdRes[special] - ProdRes[0];
     1761                  i := ProdRes[Special] - ProdRes[0];
    17241762                  if i <> 0 then
    17251763                    MainText[Count - 1] := MainText[Count - 1] +
    17261764                      Format(HelpText.Lookup('SPECIALPROD'), [i]);
    1727                   i := TradeRes[special] - TradeRes[0];
     1765                  i := TradeRes[Special] - TradeRes[0];
    17281766                  if i <> 0 then
    17291767                    MainText[Count - 1] := MainText[Count - 1] +
     
    17331771            if no = 3 * 12 then
    17341772            begin
    1735               LF;
     1773              LineFeed;
    17361774              AddTextual(HelpText.Lookup('RARE'));
    17371775            end;
     
    17391777            begin
    17401778              NextSection('SEEALSO');
    1741               AddImp(woGardens);
     1779              AddImprovement(woGardens);
    17421780              CheckSeeAlso := true
    17431781            end
     
    17501788          Caption := HelpText.Lookup('HELPTITLE_FEATURELIST');
    17511789          List := THyperText.Create;
    1752           for special := 0 to 2 do
     1790          for Special := 0 to 2 do
    17531791          begin
    1754             if special > 0 then
    1755             begin
    1756               LF;
    1757               LF
    1758             end;
    1759             case special of
    1760               0:
    1761                 AddLine(HelpText.Lookup('HELPTITLE_FEATURE1LIST'), pkSection);
    1762               1:
    1763                 AddLine(HelpText.Lookup('HELPTITLE_FEATURE2LIST'), pkSection);
    1764               2:
    1765                 AddLine(HelpText.Lookup('HELPTITLE_FEATURE3LIST'), pkSection);
     1792            if Special > 0 then
     1793            begin
     1794              LineFeed;
     1795              LineFeed;
     1796            end;
     1797            case Special of
     1798              0: AddLine(HelpText.Lookup('HELPTITLE_FEATURE1LIST'), pkSection);
     1799              1: AddLine(HelpText.Lookup('HELPTITLE_FEATURE2LIST'), pkSection);
     1800              2: AddLine(HelpText.Lookup('HELPTITLE_FEATURE3LIST'), pkSection);
    17661801            end;
    17671802            List.Clear;
     
    17751810                else
    17761811                  j := 1;
    1777                 if j = special then
     1812                if j = Special then
    17781813                  List.AddLine(Phrases.Lookup('FEATURES', i), pkFeature, i,
    17791814                    hkFeature, i);
    17801815              end;
    17811816            List.Sort;
    1782             AddStrings(List);
     1817            AppendList(List);
    17831818          end;
    1784           List.Free
     1819          List.Free;
    17851820        end
    17861821        else
    17871822        begin // single feature
    17881823          Caption := Phrases.Lookup('FEATURES', no);
    1789           LF;
     1824          LineFeed;
    17901825          AddLine(Phrases.Lookup('FEATURES', no), pkBigFeature, no);
    17911826          if no < mcFirstNonCap then
     
    18151850          if Feature[no].Preq <> preNone then
    18161851          begin
    1817             LF;
     1852            LineFeed;
    18181853            if Feature[no].Preq = preSun then
    18191854              AddPreqImp(woSun) // sun tsu feature
     
    18241859          end;
    18251860          NextSection('SEEALSO');
    1826           CheckSeeAlso := true
     1861          CheckSeeAlso := True;
    18271862        end;
    18281863
     
    18331868            if i <> 2 then
    18341869              AddModelText(i);
    1835           LF;
     1870          LineFeed;
    18361871          AddItem('MODELNOTE');
    18371872        end;
     
    18421877        if (SeeAlso[i].Kind = Kind) and (SeeAlso[i].no = no) then
    18431878          case SeeAlso[i].SeeKind of
    1844             hkImp:
    1845               AddImp(SeeAlso[i].SeeNo);
    1846             hkAdv:
    1847               AddAdv(SeeAlso[i].SeeNo);
    1848             hkFeature:
    1849               AddFeature(SeeAlso[i].SeeNo);
     1879            hkImp: AddImprovement(SeeAlso[i].SeeNo);
     1880            hkAdv: AddAdvance(SeeAlso[i].SeeNo);
     1881            hkFeature: AddFeature(SeeAlso[i].SeeNo);
    18501882          end;
    18511883    if (Headline >= 0) and (Count = Headline + 1) then
    18521884      Delete(Headline)
    18531885    else
    1854       LF;
     1886      LineFeed;
    18551887
    18561888    //Self.Show;
    1857     sb.Init(Count - 1, InnerHeight div 24);
    1858     sb.SetPos(sbPos);
    1859     BackBtn.Visible := nHist > 0;
    1860     TopBtn.Visible := (nHist > 0) or (Kind <> hkMisc) or (no <> miscMain);
     1889    ScrollBar.Init(Count - 1, InnerHeight div 24);
     1890    ScrollBar.SetPos(sbPos);
     1891    BackBtn.Visible := HistItems.Count > 1;
     1892    TopBtn.Visible := (HistItems.Count > 1) or (Kind <> hkMisc) or (no <> miscMain);
    18611893    Sel := -1;
    18621894  end; // with MainText
    1863 end; { Prepare }
    1864 
    1865 procedure THelpDlg.ShowNewContent(NewMode, Category, Index: integer);
     1895end;
     1896
     1897procedure THelpDlg.ShowNewContent(NewMode, Category, Index: Integer);
    18661898begin
    18671899  if (Category <> Kind) or (Index <> no) or (Category = hkMisc) and
    1868     (Index = miscSearchResult) then
    1869   begin
    1870     if nHist = MaxHist then
    1871     begin
    1872       move(HistKind[2], HistKind[1], 4 * (nHist - 2));
    1873       move(HistNo[2], HistNo[1], 4 * (nHist - 2));
    1874       move(HistPos[2], HistPos[1], 4 * (nHist - 2));
    1875       move(HistSearchContent[2], HistSearchContent[1],
    1876         sizeof(shortstring) * (nHist - 2));
    1877     end
    1878     else
    1879       inc(nHist);
    1880     if nHist > 0 then
    1881     begin
    1882       HistKind[nHist - 1] := Kind;
    1883       HistNo[nHist - 1] := no;
    1884       HistPos[nHist - 1] := sb.Position;
    1885       HistSearchContent[nHist - 1] := SearchContent
    1886     end
     1900    (Index = miscSearchResult) then begin
     1901    if HistItems.Count = MaxHist then HistItems.Delete(0);
     1902    if HistItems.Count = 0 then
     1903      HistItems.AddNew(Category, Index, ScrollBar.Position, NewSearchContent)
     1904      else HistItems.AddNew(Kind, No, ScrollBar.Position, SearchContent);
    18871905  end;
    18881906  Kind := Category;
     
    18971915  x, y: integer);
    18981916var
    1899   i0, Sel0: integer;
     1917  i0, Sel0: Integer;
    19001918begin
    19011919  y := y - WideFrame;
    1902   i0 := sb.Position;
     1920  i0 := ScrollBar.Position;
    19031921  Sel0 := Sel;
    19041922  if (x >= SideFrame) and (x < SideFrame + InnerWidth) and (y >= 0) and
     
    19131931  begin
    19141932    if Sel0 <> -1 then
    1915       line(Canvas, Sel0, false);
     1933      Line(Canvas, Sel0, False);
    19161934    if Sel <> -1 then
    1917       line(Canvas, Sel, true)
     1935      Line(Canvas, Sel, True)
    19181936  end
    19191937end;
     
    19231941begin
    19241942  if Sel >= 0 then
    1925     with THelpLineInfo(MainText.Objects[Sel + sb.Position]) do
     1943    with THelpLineInfo(MainText.Objects[Sel + ScrollBar.Position]) do
    19261944      if Link shr 8 and $3F = hkInternet then
    19271945        case Link and $FF of
     
    19421960
    19431961procedure THelpDlg.BackBtnClick(Sender: TObject);
    1944 begin
    1945   if nHist > 0 then
    1946   begin
    1947     dec(nHist);
    1948     if (HistKind[nHist] = hkMisc) and (HistNo[nHist] = miscSearchResult) and
    1949       (HistSearchContent[nHist] <> SearchContent) then
     1962var
     1963  HistItem: THistItem;
     1964begin
     1965  if HistItems.Count > 1 then begin
     1966    HistItem := THistItem.Create;
     1967    HistItem.Assign(HistItems.Last);
     1968    HistItems.Delete(HistItems.Count - 1);
     1969    if (HistItem.Kind = hkMisc) and (HistItem.No = miscSearchResult) and
     1970      (HistItem.SearchContent <> SearchContent) then
    19501971    begin
    1951       SearchContent := HistSearchContent[nHist];
     1972      SearchContent := HistItem.SearchContent;
    19521973      Search(SearchContent);
    19531974    end;
    1954     Kind := HistKind[nHist];
    1955     no := HistNo[nHist];
    1956     Prepare(HistPos[nHist]);
     1975    Kind := HistItem.Kind;
     1976    no := HistItem.No;
     1977    Prepare(HistItem.Pos);
    19571978    OffscreenPaint;
    19581979    Invalidate;
    1959   end
     1980    HistItem.Free;
     1981  end;
    19601982end;
    19611983
    19621984procedure THelpDlg.TopBtnClick(Sender: TObject);
    19631985begin
    1964   nHist := 0;
     1986  while HistItems.Count > 1 do HistItems.Delete(HistItems.Count - 1);
    19651987  Kind := hkMisc;
    19661988  no := miscMain;
     
    19761998end;
    19771999
    1978 function THelpDlg.TextIndex(Item: string): integer;
    1979 begin
    1980   result := HelpText.Gethandle(Item)
     2000function THelpDlg.TextIndex(Item: string): Integer;
     2001begin
     2002  Result := HelpText.Gethandle(Item)
    19812003end;
    19822004
     
    19952017  InputDlg.CenterToRect(BoundsRect);
    19962018  InputDlg.ShowModal;
    1997   if (InputDlg.ModalResult = mrOK) and (length(InputDlg.EInput.Text) >= 2) then
     2019  if (InputDlg.ModalResult = mrOK) and (Length(InputDlg.EInput.Text) >= 2) then
    19982020  begin
    19992021    Search(InputDlg.EInput.Text);
     
    20122034        NewSearchContent := InputDlg.EInput.Text;
    20132035        ShowNewContent(FWindowMode, hkMisc, miscSearchResult);
    2014       end
    2015     end
    2016   end
     2036      end;
     2037    end;
     2038  end;
    20172039end;
    20182040
    20192041procedure THelpDlg.Search(SearchString: string);
    20202042var
    2021   h, i, PrevHandle, PrevIndex, p, RightMargin: integer;
     2043  h, i, PrevHandle, PrevIndex, p, RightMargin: Integer;
    20222044  s: string;
    20232045  mADVHELP, mIMPHELP, mFEATUREHELP: set of 0 .. 255;
    2024   bGOVHELP, bSPECIALMODEL, bJOBHELP: boolean;
     2046  bGOVHELP, bSPECIALMODEL, bJOBHELP: Boolean;
    20252047begin
    20262048  SearchResult.Clear;
     
    20282050  mIMPHELP := [];
    20292051  mFEATUREHELP := [];
    2030   bGOVHELP := false;
    2031   bSPECIALMODEL := false;
    2032   bJOBHELP := false;
     2052  bGOVHELP := False;
     2053  bSPECIALMODEL := False;
     2054  bJOBHELP := False;
    20332055
    20342056  // search in generic reference
    20352057  SearchString := UpperCase(SearchString);
    2036   for i := 0 to 35 + 4 do
    2037   begin
     2058  for i := 0 to 35 + 4 do begin
    20382059    s := Phrases.Lookup('TERRAIN', i);
    20392060    if pos(SearchString, UpperCase(s)) > 0 then
     
    20502071            imShipComp + i - 37) + ' ' + HelpText.Lookup('HELPSPEC_SHIPPART'),
    20512072            pkNormal, 0, hkImp + hkCrossLink, imShipComp + i - 37);
    2052         Break
    2053       end
     2073        Break;
     2074      end;
    20542075  end;
    20552076  for i := 0 to nJobHelp - 1 do
     
    20592080      SearchResult.AddLine(HelpText.Lookup('HELPTITLE_JOBLIST'), pkNormal, 0,
    20602081        hkMisc + hkCrossLink, miscJobList);
    2061       bJOBHELP := true;
    2062       Break
     2082      bJOBHELP := True;
     2083      Break;
    20632084    end;
    20642085  for i := 0 to nAdv - 1 do
     
    20732094      SearchResult.AddLine(s, pkNormal, 0, hkAdv + hkCrossLink, i);
    20742095      include(mADVHELP, i);
    2075     end
     2096    end;
    20762097  end;
    20772098  for i := 0 to nSpecialModel - 1 do
     
    20822103      SearchResult.AddLine(HelpText.Lookup('HELPTITLE_MODELLIST'), pkNormal, 0,
    20832104        hkModel + hkCrossLink, 0);
    2084       bSPECIALMODEL := true;
    2085       Break
     2105      bSPECIALMODEL := True;
     2106      Break;
    20862107    end;
    20872108  end;
     
    20892110  begin
    20902111    s := Phrases.Lookup('FEATURES', i);
    2091     if pos(SearchString, UpperCase(s)) > 0 then
     2112    if Pos(SearchString, UpperCase(s)) > 0 then
    20922113    begin
    20932114      if i < mcFirstNonCap then
     
    20982119        s := s + ' ' + HelpText.Lookup('HELPSPEC_FEATURE');
    20992120      SearchResult.AddLine(s, pkNormal, 0, hkFeature + hkCrossLink, i);
    2100       include(mFEATUREHELP, i);
    2101     end
     2121      Include(mFEATUREHELP, i);
     2122    end;
    21022123  end;
    21032124  for i := 0 to nImp - 1 do
    21042125  begin
    21052126    s := Phrases.Lookup('IMPROVEMENTS', i);
    2106     if pos(SearchString, UpperCase(s)) > 0 then
     2127    if Pos(SearchString, UpperCase(s)) > 0 then
    21072128    begin
    21082129      case Imp[i].Kind of
     
    21172138      end;
    21182139      SearchResult.AddLine(s, pkNormal, 0, hkImp + hkCrossLink, i);
    2119       include(mIMPHELP, i);
     2140      Include(mIMPHELP, i);
    21202141    end
    21212142  end;
    21222143  for i := 0 to nGov - 1 do
    2123     if pos(SearchString, UpperCase(Phrases.Lookup('GOVERNMENT', i))) > 0 then
     2144    if Pos(SearchString, UpperCase(Phrases.Lookup('GOVERNMENT', i))) > 0 then
    21242145    begin
    21252146      SearchResult.AddLine(HelpText.Lookup('HELPTITLE_GOVLIST'), pkNormal, 0,
    21262147        hkMisc + hkCrossLink, miscGovList);
    2127       bGOVHELP := true;
    2128       Break
     2148      bGOVHELP := True;
     2149      Break;
    21292150    end;
    21302151
     
    21472168          s := s + ' ' + HelpText.Lookup('HELPSPEC_ADV');
    21482169        SearchResult.AddLine(s, pkNormal, 0, hkAdv + hkCrossLink, i)
    2149       end
     2170      end;
    21502171    end
    21512172    else if h = hIMPHELP then
     
    21662187        end;
    21672188        SearchResult.AddLine(s, pkNormal, 0, hkImp + hkCrossLink, i)
    2168       end
     2189      end;
    21692190    end
    21702191    else if h = hFEATUREHELP then
     
    21812202          s := s + ' ' + HelpText.Lookup('HELPSPEC_FEATURE');
    21822203        SearchResult.AddLine(s, pkNormal, 0, hkFeature + hkCrossLink, i);
    2183       end
     2204      end;
    21842205    end
    21852206    else if h = hGOVHELP then
     
    22042225    begin
    22052226      s := HelpText.LookupByHandle(h);
    2206       p := pos('$', s);
     2227      p := Pos('$', s);
    22072228      if p > 0 then
    22082229      begin
    2209         s := copy(s, p + 1, maxint);
    2210         p := pos('\', s);
     2230        s := Copy(s, p + 1, maxint);
     2231        p := Pos('\', s);
    22112232        if p > 0 then
    2212           s := copy(s, 1, p - 1);
     2233          s := Copy(s, 1, p - 1);
    22132234        SearchResult.AddLine(s, pkNormal, 0, hkText + hkCrossLink, h);
    2214       end
    2215     end
    2216     until false;
     2235      end;
     2236    end;
     2237    until False;
    22172238
    22182239    // cut lines to fit to window
  • trunk/LocalPlayer/PVSB.pas

    r91 r171  
    109109    if Max < ScrollBar.PageSize then Result := False
    110110    else begin
    111       NewPos := ScrollBar.Position - Delta div 300;
     111      NewPos := ScrollBar.Position - Delta div 30;
    112112      if NewPos < 0 then NewPos := 0;
    113113      if NewPos > Max - ScrollBar.PageSize + 1 then
Note: See TracChangeset for help on using the changeset viewer.