📄 tabsformu.pas
字号:
var
Index: Integer;
begin
Index := lsbTabStopPositions.ItemIndex;
if (Index >= 0) and (Index < FTabs.Count) then
begin
FTabs.Delete(Index);
lsbTabStopPositions.Items.Delete(Index);
end;
GotoTab(Min(Index, FTabs.Count - 1));
end;
procedure TTabsForm.cmbMeasurementUnitsChange(Sender: TObject);
begin
UpdateMeasurementUnits;
end;
constructor TTabsForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTabs := TObjectList.Create;
Init;
end;
destructor TTabsForm.Destroy;
begin
FTabs.Free;
inherited Destroy;
end;
procedure TTabsForm.edtTabStopPositionKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if (Key = VK_DOWN) and not (ssAlt in Shift) then
begin
GotoTab(Min(lsbTabStopPositions.ItemIndex + 1, FTabs.Count - 1));
Key := 0;
end
else
if (Key = VK_UP) and not (ssAlt in Shift) then
begin
GotoTab(Max(lsbTabStopPositions.ItemIndex - 1, 0));
Key := 0;
end
else
if Key = VK_RETURN then
SetTabStop;
end;
procedure TTabsForm.FillMeasurementUnits(Strings: TStrings);
var
MeasurementUnit: TMeasurementUnit;
begin
Strings.BeginUpdate;
try
Strings.Clear;
for MeasurementUnit := Low(TMeasurementUnit) to High(TMeasurementUnit) do
Strings.AddObject(CMeasurementUnitLongStr[MeasurementUnit], TObject(MeasurementUnit));
finally
Strings.EndUpdate;
end;
end;
function TTabsForm.FindTab(const APosition: Integer;
var Index: Integer): Boolean;
var
L, H, I, C: Integer;
begin
Result := False;
L := 0;
H := FTabs.Count - 1;
while L <= H do
begin
I := (L + H) shr 1;
C := TTabObj(FTabs[I]).Position - APosition;
if C < 0 then
L := I + 1
else
begin
H := I - 1;
if C = 0 then
begin
Result := True;
Index := I;
Exit;
end;
end;
end;
Index := L;
end;
function TTabsForm.GetTabAlignment: TJvTabAlignment;
var
Alignment: TJvTabAlignment;
begin
for Alignment := Low(TJvTabAlignment) to High(TJvTabAlignment) do
if Assigned(FAlignmentObjs[Alignment]) and
FAlignmentObjs[Alignment].Checked then
begin
Result := Alignment;
Exit;
end;
Result := Low(TJvTabAlignment);
end;
function TTabsForm.GetTabLeader: TJvTabLeader;
var
Leader: TJvTabLeader;
begin
for Leader := Low(TJvTabLeader) to High(TJvTabLeader) do
if Assigned(FLeaderObjs[Leader]) and
FLeaderObjs[Leader].Checked then
begin
Result := Leader;
Exit;
end;
Result := Low(TJvTabLeader);
end;
procedure TTabsForm.GetTabs(Paragraph: TJvParaAttributes);
var
I: Integer;
begin
Paragraph.TabCount := FTabs.Count;
for I := 0 to FTabs.Count - 1 do
with TTabObj(FTabs[i]) do
begin
Paragraph.Tab[i] := Position;
Paragraph.TabAlignment[i] := Alignment;
Paragraph.TabLeader[i] := Leader;
end;
end;
procedure TTabsForm.GotoTab(const Index: Integer);
begin
lsbTabStopPositions.ItemIndex := Index;
SelectTab(Index);
end;
procedure TTabsForm.Init;
var
Leader: TJvTabLeader;
Alignment: TJvTabAlignment;
begin
FillChar(FLeaderObjs, SizeOf(FLeaderObjs), #0);
FillChar(FAlignmentObjs, SizeOf(FAlignmentObjs), #0);
FLeaderObjs[tlNone] := rbtLeader1;
FLeaderObjs[tlDotted] := rbtLeader2;
FLeaderObjs[tlDashed] := rbtLeader3;
FLeaderObjs[tlUnderlined] := rbtLeader4;
FLeaderObjs[tlDouble] := rbtLeader5;
FAlignmentObjs[taOrdinary] := rbtAlignment1;
FAlignmentObjs[taCenter] := rbtAlignment2;
FAlignmentObjs[taRight] := rbtAlignment3;
FAlignmentObjs[taDecimal] := rbtAlignment4;
FAlignmentObjs[taVertical] := rbtAlignment5;
if RichEditVersion < 3 then
begin
for Leader := Low(TJvTabLeader) to High(TJvTabLeader) do
if (Leader <> tlNone) and Assigned(FLeaderObjs[Leader]) then
FLeaderObjs[Leader].Enabled := False;
for Alignment := Low(TJvTabAlignment) to High(TJvTabAlignment) do
if (Alignment <> taOrdinary) and Assigned(FAlignmentObjs[Alignment]) then
FAlignmentObjs[Alignment].Enabled := False;
end;
FillMeasurementUnits(cmbMeasurementUnits.Items);
FMeasurementUnit := CInitialMeasurementUnit;
with cmbMeasurementUnits do
ItemIndex := Items.IndexOfObject(TObject(FMeasurementUnit));
end;
procedure TTabsForm.IsTabStopFilled(Sender: TObject);
begin
if Sender is TAction then
TAction(Sender).Enabled := edtTabStopPosition.Text > '';
end;
procedure TTabsForm.lsbTabStopPositionsClick(Sender: TObject);
begin
SelectTab(lsbTabStopPositions.ItemIndex);
end;
procedure TTabsForm.lsbTabStopPositionsEnter(Sender: TObject);
begin
edtTabStopPosition.SetFocus;
end;
procedure TTabsForm.SelectTab(const Index: Integer);
begin
if (Index < 0) or (Index >= FTabs.Count) then
begin
edtTabStopPosition.Text := '';
if ActiveControl = lsbTabStopPositions then
edtTabStopPosition.SetFocus;
Exit;
end;
with TTabObj(FTabs[Index]) do
begin
edtTabStopPosition.Text := PositionToText(Position, FMeasurementUnit);
TabLeader := Leader;
TabAlignment := Alignment;
end;
if Self.Visible then
with edtTabStopPosition do
begin
if Self.ActiveControl = lsbTabStopPositions then
SetFocus;
SelectAll;
end;
end;
procedure TTabsForm.SetTabAlignment(const Value: TJvTabAlignment);
begin
if Assigned(FAlignmentObjs[Value]) then
FAlignmentObjs[Value].Checked := True;
end;
procedure TTabsForm.SetTabLeader(const Value: TJvTabLeader);
begin
if Assigned(FLeaderObjs[Value]) then
FLeaderObjs[Value].Checked := True;
end;
procedure TTabsForm.SetTabs(Paragraph: TJvParaAttributes);
var
I: Integer;
begin
for I := 0 to Paragraph.TabCount - 1 do
begin
FTabs.Add(TTabObj.Create(Paragraph.Tab[i], Paragraph.TabAlignment[i], Paragraph.TabLeader[i]));
lsbTabStopPositions.Items.Add('');
end;
if lsbTabStopPositions.Items.Count > 0 then
begin
lsbTabStopPositions.ItemIndex := 0;
SelectTab(0);
end
else
begin
edtTabStopPosition.Text := '';
rbtLeader1.Checked := True;
rbtAlignment1.Checked := True;
end;
end;
procedure TTabsForm.SetTabStop;
var
Position: Integer;
Index: Integer;
begin
Position := TextToPosition(edtTabStopPosition.Text, FMeasurementUnit);
if FindTab(Position, Index) then
with TTabObj(FTabs[Index]) do
begin
Alignment := TabAlignment;
Leader := TabLeader;
end
else
begin
FTabs.Insert(Index, TTabObj.Create(Position, TabAlignment, TabLeader));
lsbTabStopPositions.Items.Add('');
end;
GotoTab(Index);
end;
procedure TTabsForm.UpdateLeader;
var
Leader: TJvTabLeader;
begin
if not Assigned(FAlignmentObjs[taVertical]) then
Exit;
for Leader := Low(TJvTabLeader) to High(TJvTabLeader) do
if Assigned(FLeaderObjs[Leader]) then
FLeaderObjs[Leader].Enabled :=
(RichEditVersion >= 3) and not FAlignmentObjs[taVertical].Checked;
end;
procedure TTabsForm.UpdateMeasurementUnits;
var
Index: Integer;
begin
Index := cmbMeasurementUnits.ItemIndex;
if Index < 0 then
Exit;
Index := Integer(cmbMeasurementUnits.Items.Objects[Index]);
if (Index < 0) or (Index > Integer(High(TMeasurementUnit))) then
Exit;
FMeasurementUnit := TMeasurementUnit(Index);
lsbTabStopPositions.Refresh;
GotoTab(lsbTabStopPositions.ItemIndex);
end;
procedure TTabsForm.lsbTabStopPositionsDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var S:String;
begin
if (Index >= 0) and (Index < FTabs.Count) then
begin
S := PositionToText(TTabObj(FTabs[Index]).Position, FMeasurementUnit);
lsbTabStopPositions.Canvas.FillRect(Rect);
lsbTabStopPositions.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, S);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -