tvplanit: Improve usability and avoid crashes in PrintFormat element editor.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8532 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-10-10 22:53:19 +00:00
parent 7d24ff5ac1
commit 2688b61c26
2 changed files with 167 additions and 132 deletions

View File

@ -201,7 +201,7 @@ end;
procedure TfrmPrnFormat.btnDeleteElementClick(Sender: TObject);
var
Format: TVpPrintFormatItem;
Idx: Integer;
i, idx, n: Integer;
Item: string;
begin
Format := TVpPrintFormatItem(lbFormats.Items.Objects[lbFormats.ItemIndex]);
@ -210,30 +210,54 @@ begin
Item := lbElements.Items[lbElements.ItemIndex];
if Item <> '' then begin
for Idx := Pred(Format.Elements.Count) downto 0 do begin
if Format.Elements.Items[Idx].ElementName = Item then begin
Format.Elements.Items[Idx].Free;
n := Format.Elements.Count;
idx := lbElements.ItemIndex;
for i := n-1 downto 0 do begin
if Format.Elements.Items[i].ElementName = Item then begin
Format.Elements.Items[i].Free;
lbElements.Items.Delete(lbElements.ItemIndex);
IsDirty := True;
if idx = lbElements.Items.Count then
idx := lbElements.Items.Count-1;
lbElements.ItemIndex := idx;
UpdatePreview;
IsDirty := True;
Break;
end;
end;
end;
EnableElementButtons(true);
end;
procedure TfrmPrnFormat.btnDeleteFormatClick(Sender: TObject);
var
Prn: TVpPrinter;
Idx: Integer;
Idx, fmtIdx: Integer;
begin
Prn := ControlLink.Printer;
Idx := Prn.Find(lbFormats.Items[lbFormats.ItemIndex]);
if (Idx < 0) or (Idx >= Prn.PrintFormats.Count) then
Idx := lbFormats.ItemIndex;
fmtIdx := Prn.Find(lbFormats.Items[idx]);
if (fmtIdx < 0) or (fmtIdx >= Prn.PrintFormats.Count) then
begin
ShowMessage ('Invalid print format: ' + lbFormats.Items[lbFormats.ItemIndex]);
Prn.PrintFormats.Items[Idx].Free;
lbFormats.Items.Delete(lbFormats.ItemIndex);
exit;
end;
Prn.PrintFormats.Items[FmtIdx].Free;
lbElements.Items.Clear;
lbFormats.Items.Delete(idx);
IsDirty := True;
UpdatePreview;
if idx = lbFormats.Items.Count then
idx := lbFormats.Items.Count-1;
if idx >= 0 then
begin
lbFormats.ItemIndex := idx;
fmtIdx := Prn.Find(lbFormats.Items[idx]);
Prn.CurFormat := fmtIdx;
UpdatePreview;
end else
; // to do: clear preview
EnableFormatButtons(true);
EnableElementButtons(true);
end;
procedure TfrmPrnFormat.btnEditElementClick(Sender: TObject);
@ -303,8 +327,8 @@ var
i: Integer;
begin
NewFormatIdx := DoNewFormat;
if (NewFormatIdx > 0) and (Assigned (ControlLink)) and
(NewFormatIdx < ControlLink.Printer.PrintFormats.Count)
if Assigned(ControlLink) and
(NewFormatIdx > 0) and (NewFormatIdx < ControlLink.Printer.PrintFormats.Count)
then
for i := 0 to lbFormats.Items.Count - 1 do
if lbFormats.Items[i] = ControlLink.Printer.PrintFormats.Items[NewFormatIdx].FormatName then
@ -364,16 +388,15 @@ var
frmEditElement: TfrmEditElement;
begin
if lbElements.ItemIndex > -1 then begin
Application.CreateForm(TfrmEditElement, frmEditElement);
E := TVpPrintFormatElementItem(lbElements.Items.Objects[lbElements.ItemIndex]);
if frmEditElement.Execute(E) then begin
IsDirty := True;
frmEditElement := TfrmEditElement.Create(nil);
try
E := TVpPrintFormatElementItem(lbElements.Items.Objects[lbElements.ItemIndex]);
if frmEditElement.Execute(E) then
IsDirty := True;
UpdatePreview;
finally
frmEditElement.Free;
end;
frmEditElement.Free;
UpdatePreview;
end
else begin
DoNewElement;
@ -419,36 +442,39 @@ begin
Unique := False;
Application.CreateForm(TfrmEditElement, frmEditElement);
frmEditElement := TfrmEditElement.Create(nil);
try
repeat
E := TVpPrintFormatElementItem.Create(Format.Elements);
repeat
E := TVpPrintFormatElementItem.Create(Format.Elements);
// Edit element
Cancelled := not frmEditElement.Execute(E);
{ edit Element }
Cancelled := not frmEditElement.Execute(E);
if not Cancelled then begin
if lbElements.Items.IndexOf(E.ElementName) > -1 then begin
ShowMessage('An Element named ' + E.ElementName + ' already exists.' +
#13#10 + 'Please use another name.');
{ dump empty element }
if not Cancelled then begin
if lbElements.Items.IndexOf(E.ElementName) > -1 then begin
ShowMessage('An Element named ' + E.ElementName + ' already exists.' +
#13#10 + 'Please use another name.');
// Dump empty element
Format.Elements.Items[E.Index].Free;
Unique := False;
end
else begin
lbElements.Items.AddObject(E.ElementName, E);
lbElements.ItemIndex := E.Index;
IsDirty := True;
Unique := True;
UpdatePreview;
end;
end else
// Dump empty element
Format.Elements.Items[E.Index].Free;
Unique := False;
end
else begin
lbElements.Items.AddObject(E.ElementName, E);
lbElements.ItemIndex := E.Index;
IsDirty := True;
Unique := True;
UpdatePreview;
end;
end else
{ dump empty element }
Format.Elements.Items[E.Index].Free;
{ until element name is Unique or operation Cancelled }
until Unique or Cancelled;
// ...until element name is Unique or operation is cancelled
until Unique or Cancelled;
frmEditElement.Free;
EnableElementButtons(true);
finally
frmEditElement.Free;
end;
end;
procedure TfrmPrnFormat.DoNewFile;
@ -475,40 +501,44 @@ var
frmEditFormat: TfrmEditFormat;
begin
Result := -1;
Application.CreateForm(TfrmEditFormat, frmEditFormat);
frmEditFormat := TfrmEditFormat.Create(nil);
try
Prn := ControlLink.Printer;
Unique := False;
repeat
AFormat := TVpPrintFormatItem.Create(Prn.PrintFormats);
// Edit format
Cancelled := not frmEditFormat.Execute(AFormat);
Prn := ControlLink.Printer;
Unique := False;
repeat
AFormat := TVpPrintFormatItem.Create(Prn.PrintFormats);
{ edit format }
Cancelled := not frmEditFormat.Execute(AFormat);
if not Cancelled then begin
if lbFormats.Items.IndexOf(AFormat.FormatName) > -1 then begin
ShowMessage('A format named ' + AFormat.FormatName + ' already exists.' +
#13#10 + 'Please use another name.');
{ dump empty format }
if not Cancelled then begin
if lbFormats.Items.IndexOf(AFormat.FormatName) > -1 then begin
ShowMessage('A format named ' + AFormat.FormatName + ' already exists.' +
#13#10 + 'Please use another name.');
// Dump empty format
Prn.PrintFormats.Items[AFormat.Index].Free;
Unique := False;
end
else begin
lbFormats.Items.AddObject(AFormat.FormatName, AFormat);
lbFormats.ItemIndex := AFormat.Index;
UpdatePreview;
IsDirty := True;
Unique := True;
end;
end else
// Dump empty format
Prn.PrintFormats.Items[AFormat.Index].Free;
Unique := False;
end
else begin
lbFormats.Items.AddObject(AFormat.FormatName, AFormat);
lbFormats.ItemIndex := AFormat.Index;
UpdatePreview;
IsDirty := True;
Unique := True;
end;
end else
{ dump empty format }
Prn.PrintFormats.Items[AFormat.Index].Free;
{ until format name is Unique or operation Cancelled }
until Unique or Cancelled;
// ... until format name is Unique or operation cancelled
until Unique or Cancelled;
if not Cancelled then
Result := AFormat.Index;
if not Cancelled then
Result := AFormat.Index;
frmEditFormat.Free;
EnableFormatButtons(true);
EnableElementButtons(true);
finally
frmEditFormat.Free;
end;
end;
procedure TfrmPrnFormat.DoSave;
@ -527,17 +557,17 @@ end;
procedure TfrmPrnFormat.EnableElementButtons(Enable: Boolean);
begin
btnNewElement.Enabled := Enable;
btnEditElement.Enabled := Enable;
btnDeleteElement.Enabled := Enable;
btnNewElement.Enabled := Enable and (lbFormats.ItemIndex > -1);
btnEditElement.Enabled := btnNewElement.Enabled and (lbElements.ItemIndex > -1);
btnDeleteElement.Enabled := btnEditElement.Enabled;
EnableMoveButtons;
end;
procedure TfrmPrnFormat.EnableFormatButtons(Enable: Boolean);
begin
btnNewFormat.Enabled := Enable;
btnEditFormat.Enabled := Enable;
btnDeleteFormat.Enabled := Enable;
btnEditFormat.Enabled := Enable and (lbFormats.ItemIndex > -1);
btnDeleteFormat.Enabled := Enable and (lbFormats.ItemIndex > -1);
end;
function TfrmPrnFormat.Execute: Boolean;