📄 framview.pas
字号:
Viewer.OnSoundRequest := Nil;
end;
Unloaded := True;
end;
{----------------TfvFrame.frLoadFromFile}
procedure TfvFrame.frLoadFromFile(const FName, Dest: string; Bump, Reload: boolean);
{Note: if FName not '' and there is no RequestEvent, it has been HTML expanded
and contains the path}
var
OldPos: integer;
HS, OldTitle, OldName: string;
OldFormData: TFreeList;
SameName, Tex, Img: boolean;
OldViewer: ThtmlViewer;
OldFrameSet: TSubFrameSet;
EV: EventRec;
Upper, Lower, FrameFile: boolean;
Item: TFrameBase;
I: integer;
begin
if Assigned(RefreshTimer) then RefreshTimer.Enabled := False;
OldName := Source;
EV.NewName := FName;
if EV.NewName = '' then EV.NewName := OldName;
Source := EV.NewName;
HS := EV.NewName;
SameName := CompareText(EV.NewName, OldName)= 0;
{if SameName, will not have to reload anything}
Img := ImageFile(EV.NewName) and not MasterSet.RequestEvent;
Tex := TexFile(EV.NewName) and not MasterSet.RequestEvent;
EV.LStyle := lsFile;
if not Img and not Tex and not SameName then
MasterSet.TriggerEvent(EV.NewName, @EV);
try
if not SameName then
try
FrameFile := not Img and not Tex and
IsFrameString(EV.LStyle, EV.NewName, EV.AString, MasterSet.FrameViewer);
except
Raise(EfvLoadError.Create('Can''t load: '+EV.NewName));
end
else FrameFile := not Assigned(Viewer);
if SameName then
if Assigned(Viewer) then
begin
OldPos := Viewer.Position;
if Reload then
begin {this for Meta Refresh only}
case EV.LStyle of
lsFile: Viewer.LoadFromFile(EV.NewName+Dest);
lsString:
Viewer.LoadFromString(EV.AString, '');
end;
Viewer.Position := OldPos;
end
else
begin
Viewer.PositionTo(Dest);
if Bump and (Viewer.Position <> OldPos) then
{Viewer to Viewer}
frBumpHistory(HS, Viewer.Position, OldPos, Nil);
end;
MasterSet.FrameViewer.AddVisitedLink(EV.NewName+Dest);
end
else
begin
with FrameSet do
begin
for I := 0 to List.Count-1 do
Begin
Item := TFrameBase(List.Items[I]);
if (Item is TfvFrame) then
with TfvFrame(Item) do
if CompareText(Source, OrigSource) <> 0 then
begin
frLoadFromFile(OrigSource, '', True, False);
end;
end;
end;
Exit;
end
else if Assigned(Viewer) and not FrameFile then {not Same Name}
begin {Viewer already assigned and it's not a Frame file}
OldPos := Viewer.Position;
OldTitle := Viewer.DocumentTitle;
OldFormData := Viewer.FormData;
try
if Img then Viewer.LoadImageFile(EV.NewName)
else if Tex then Viewer.LoadTextFile(EV.NewName + Dest)
else
begin
Viewer.Base := MasterSet.FBase;
case EV.LStyle of
lsFile: Viewer.LoadFromFile(EV.NewName+Dest);
lsString:
Viewer.LoadFromString(EV.AString, '');
end;
if (EV.LStyle <> lsFile) and (Dest <> '') then
Viewer.PositionTo(Dest);
end;
MasterSet.FrameViewer.AddVisitedLink(EV.NewName+Dest);
if MasterSet.Viewers.Count > 1 then
begin
if Bump then
{Viewer to Viewer}
frBumpHistory(HS, Viewer.Position, OldPos, OldFormData)
else OldFormData.Free;
end
else OldFormData.Free;
except
OldFormData.Free;
Raise;
end;
if (MasterSet.Viewers.Count = 1) and Bump then
{a single viewer situation, bump the history here}
with MasterSet do
begin
FCurrentFile := Viewer.CurrentFile;
FTitle := Viewer.DocumentTitle;
FBase := Viewer.Base;
FBaseTarget := Viewer.BaseTarget;
FrameViewer.BumpHistory1(OldName, OldTitle, OldPos, HTMLType);
end;
end
else
begin {Viewer is not assigned or it is a Frame File} {not Same Name here either}
{keep the old viewer or frameset around (free later) to minimize blink}
OldViewer := Viewer; Viewer := Nil;
OldFrameSet := FrameSet; FrameSet := Nil;
if OldFrameSet <> Nil then OldFrameSet.ClearFrameNames;
if not Img and not Tex and FrameFile then
begin {it's a frame file}
FrameSet := TSubFrameSet.CreateIt(Self, MasterSet);
FrameSet.Align := alClient;
FrameSet.Visible := False;
InsertControl(FrameSet);
FrameSet.SendToBack; {to prevent blink}
FrameSet.Visible := True;
FrameParseString(MasterSet.FrameViewer, FrameSet, EV.LStyle, EV.NewName,
EV.AString, FrameSet.HandleMeta);
MasterSet.FrameViewer.AddVisitedLink(EV.NewName);
Self.BevelOuter := bvNone;
with FrameSet do
begin
for I := 0 to List.Count-1 do
Begin
Item := TFrameBase(List.Items[I]);
Item.LoadFiles(Nil);
end;
CheckNoresize(Lower, Upper);
if FRefreshDelay > 0 then
SetRefreshTimer;
end;
if Assigned(OldViewer) then
frBumpHistory(HS, 0, OldViewer.Position, OldViewer.FormData)
else frBumpHistory(EV.NewName, 0, 0, Nil);
end
else
begin {not a frame file but needs a viewer}
CreateViewer;
if Img then
Viewer.LoadImageFile(EV.NewName)
else if Tex then
Viewer.LoadTextFile(EV.NewName)
else
begin
Viewer.Base := MasterSet.FBase;
case EV.LStyle of
lsFile: Viewer.LoadFromFile(EV.NewName+Dest);
lsString:
Viewer.LoadFromString(EV.AString, '');
end;
if EV.LStyle <> lsFile then
Viewer.PositionTo(Dest);
end;
MasterSet.FrameViewer.AddVisitedLink(EV.NewName+Dest);
{FrameSet to Viewer}
frBumpHistory(HS, Viewer.Position, 0, Nil);
end;
if Assigned(FrameSet) then
with FrameSet do
begin
with ClientRect do
InitializeDimensions(Left, Top, Right-Left, Bottom-Top);
CalcSizes(Nil);
end;
if Assigned(Viewer) then
begin
if MasterSet.BorderSize = 0 then
BevelOuter := bvNone
else
begin
BevelOuter := bvLowered;
BevelWidth := MasterSet.BorderSize;
end;
if (Dest <> '') then
Viewer.PositionTo(Dest);
end;
if Assigned(OldViewer) then
begin
MasterSet.Viewers.Remove(OldViewer);
if MasterSet.FActive = OldViewer then
MasterSet.FActive := Nil;
OldViewer.Free;
end
else if Assigned(OldFrameSet) then
begin
OldFrameSet.UnloadFiles;
OldFrameSet.Visible := False;
OldFrameSet.DestroyHandle;
end;
RePaint;
end;
except
Source := OldName;
Raise;
end;
end;
{----------------TfvFrame.ReloadFile}
procedure TfvFrame.ReloadFile(const FName: string; APosition: integer);
{It's known that there is only a single viewer, the file is not being changed,
only the position}
begin
Viewer.Position := APosition;
end;
{----------------TfvFrame.frBumpHistory}
procedure TfvFrame.frBumpHistory(const NewName: string;
NewPos, OldPos: integer; OldFormData: TFreeList);
{applies to TFrames which hold a ThtmlViewer}{Viewer to Viewer}
var
PO: PositionObj;
begin
with frHistory do
begin
if (Count > 0) then
begin
PositionObj(frPositionHistory[frHistoryIndex]).Pos := OldPos;
if frHistory[frHistoryIndex] <> NewName then
PositionObj(frPositionHistory[frHistoryIndex]).FormData := OldFormData
else OldFormData.Free;
end
else OldFormData.Free;
MasterSet.ClearForwards; {clear the history list forwards}
frHistoryIndex := 0;
InsertObject(0, NewName, FrameSet); {FrameSet may be Nil here}
PO := PositionObj.Create;
PO.Pos := NewPos;
PO.Seq := Sequence;
Inc(Sequence);
frPositionHistory.Insert(0, PO);
MasterSet.UpdateFrameList;
with MasterSet.FrameViewer do
if Assigned(FOnHistoryChange) then
FOnHistoryChange(MasterSet.FrameViewer);
end;
end;
{----------------TfvFrame.frBumpHistory1}
procedure TfvFrame.frBumpHistory1(const NewName: string; Pos: integer);
{called from a fresh TfvFrame. History list is empty}
var
PO: PositionObj;
begin
with frHistory do
begin
frHistoryIndex := 0;
InsertObject(0, NewName, FrameSet); {FrameSet may be Nil here}
PO := PositionObj.Create;
PO.Pos := Pos;
PO.Seq := Sequence;
Inc(Sequence);
frPositionHistory.Insert(0, PO);
MasterSet.UpdateFrameList;
with MasterSet.FrameViewer do
if Assigned(FOnHistoryChange) then
FOnHistoryChange(MasterSet.FrameViewer);
end;
end;
{----------------TfvFrame.frSetHistoryIndex}
procedure TfvFrame.frSetHistoryIndex(Value: integer);
begin
with frHistory do
if (Value <> frHistoryIndex) and (Value >= 0) and (Value < Count) then
begin
if Assigned(RefreshTimer) then
RefreshTimer.Enabled := False; {cut off any timing underway}
if Assigned(Viewer) then {current is Viewer}
with PositionObj(frPositionHistory[frHistoryIndex]) do
begin
Pos := Viewer.Position; {save the old position}
{note that frHistoryIndex can only change by 1}
PositionObj(frPositionHistory[frHistoryIndex]).FormData := Viewer.FormData;
end
else
begin {Current is FrameSet}
FrameSet.UnloadFiles;
FrameSet.DestroyHandle;
FrameSet.ClearFrameNames;
FrameSet.Visible := False;
FrameSet := Nil; {it's not destroyed,though}
end;
if Objects[Value] is TSubFrameSet then
begin
FrameSet := TSubFrameSet(Objects[Value]);
FrameSet.Visible := True;
FrameSet.ReloadFiles(-1);
FrameSet.AddFrameNames;
if Assigned(Viewer) then
begin
if Assigned(MasterSet.Viewers) then
MasterSet.Viewers.Remove(Viewer);
if MasterSet.FActive = Viewer then
MasterSet.FActive := Nil;
Viewer.Free;
Viewer := Nil;
end;
end
else
begin
if not Assigned(Viewer) then
CreateViewer;
with PositionObj(frPositionHistory[Value]) do
begin
if (Source <> Strings[Value]) then
begin
frLoadFromFile(Strings[Value], '', False, False);
Viewer.FormData := FormData;
FormData.Free;
FormData := Nil;
end;
Viewer.Position := Pos;
end;
end;
Source := Strings[Value];
frHistoryIndex := Value;
MasterSet.UpdateFrameList;
with MasterSet.FrameViewer do
if Assigned(FOnHistoryChange) then
FOnHistoryChange(MasterSet.FrameViewer);
MasterSet.FrameViewer.CheckVisitedLinks;
end;
end;
{----------------TfvFrame.UpdateFrameList}
procedure TfvFrame.UpdateFrameList;
begin
MasterSet.Frames.Add(Self);
if Assigned(FrameSet) then
FrameSet.UpdateFrameList;
end;
{----------------TSubFrameSet.CreateIt}
constructor TSubFrameSet.CreateIt(AOwner: TComponent; Master: TFrameSet);
begin
inherited Create(AOwner);
MasterSet := Master;
{$ifdef ver100_plus} {Delphi 3,4,5, C++Builder 3, 4}
if AOwner is TFrameBase then
LocalCharSet := TSubFrameset(AOwner).LocalCharSet;
{$endif}
OuterBorder := 0; {no border for subframesets}
if Self <> Master then
BorderSize := Master.BorderSize;
First := True;
List := TFreeList.Create;
OnResize := CalcSizes;
OnMouseDown := FVMouseDown;
OnMouseMove := FVMouseMove;
OnMouseUp := FVMouseUp;
{$ifdef delphi7_plus}
ParentBackground := False;
{$endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -