home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / kolekce / d456 / DCSLIB25.ZIP / DCOutBarEdit.pas < prev    next >
Pascal/Delphi Source File  |  2001-06-26  |  18KB  |  689 lines

  1. {
  2.  BUSINESS CONSULTING
  3.  s a i n t - p e t e r s b u r g
  4.  
  5.          Components Library for Borland Delphi 4.x, 5.x
  6.          Copyright (c) 1998-2000 Alex'EM
  7.  
  8. }
  9. unit DCOutBarEdit;
  10.  
  11. interface
  12. {$I DCConst.inc}
  13.  
  14. uses
  15.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  16.   StdCtrls, ExtCtrls, Grids, DCStdCtrls, ComCtrls, DCChoice,
  17.   {$IFDEF DELPHI_V6}
  18.     DesignIntf, DesignEditors, DesignWindows,
  19.   {$ELSE}
  20.     Dsgnintf, DsgnWnds,
  21.   {$ENDIF}
  22.   DCEditButton, ActnList, DCEditTools, DCCapEdit;
  23.  
  24. type
  25.   TOutPanelEditDlg = class(TDesignWindow)
  26.     pnButtons: TPanel;
  27.     btOk: TButton;
  28.     btCancel: TButton;
  29.     btApply: TButton;
  30.     pnItems: TPanel;
  31.     pnProperties: TPanel;
  32.     pnSep_1: TPanel;
  33.     pnSep_2: TPanel;
  34.     btAdd: TButton;
  35.     btDel: TButton;
  36.     lbCaption: TLabel;
  37.     lbImageIndex: TLabel;
  38.     edImageIndex: TDCChoiceEdit;
  39.     lbEnabled: TLabel;
  40.     cbEnabled: TDCComboBox;
  41.     Actions: TActionList;
  42.     acNew: TAction;
  43.     acDelete: TAction;
  44.     acApply: TAction;
  45.     acOk: TAction;
  46.     acCancel: TAction;
  47.     tvButtons: TTreeView;
  48.     acClear: TAction;
  49.     Bevel1: TBevel;
  50.     btClear: TButton;
  51.     lbTag: TLabel;
  52.     edTag: TDCChoiceEdit;
  53.     edCaption: TDCChoiceEdit;
  54.     lbHint: TLabel;
  55.     edHint: TDCChoiceEdit;
  56.     procedure acNewExecute(Sender: TObject);
  57.     procedure acDeleteExecute(Sender: TObject);
  58.     procedure tvButtonsChanging(Sender: TObject; Node: TTreeNode;
  59.       var AllowChange: Boolean);
  60.     procedure tvButtonsKeyPress(Sender: TObject; var Key: Char);
  61.     procedure acApplyExecute(Sender: TObject);
  62.     procedure FormActivate(Sender: TObject);
  63.     procedure edCaptionChange(Sender: TObject);
  64.     procedure SaveItemValue(Node: TTreeNode);
  65.     procedure acClearExecute(Sender: TObject);
  66.     procedure acCancelExecute(Sender: TObject);
  67.     procedure acOkExecute(Sender: TObject);
  68.     procedure edCaptionButtonClick(Sender: TObject);
  69.     procedure edHintButtonClick(Sender: TObject);
  70.   private
  71.     { Private declarations }
  72.     FOutPanel: TDCCustomOutBarPanel;
  73.     FItemsInfo: TList;
  74.     FApply: boolean;
  75.     FChanged: boolean;
  76.     FInitValues: boolean;
  77.     pnOutTree: TDCHeaderPanel;
  78.     pnItemsInfo: TDCHeaderPanel;
  79.     procedure SetOutPanel(const Value: TDCCustomOutBarPanel);
  80.     procedure SaveItemsInfo;
  81.     procedure ClearItemsInfo;
  82.     procedure RestoreItemsInfo;
  83.     function  AddItem(ACaption: string; AIndex: integer;
  84.       AEnabled: boolean; ATag: integer; AHint: string): TDCEditButton;
  85.     procedure UpdateEditControls;
  86.     procedure SetAplly(const Value: boolean);
  87.     procedure InitItemsList;
  88.     function EditTextValue(Value: string): string;
  89.   protected
  90.     function UniqueName(Component: TComponent): string; override;
  91.   public
  92.     { Public declarations }
  93.     constructor Create(Component: TComponent; OutPanel: TDCCustomOutBarPanel); reintroduce;
  94.     destructor Destroy; override;
  95.     property OutPanel: TDCCustomOutBarPanel read FOutPanel write SetOutPanel;
  96.     property Apply: boolean read FApply write SetAplly;
  97.   end;
  98.  
  99.   TOutPanelProperty = class(TClassProperty)
  100.   public
  101.     procedure Edit; override;
  102.     function GetValue: string; override;
  103.     function GetAttributes: TPropertyAttributes; override;
  104.   end;
  105.  
  106.   TOutPanelEditor = class(TDefaultEditor)
  107.   protected
  108.  {$IFDEF DELPHI_V6}
  109.     procedure EditProperty(const Prop: IProperty;
  110.       var Continue: Boolean); override;
  111.  {$ELSE}
  112.     procedure EditProperty(PropertyEditor: TPropertyEditor;
  113.       var Continue, FreeEditor: Boolean); override;
  114.  {$ENDIF}
  115.   public
  116.     procedure ExecuteVerb(Index: Integer); override;
  117.     function GetVerb(Index: Integer): string; override;
  118.     function GetVerbCount: Integer; override;
  119.   end;
  120.  
  121. implementation
  122.  
  123. {$R *.DFM}
  124. type
  125.   TDCEditOutPanel = class(TDCCustomOutBarPanel)
  126.   end;
  127.  
  128. { TOutPanelProperty }
  129.  
  130. procedure TOutPanelProperty.Edit;
  131. var
  132.   OutPanelEditor: TOutPanelEditDlg;
  133.   ADCOutPanel: TDCCustomOutBarPanel;
  134. begin
  135.   ADCOutPanel :=  TDCCustomOutBarPanel(GetComponent(0));
  136.   if ADCOutPanel = nil then Exit;
  137.  
  138.   OutPanelEditor := TOutPanelEditDlg.Create(Application, ADCOutPanel);
  139.   with OutPanelEditor do
  140.   begin
  141.     try
  142.       {$IFDEF DELPHI_V6}
  143.         Designer := Self.Designer;
  144.       {$ELSE}
  145.         Designer := IFormDesigner(Self.Designer);
  146.       {$ENDIF}
  147.       Name := OutPanel.Name + '_' + GetName;
  148.       Caption := OutPanel.Name+ '.' + GetName +' Editor';
  149.       ShowModal;
  150.       Free;
  151.     except
  152.      OutPanelEditor.Free;
  153.     raise;
  154.     end;
  155.   end;
  156. end;
  157.  
  158. function TOutPanelProperty.GetAttributes: TPropertyAttributes;
  159. begin
  160.   Result := [paDialog]{ - [paSubProperties]};
  161. end;
  162.  
  163. function TOutPanelProperty.GetValue: string;
  164. begin
  165.   Result := Format('(%s)', [GetPropType^.Name]);
  166. end;
  167.  
  168.  
  169. { TOutPanelEditor }
  170.  
  171. {$IFDEF DELPHI_V6}
  172.   procedure TOutPanelEditor.EditProperty(const Prop: IProperty;
  173.     var Continue: Boolean);
  174.    var
  175.     PropName: string;
  176.   begin
  177.     PropName := Prop.GetName;
  178.     if (CompareText(PropName, 'ITEMS') = 0) then
  179.     begin
  180.       Prop.Edit;
  181.       Continue := False;
  182.     end;
  183.   end;
  184. {$ELSE}
  185.   procedure TOutPanelEditor.EditProperty(PropertyEditor: TPropertyEditor;
  186.     var Continue, FreeEditor: Boolean);
  187.    var
  188.     PropName: string;
  189.   begin
  190.     PropName := PropertyEditor.GetName;
  191.     if (CompareText(PropName, 'ITEMS') = 0) then
  192.     begin
  193.       PropertyEditor.Edit;
  194.       Continue := False;
  195.     end;
  196.   end;
  197. {$ENDIF}
  198.  
  199. procedure TOutPanelEditor.ExecuteVerb(Index: Integer);
  200.  var
  201.   APage: TDCCustomPage;
  202.   APageControl: TDCCustomPageControl;
  203. begin
  204.   if (Component is TDCCustomPageControl) then
  205.     APageControl := TDCCustomPageControl(Component)
  206.   else
  207.     APageControl := TDCCustomPage(Component).PageControl;
  208.  
  209.   case Index of
  210.     0: Edit;
  211.     1:
  212.       begin
  213.         APage := TDCOutBarPanel.Create(Designer.GetRoot);
  214.         with APage do
  215.         begin
  216.           Name    := Designer.UniqueName(ClassName);
  217.           Caption := Name;
  218.           PageControl := APageControl;
  219.           if Assigned(APageControl.Images) then ImageIndex := PageIndex;
  220.         end;
  221.       end;
  222.     2:;
  223.     3: APageControl.SelectNextPage(True);
  224.     4: APageControl.SelectNextPage(False);
  225.     6:
  226.       begin
  227.         APage := TDCPage.Create(Designer.GetRoot);
  228.         with APage do
  229.         begin
  230.           Name    := Designer.UniqueName(ClassName);
  231.           Caption := Name;
  232.           PageControl := APageControl;
  233.           if Assigned(APageControl.Images) then ImageIndex := PageIndex;
  234.         end;
  235.       end;
  236.   end;
  237.   APage := APageControl.ActivePage;
  238.   Designer.SelectComponent(APage);
  239.   Designer.Modified;
  240. end;
  241.  
  242. function TOutPanelEditor.GetVerb(Index: Integer): string;
  243. begin
  244.   case Index of
  245.    0: Result := '&Items Editor ...';
  246.    1: Result := 'Ne&w Page';
  247.    2: Result := '-';
  248.    3: Result := '&Next Page';
  249.    4: Result := '&Previous Page';
  250.    5: Result := '-';
  251.    6: Result := 'Ne&w Standard Page';
  252.   end;
  253. end;
  254.  
  255. function TOutPanelEditor.GetVerbCount: Integer;
  256. begin
  257.   Result := 7;
  258. end;
  259.  
  260. { TOutPanelEditDlg }
  261.  
  262. function TOutPanelEditDlg.AddItem(ACaption: string; AIndex: integer;
  263.   AEnabled: boolean; ATag: integer; AHint: string): TDCEditButton;
  264. begin
  265.   Result := TDCEditButton.Create(Self);
  266.   with Result do
  267.   begin
  268.     Caption    := ACaption;
  269.     Hint       := AHint;
  270.     ImageIndex := AIndex;
  271.     Enabled    := AEnabled;
  272.     Tag        := ATag;
  273.   end;
  274. end;
  275.  
  276. procedure TOutPanelEditDlg.ClearItemsInfo;
  277.  var
  278.   i: integer;
  279. begin
  280.   for i :=0 to FItemsInfo.Count-1 do
  281.   begin
  282.     TDCEditButton(FItemsInfo.Items[i]).Free;
  283.   end
  284. end;
  285.  
  286. constructor TOutPanelEditDlg.Create(Component: TComponent; OutPanel: TDCCustomOutBarPanel);
  287. begin
  288.   inherited Create(Component);
  289.   pnOutTree  := TDCHeaderPanel.Create(Self);
  290.   with pnOutTree do
  291.   begin
  292.     Parent := pnItems;
  293.     Left := 5;
  294.     Top := 5;
  295.     Width := 210;
  296.     Height := 20;
  297.     Alignment := taLeftJustify;
  298.     BorderWidth := 3;
  299.     Caption := '/im{DC_BTNMARK}/ow{4}Items';
  300.     Font.Color := clCaptionText;
  301.     TabOrder := 0;
  302.     VertCentered := True;
  303.     ButtonAllign := False;
  304.     CloseButtonExist := False;
  305.   end;
  306.  
  307.   pnItemsInfo := TDCHeaderPanel.Create(Self);
  308.   with pnItemsInfo do
  309.   begin
  310.     Parent := pnProperties;
  311.     Left := 5;
  312.     Top := 5;
  313.     Width := 164;
  314.     Height := 20;
  315.     Alignment := taLeftJustify;
  316.     BorderWidth := 3;
  317.     Caption := 'Item Property';
  318.     Font.Color := clCaptionText;
  319.     TabOrder := 0;
  320.     VertCentered := True;
  321.     ButtonAllign := False;
  322.     CloseButtonExist := False;
  323.   end;
  324.  
  325.   FItemsInfo := TList.Create;
  326.   FOutPanel  := OutPanel;
  327.   with TDCEditOutPanel(FOutPanel) do
  328.     case Style of
  329.       isSmallImages: tvButtons.Images := SmallImages;
  330.       isLargeImages: tvButtons.Images := LargeImages;
  331.     end;
  332.   SaveItemsInfo;
  333.   FInitValues := False;
  334.   FChanged    := False;
  335.   InitItemsList;
  336.   Apply := False;
  337. end;
  338.  
  339. destructor TOutPanelEditDlg.Destroy;
  340. begin
  341.   ClearItemsInfo;
  342.   FItemsInfo.Free;
  343.   pnOutTree.Free;
  344.   pnItemsInfo.Free;
  345.   inherited;
  346. end;
  347.  
  348. procedure TOutPanelEditDlg.SaveItemsInfo;
  349.  var
  350.   i :integer;
  351.   OutButton, Button: TDCEditButton;
  352. begin
  353.   with TDCEditOutPanel(FOutPanel) do
  354.   begin
  355.     for i := 0 to Items.Count-1 do
  356.     begin
  357.       OutButton := Items.Buttons[i];
  358.       with OutButton do
  359.         Button    := AddItem(Caption, Index, Enabled, Tag, Hint);
  360.       FItemsInfo.Add(Button);
  361.     end;
  362.   end;
  363. end;
  364.  
  365. procedure TOutPanelEditDlg.SetOutPanel(const Value: TDCCustomOutBarPanel);
  366. begin
  367.   FOutPanel := Value;
  368. end;
  369.  
  370. procedure TOutPanelEditDlg.acNewExecute(Sender: TObject);
  371.  var
  372.   Button: TDCEditButton;
  373.   ItemName: string;
  374.   TreeNode: TTreeNode;
  375. begin
  376.   with tvButtons do
  377.   begin
  378.     Items.BeginUpdate;
  379.     try
  380.       ItemName := Format('Item%d', [Items.Count]);
  381.       Button   := AddItem(ItemName, Items.Count, True, 0, '');
  382.       TreeNode := Items.AddObject(nil, ItemName, Button);
  383.       TreeNode.ImageIndex    := Button.ImageIndex;
  384.       TreeNode.SelectedIndex := Button.ImageIndex;
  385.       tvButtons.Selected := TreeNode;
  386.       Apply := True;
  387.     finally
  388.       Items.EndUpdate;
  389.       UpdateEditControls;
  390.       tvButtons.SetFocus;
  391.     end;
  392.   end;
  393.  
  394. end;
  395.  
  396. procedure TOutPanelEditDlg.acDeleteExecute(Sender: TObject);
  397. begin
  398.   with tvButtons do
  399.   begin
  400.     if Selected <> nil then
  401.     begin
  402.       Items.BeginUpdate;
  403.       try
  404.         TDCEditButton(Selected.Data).Free;
  405.         Selected.Data := nil;
  406.         Items.Delete(Selected);
  407.         Apply := True;
  408.       finally
  409.         Items.EndUpdate;
  410.         UpdateEditControls;
  411.         tvButtons.SetFocus;
  412.       end;
  413.     end;
  414.   end;
  415. end;
  416.  
  417. procedure TOutPanelEditDlg.tvButtonsChanging(Sender: TObject;
  418.   Node: TTreeNode; var AllowChange: Boolean);
  419. begin
  420.   FInitValues := True;
  421.   with tvButtons do
  422.   begin
  423.     SaveItemValue(Selected);
  424.     if Node<>nil then
  425.       with TDCEditButton(Node.Data) do
  426.       begin
  427.         edCaption.Text     := Caption;
  428.         edImageIndex.Text  := IntToStr(ImageIndex);
  429.         cbEnabled.ItemIndex:= Integer(Enabled);
  430.         edTag.Text         := IntToStr(Tag);
  431.         edHint.Text        := TDCEditButton(Node.Data).Hint;
  432.       end;
  433.   end;
  434.   FInitValues := False;
  435. end;
  436.  
  437. procedure TOutPanelEditDlg.tvButtonsKeyPress(Sender: TObject;
  438.   var Key: Char);
  439. begin
  440.   edCaption.SetFocus;
  441.   edCaption.SelectAll;
  442.   edCaption.Perform(WM_CHAR, Word(Key), 0);
  443.   Key := #0;
  444. end;
  445.  
  446. procedure TOutPanelEditDlg.UpdateEditControls;
  447. begin
  448.   FInitValues := True;
  449.   if tvButtons.Selected = nil then
  450.   begin
  451.     edCaption.Text       := '';
  452.     edCaption.Enabled    := False;
  453.     edImageIndex.Text    := '';
  454.     edImageIndex.Enabled := False;
  455.     cbEnabled.Text       := '';
  456.     cbEnabled.Enabled    := False;
  457.     edTag.Text           := '0';
  458.     edTag.Enabled        := False;
  459.     edHint.Text          := '';
  460.     edHint.Enabled       := False;
  461.   end
  462.   else begin
  463.     edCaption.Enabled    := True;
  464.     edImageIndex.Enabled := True;
  465.     cbEnabled.Enabled    := True;
  466.     edTag.Enabled        := True;
  467.     edHint.Enabled       := True;
  468.   end;
  469.   FInitValues := False;
  470. end;
  471.  
  472. procedure TOutPanelEditDlg.acApplyExecute(Sender: TObject);
  473.  var
  474.   TreeNode: TTreeNode;
  475.   Button: TDCEditButton;
  476. begin
  477.   OutPanel.Buttons.BeginUpdate;
  478.   SaveItemValue(tvButtons.Selected);
  479.   TDCEditOutPanel(OutPanel).Items.Clear;
  480.   TreeNode := tvButtons.Items.GetFirstNode;
  481.   while TreeNode <> nil do
  482.   begin
  483.     Button   := OutPanel.AddButton;
  484.     with Button do
  485.     begin
  486.       Caption    := TDCEditButton(TreeNode.Data).Caption;
  487.       Hint       := TDCEditButton(TreeNode.Data).Hint;
  488.       ImageIndex := TDCEditButton(TreeNode.Data).ImageIndex;
  489.       Enabled    := TDCEditButton(TreeNode.Data).Enabled;
  490.       Tag        := TDCEditButton(TreeNode.Data).Tag;
  491.     end;
  492.     TreeNode := TreeNode.GetNextSibling;
  493.   end;
  494.   OutPanel.UpdateButtonsPos;
  495.   Apply := False;
  496.   FChanged := True;
  497.   OutPanel.Buttons.EndUpdate;
  498.   {$IFDEF DELPHI_V6}
  499.      try
  500.        if Assigned(Designer) then Designer.Modified;
  501.      finally
  502.      end;
  503.     Designer.Modified;
  504.   {$ELSE}
  505.      Designer.Modified;
  506.   {$ENDIF}
  507. end;
  508.  
  509. procedure TOutPanelEditDlg.SetAplly(const Value: boolean);
  510. begin
  511.   FApply := Value;
  512.   acApply.Enabled := Value;
  513. end;
  514.  
  515. procedure TOutPanelEditDlg.InitItemsList;
  516.  var
  517.   i: integer;
  518.   Button: TDCEditButton;
  519.   TreeNode: TTreeNode;
  520. begin
  521.   with tvButtons do
  522.   begin
  523.     Items.BeginUpdate;
  524.     try
  525.       for i := 0 to TDCEditOutPanel(OutPanel).Items.Count-1 do
  526.         with TDCEditOutPanel(OutPanel).Items.Buttons[i] do
  527.         begin
  528.           Button   := AddItem(StringReplace(Caption, #10, ' ',[rfReplaceAll]),
  529.             ImageIndex, Enabled, Tag, Hint);
  530.           TreeNode := Items.AddObject(nil, Button.Caption, Button);
  531.           TreeNode.ImageIndex    := Button.ImageIndex;
  532.           TreeNode.SelectedIndex := Button.ImageIndex;
  533.         end;
  534.     finally
  535.       Items.EndUpdate;
  536.     end;
  537.   end;
  538. end;
  539.  
  540. procedure TOutPanelEditDlg.FormActivate(Sender: TObject);
  541. begin
  542.   UpdateEditControls;
  543. end;
  544.  
  545. procedure TOutPanelEditDlg.edCaptionChange(Sender: TObject);
  546. begin
  547.   if not FInitValues then Apply := True
  548. end;
  549.  
  550. procedure TOutPanelEditDlg.SaveItemValue(Node: TTreeNode);
  551. begin
  552.   if Node<>nil then
  553.     with TDCEditButton(Node.Data) do
  554.     begin
  555.       Caption    := edCaption.Text;
  556.       ImageIndex := StrToInt(edImageIndex.Text);
  557.       Enabled    := boolean(cbEnabled.ItemIndex);
  558.       Tag        := StrToInt(edTag.Text);
  559.       TDCEditButton(Node.Data).Hint := edHint.Text;
  560.       Node.ImageIndex    := ImageIndex;
  561.       Node.SelectedIndex := ImageIndex;
  562.       Node.Text          := Caption;
  563.     end;
  564. end;
  565.  
  566. procedure TOutPanelEditDlg.acClearExecute(Sender: TObject);
  567.  var
  568.   TreeNode, NextNode: TTreeNode;
  569. begin
  570.   tvButtons.Items.BeginUpdate;
  571.   try
  572.     TreeNode := tvButtons.Items.GetFirstNode;
  573.     while TreeNode <> nil do
  574.     begin
  575.       TDCEditButton(TreeNode.Data).Free;
  576.       TreeNode.Data := nil;
  577.  
  578.       NextNode := TreeNode.GetNextSibling;
  579.       tvButtons.Items.Delete(TreeNode);
  580.       TreeNode := NextNode;
  581.     end;
  582.     Apply := True;
  583.   finally
  584.     tvButtons.Items.EndUpdate;
  585.     UpdateEditControls;
  586.     tvButtons.SetFocus;
  587.   end;
  588. end;
  589.  
  590. function TOutPanelEditDlg.UniqueName(Component: TComponent): string;
  591.  var
  592.   Temp: string;
  593. begin
  594.   if (Component <> nil) then Temp := Component.ClassName;
  595.   if (UpCase(Temp[1]) = 'T') and (Length(Temp) > 1) then
  596.      System.Delete(Temp, 1, 1);
  597.   Result := Designer.UniqueName(Temp);
  598. end;
  599.  
  600. procedure TOutPanelEditDlg.acCancelExecute(Sender: TObject);
  601. begin
  602.   if FChanged then RestoreItemsInfo;
  603.   ModalResult := mrCancel;
  604. end;
  605.  
  606. procedure TOutPanelEditDlg.RestoreItemsInfo;
  607.  var
  608.   i: integer;
  609.   Button, SavButton: TDCEditButton;
  610. begin
  611.   OutPanel.Buttons.BeginUpdate;
  612.   TDCEditOutPanel(OutPanel).Items.Clear;
  613.   for i := 0 to FItemsInfo.Count-1 do
  614.   begin
  615.     Button    := OutPanel.AddButton;
  616.     SavButton := TDCEditButton(FItemsInfo.Items[i]);
  617.     with Button do
  618.     begin
  619.       Caption    := SavButton.Caption;
  620.       Hint       := SavButton.Hint;
  621.       ImageIndex := SavButton.ImageIndex;
  622.       Enabled    := SavButton.Enabled;
  623.       Tag        := SavButton.Tag;
  624.     end;
  625.   end;
  626.   OutPanel.UpdateButtonsPos;
  627.   OutPanel.Buttons.EndUpdate;
  628. end;
  629.  
  630. procedure TOutPanelEditDlg.acOkExecute(Sender: TObject);
  631. begin
  632.   if Apply then acApply.Execute;
  633.   ModalResult := mrOK;
  634. end;
  635.  
  636. procedure TOutPanelEditDlg.edCaptionButtonClick(Sender: TObject);
  637. begin
  638.   edCaption.Text := EditTextValue(edCaption.Text);
  639. end;
  640.  
  641. function TOutPanelEditDlg.EditTextValue(Value: string): string;
  642.  var
  643.   Temp: string;
  644.   Value1, Value2: string;
  645.   pValue: PChar;
  646. begin
  647.   Result := Value;
  648.  
  649.   pValue := PChar(Value);
  650.   Value1 := '';
  651.   while pValue^ <> #0 do
  652.   begin
  653.     Value1 := Value1 + pValue^;
  654.     if pValue^ = #13 then Value1 := Value1 + #10;
  655.     Inc(pValue);
  656.   end;
  657.  
  658.   with TStringEditDlg.Create(Application) do
  659.   begin
  660.     try
  661.       Caption   := 'Edit Text';
  662.       Memo.Text := Value1;
  663.       if ShowModal = mrOk then
  664.       begin
  665.         Temp  := Memo.Text;
  666.         pValue := PChar(Temp);
  667.         Value2:= '';
  668.         while pValue^ <> #0 do
  669.         begin
  670.           if pValue^ <> #10 then Value2:= Value2 + pValue^;
  671.           Inc(pValue);
  672.         end;
  673.         while (Length(Value2) > 0) and (Temp[Length(Value2)] < ' ') do
  674.           System.Delete(Value2, Length(Value2), 1);
  675.         Result := Value2;
  676.       end;
  677.     finally
  678.       Free;
  679.     end;
  680.   end;
  681. end;
  682.  
  683. procedure TOutPanelEditDlg.edHintButtonClick(Sender: TObject);
  684. begin
  685.   edHint.Text := EditTextValue(edHint.Text);
  686. end;
  687.  
  688. end.
  689.