📄 jvqdsadialogs.pas
字号:
else
SetRect(TextRect, 0, 0, Screen.Width div 2, 0);
DrawText(Canvas, Msg, Length(Msg) + 1, TextRect,
DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK);
IconTextWidth := TextRect.Right;
IconTextHeight := TextRect.Bottom;
if CheckCaption <> '' then
begin
SetRect(TempRect, 0, 0, Screen.Width div 2, 0);
DrawText(Canvas, CheckCaption, Length(CheckCaption) + 1, TempRect,
DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK);
ChkTextWidth := TempRect.Right;
end
else
ChkTextWidth := 0;
if ATimeout > 0 then
begin
SetRect(TempRect, 0, 0, Screen.Width div 2, 0);
DrawText(Canvas, Format(RsCntdownText, [Timeout, TimeoutUnit(Timeout)]),
Length(Format(RsCntdownText, [Timeout, TimeoutUnit(Timeout)])) + 1, TempRect,
DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK);
TimeoutTextWidth := TempRect.Right;
end
else
TimeoutTextWidth := 0;
if APicture <> nil then
begin
Inc(IconTextWidth, APicture.Width + HorzSpacing);
if IconTextHeight < APicture.Height then
IconTextHeight := APicture.Height;
end;
ButtonCount := Length(Buttons);
ButtonGroupWidth := 0;
if ButtonCount <> 0 then
ButtonGroupWidth := ButtonWidth * ButtonCount + ButtonSpacing * (ButtonCount - 1);
ClientWidth := Max(TimeoutTextWidth, Max(17 + ChkTextWidth, Max(IconTextWidth, ButtonGroupWidth))) + HorzMargin *
2;
ClientHeight := IconTextHeight + ButtonHeight + VertSpacing * 2 + VertMargin;
if CheckCaption <> '' then
Result.ClientHeight := Result.ClientHeight + VertMargin + 17;
if ATimeout > 0 then
Result.ClientHeight := Result.ClientHeight + VertMargin + 13;
Left := (CenterParWidth div 2) - (Width div 2) + CenterParLeft;
Top := (CenterParHeight div 2) - (Height div 2) + CenterParTop;
if ACaption <> '' then
Caption := ACaption
else
Caption := Application.Title;
Panel := DynControlEngine.CreatePanelControl(Result, Result, 'Panel', '', alClient);
if APicture <> nil then
begin
Image := DynControlEngine.CreateImageControl(Result, Panel, 'Image');
if Supports(Image, IJvDynControlImage, DynControlImage) then
begin
DynControlImage.ControlSetGraphic(APicture);
DynControlImage.ControlSetCenter(True);
end;
Image.SetBounds(HorzMargin - 2, VertMargin - 2, APicture.Width + 4, APicture.Height + 4);
end;
MessageLabel := DynControlEngine.CreateLabelControl(Result, Panel, 'Message', Msg, nil);
if Supports(MessageLabel, IJvDynControlLabel, DynControlLabel) then
DynControlLabel.ControlSetWordWrap(True);
with MessageLabel do
begin
BoundsRect := TextRect;
ALeft := IconTextWidth - TextRect.Right + HorzMargin;
if UseRightToLeftAlignment then
ALeft := Result.ClientWidth - ALeft - Width;
SetBounds(ALeft, VertMargin,
TextRect.Right, TextRect.Bottom);
end;
X := (ClientWidth - ButtonGroupWidth) div 2;
for I := Low(Buttons) to High(Buttons) do
begin
with DynControlEngine.CreateButton(Result, Panel, 'Button' + IntToStr(I), Buttons[I], '', nil, False, False) do
begin
ModalResult := Results[I];
if I = DefaultButton then
Default := True;
if I = CancelButton then
Cancel := True;
SetBounds(X, IconTextHeight + VertMargin + VertSpacing, ButtonWidth, ButtonHeight);
Inc(X, ButtonWidth + ButtonSpacing);
if I = HelpButton then
OnClick := HelpButtonClick;
end;
end;
if CheckCaption <> '' then
with DynControlEngine.CreateCheckboxControl(Result, Panel, 'DontShowAgain', CheckCaption) do
begin
SetBounds(HorzMargin, IconTextHeight + VertMargin + VertSpacing * 2 + ButtonHeight,
Result.ClientWidth - 2 * HorzMargin, Height);
end;
if ATimeout > 0 then
begin
CountDownlabel := DynControlEngine.CreateLabelControl(Result, Panel, 'Countdown', Format(RsCntdownText,
[Timeout, TimeoutUnit(Timeout)]), nil);
with CountDownlabel do
begin
if CheckCaption = '' then
SetBounds(HorzMargin, IconTextHeight + VertMargin + VertSpacing * 2 + ButtonHeight,
Result.ClientWidth - 2 * HorzMargin, Height)
else
SetBounds(HorzMargin, IconTextHeight + 2 * VertMargin + VertSpacing * 2 + ButtonHeight + 17,
Result.ClientWidth - 2 * HorzMargin, Height);
end;
end;
end;
except
Result.Free;
raise;
end;
end;
//=== { TDSARegister } =======================================================
type
TAddResult = (arAdded, arExists, arDuplicateID, arDuplicateName);
TDSARegister = class
private
FList: array of TDSARegItem;
protected
function AddNew: Integer;
procedure Remove(const Index: Integer);
function IndexOf(const ID: Integer): Integer; overload;
function IndexOf(const Name: string): Integer; overload;
function IndexOf(const Item: TDSARegItem): Integer; overload;
public
destructor Destroy; override;
function Add(const Item: TDSARegItem): TAddResult; overload;
function Add(const ID: Integer; const Name, Description: string;
const Storage: TDSAStorage; const CheckTextKind:
TDSACheckTextKind = ctkShow): TAddResult; overload;
procedure Clear;
// procedure Delete(const Item: TDSARegItem); overload;
procedure Delete(const ID: Integer); overload;
// procedure Delete(const Name: string); overload;
function Locate(const ID: Integer): TDSARegItem; overload;
// function Locate(const Name: string): TDSARegItem; overload;
end;
const
EmptyItem: TDSARegItem = (ID: High(Integer); Name: ''; Storage: nil);
var
GlobalDSARegister: TDSARegister = nil;
function DSARegister: TDSARegister;
begin
if not Assigned(GlobalDSARegister) then
begin
GlobalDSARegister := TDSARegister.Create;
// register
RegisterDSACheckMarkText(ctkShow, RsDSActkShowText);
RegisterDSACheckMarkText(ctkAsk, RsDSActkAskText);
RegisterDSACheckMarkText(ctkWarn, RsDSActkWarnText);
end;
Result := GlobalDSARegister;
end;
destructor TDSARegister.Destroy;
begin
inherited Destroy;
Clear;
end;
function TDSARegister.AddNew: Integer;
begin
Result := Length(FList);
SetLength(FList, Result + 1);
end;
procedure TDSARegister.Remove(const Index: Integer);
var
I: Integer;
begin
for I := Index + 1 to High(FList) do
begin
FList[I-1].ID := FList[I].ID;
FList[I-1].Name := FList[I].Name;
FList[I-1].Description := FList[I].Description;
FList[I-1].ChkTextKind := FList[I].ChkTextKind;
FList[I-1].Storage := FList[I].Storage;
end;
SetLength(FList, High(FList));
end;
function TDSARegister.IndexOf(const ID: Integer): Integer;
begin
Result := High(FList);
while (Result > -1) and (FList[Result].ID <> ID) do
Dec(Result);
end;
function TDSARegister.IndexOf(const Name: string): Integer;
begin
Result := High(FList);
while (Result > -1) and not AnsiSameText(FList[Result].Name, Name) do
Dec(Result);
end;
function TDSARegister.IndexOf(const Item: TDSARegItem): Integer;
begin
Result := IndexOf(Item.ID);
if (Result > -1) and not AnsiSameText(FList[Result].Name, Item.Name) then
Result := -1;
end;
function TDSARegister.Add(const Item: TDSARegItem): TAddResult;
var
Idx: Integer;
begin
if IndexOf(Item) > -1 then
Result := arExists
else
if IndexOf(Item.ID) > -1 then
begin
Idx := IndexOf(Item.ID);
if AnsiSameText(FList[Idx].Name, Item.Name) then
Result := arExists
else
Result := arDuplicateID;
end
else
if IndexOf(Item.Name) > -1 then
Result := arDuplicateName
else
begin
Idx := AddNew;
FList[Idx].ID := Item.ID;
FList[Idx].Name := Item.Name;
FList[Idx].Description := Item.Description;
FList[Idx].Storage := Item.Storage;
FList[Idx].ChkTextKind := Item.ChkTextKind;
Result := arAdded;
end;
end;
function TDSARegister.Add(const ID: Integer; const Name, Description: string;
const Storage: TDSAStorage; const CheckTextKind: TDSACheckTextKind = ctkShow): TAddResult;
var
TmpItem: TDSARegItem;
begin
TmpItem.ID := ID;
TmpItem.Name := Name;
TmpItem.Description := Description;
TmpItem.Storage := Storage;
TmpItem.ChkTextKind := CheckTextKind;
Result := Add(TmpItem);
end;
procedure TDSARegister.Clear;
begin
SetLength(FList, 0);
end;
(* make Delphi 5 compiler happy // andreas
procedure TDSARegister.Delete(const Item: TDSARegItem);
var
Idx: Integer;
begin
Idx := IndexOf(Item.ID);
if (Idx > -1) and AnsiSameText(FList[Idx].Name, Item.Name) then
Remove(Idx);
end;
*)
procedure TDSARegister.Delete(const ID: Integer);
var
Idx: Integer;
begin
Idx := IndexOf(ID);
if Idx > -1 then
Remove(Idx);
end;
(* make Delphi 5 compiler happy // andreas
procedure TDSARegister.Delete(const Name: string);
var
Idx: Integer;
begin
Idx := IndexOf(Name);
if Idx > -1 then
Remove(Idx);
end;
*)
function TDSARegister.Locate(const ID: Integer): TDSARegItem;
var
Idx: Integer;
begin
Idx := IndexOf(ID);
if Idx > -1 then
Result := FList[Idx]
else
Result := EmptyItem;
end;
(* make Delphi 5 compiler happy // andreas
function TDSARegister.Locate(const Name: string): TDSARegItem;
var
Idx: Integer;
begin
Idx := IndexOf(Name);
if Idx > -1 then
Result := FList[Idx]
else
Result := EmptyItem;
end;
*)
//=== { TDSAStorage } ========================================================
constructor TDSAStorage.Create;
begin
inherited Create;
FStates := TStack.Create;
end;
destructor TDSAStorage.Destroy;
begin
FStates.Free;
inherited Create;
end;
procedure TDSAStorage.BeginCustomRead(const DSAInfo: TDSARegItem);
begin
FStates.Push(ssCustomRead);
end;
procedure TDSAStorage.BeginCustomWrite(const DSAInfo: TDSARegItem);
begin
FStates.Push(ssCustomWrite);
end;
procedure TDSAStorage.BeginRead(const DSAInfo: TDSARegItem);
begin
FStates.Push(ssRead);
end;
procedure TDSAStorage.BeginWrite(const DSAInfo: TDSARegItem);
begin
FStates.Push(ssWrite);
end;
procedure TDSAStorage.EndCustomRead(const DSAInfo: TDSARegItem);
begin
if FStates.Peek <> ssCustomRead then
raise EJvDSADialog.CreateRes(@RsECannotEndCustomReadIfNotInCustomRea);
FStates.Pop;
end;
procedure TDSAStorage.EndCustomWrite(const DSAInfo: TDSARegItem);
begin
if FStates.Peek <> ssCustomWrite then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -