diff --git a/source/childwin.pas b/source/childwin.pas index 4f855489..57c09bce 100644 --- a/source/childwin.pas +++ b/source/childwin.pas @@ -576,7 +576,7 @@ uses Main, fieldeditor, copytable, sqlhelp, printlist, column_selection, data_sorting, runsqlfile, mysql_structures, - Registry; + Registry, memoeditor; type @@ -6035,13 +6035,10 @@ end; procedure TMDIChild.DataGridCreateEditor(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink); -var - Editor: TMemoEditor; begin - if FDataGridResult.Columns[Column].IsMemo then begin - Editor := TMemoEditor.Create; - EditLink := Editor; - end else + if FDataGridResult.Columns[Column].IsMemo then + EditLink := TMemoEditorLink.Create + else EditLink := TStringEditLink.Create; end; diff --git a/source/main.pas b/source/main.pas index 1bf71bc7..8f5ab86f 100644 --- a/source/main.pas +++ b/source/main.pas @@ -18,7 +18,7 @@ uses SynMemo, synedit, SynEditTypes, ZDataSet, ZSqlProcessor, HeidiComp, sqlhelp, MysqlQueryThread, Childwin, VirtualTrees, DateUtils, PngImageList, OptimizeTables, View, Usermanager, - SelectDBObject, TntStdCtrls, memoeditor; + SelectDBObject; type TMainForm = class(TForm) @@ -334,31 +334,6 @@ type end; - TMemoEditor = class(TInterfacedObject, IVTEditLink) - private - FForm: TfrmMemoEditor; - FTree: TCustomVirtualStringTree; // A back reference to the tree calling. - FNode: PVirtualNode; // The node to be edited. - FColumn: TColumnIndex; // The column of the node. - FTextBounds: TRect; // Smallest rectangle around the text. - FStopping: Boolean; // Set to True when the edit link requests stopping the edit action. - public - FieldType: Integer; - MaxInputLength: Integer; - - constructor Create; - destructor Destroy; override; - - function BeginEdit: Boolean; virtual; stdcall; - function CancelEdit: Boolean; virtual; stdcall; - function EndEdit: Boolean; virtual; stdcall; - function GetBounds: TRect; virtual; stdcall; - function PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; virtual; stdcall; - procedure ProcessMessage(var Message: TMessage); virtual; stdcall; - procedure SetBounds(R: TRect); virtual; stdcall; - end; - - var MainForm : TMainForm; appstarted : Boolean = false; // see connections.pas @@ -2153,96 +2128,4 @@ begin end; -constructor TMemoEditor.Create; -begin - inherited; -end; - -destructor TMemoEditor.Destroy; -begin - inherited; - FForm.Free; -end; - - -function TMemoEditor.PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; stdcall; -// Retrieves the true text bounds from the owner tree. -var - Text: WideString; - F: TFont; -begin - Result := Tree is TCustomVirtualStringTree; - if not Result then - exit; - - FTree := Tree as TVirtualStringTree; - FNode := Node; - FColumn := Column; - - // Initial size, font and text of the node. - F := TFont.Create; - FTree.GetTextInfo(Node, Column, F, FTextBounds, Text); - - // Create the editor form - FForm := TfrmMemoEditor.Create(Ftree); - FForm.Parent := Tree; - FForm.memoText.Font := F; - FForm.memoText.Text := Text; -end; - - -function TMemoEditor.BeginEdit: Boolean; stdcall; -begin - Result := not FStopping; - if Result then - FForm.Show; -end; - - -function TMemoEditor.CancelEdit: Boolean; stdcall; -begin - Result := not FStopping; - if Result then begin - FStopping := True; - FForm.Hide; - FTree.CancelEditNode; - end; -end; - - -function TMemoEditor.EndEdit: Boolean; stdcall; -begin - Result := not FStopping; - if Result then try - FStopping := True; - if FForm.memoText.Text <> FTree.Text[FNode, FColumn] then - FTree.Text[FNode, FColumn] := FForm.memoText.Text; - FForm.Hide; - except - FStopping := False; - raise; - end; -end; - - -function TMemoEditor.GetBounds: TRect; stdcall; -begin - Result := FForm.BoundsRect; -end; - - -procedure TMemoEditor.ProcessMessage(var Message: TMessage); stdcall; -begin -end; - - -procedure TMemoEditor.SetBounds(R: TRect); stdcall; -begin - // Sets the top left corner of the edit control - if not FStopping then - FForm.TopLeft := R.TopLeft; -end; - - - end. diff --git a/source/memoeditor.pas b/source/memoeditor.pas index aca99030..ffd62f06 100644 --- a/source/memoeditor.pas +++ b/source/memoeditor.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, TntStdCtrls, Registry; + Dialogs, StdCtrls, TntStdCtrls, Registry, VirtualTrees; {$I const.inc} @@ -21,6 +21,31 @@ type end; + // The editor link, instanciated by VirtualTree.CreateEditor + TMemoEditorLink = class(TInterfacedObject, IVTEditLink) + private + FForm: TfrmMemoEditor; + FTree: TCustomVirtualStringTree; // A back reference to the tree calling. + FNode: PVirtualNode; // The node to be edited. + FColumn: TColumnIndex; // The column of the node. + FTextBounds: TRect; // Smallest rectangle around the text. + FStopping: Boolean; // Set to True when the edit link requests stopping the edit action. + public + FieldType: Integer; + MaxInputLength: Integer; + constructor Create; + destructor Destroy; override; + function BeginEdit: Boolean; virtual; stdcall; + function CancelEdit: Boolean; virtual; stdcall; + function EndEdit: Boolean; virtual; stdcall; + function GetBounds: TRect; virtual; stdcall; + function PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; virtual; stdcall; + procedure ProcessMessage(var Message: TMessage); virtual; stdcall; + procedure SetBounds(R: TRect); virtual; stdcall; + end; + + + implementation uses main, helpers; @@ -58,4 +83,96 @@ begin memoText.SetFocus; end; + +constructor TMemoEditorLink.Create; +begin + inherited; +end; + +destructor TMemoEditorLink.Destroy; +begin + inherited; + FForm.Free; +end; + + +function TMemoEditorLink.PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; stdcall; +// Retrieves the true text bounds from the owner tree. +var + Text: WideString; + F: TFont; +begin + Result := Tree is TCustomVirtualStringTree; + if not Result then + exit; + + FTree := Tree as TVirtualStringTree; + FNode := Node; + FColumn := Column; + + // Initial size, font and text of the node. + F := TFont.Create; + FTree.GetTextInfo(Node, Column, F, FTextBounds, Text); + + // Create the editor form + FForm := TfrmMemoEditor.Create(Ftree); + FForm.Parent := Tree; + FForm.memoText.Font := F; + FForm.memoText.Text := Text; +end; + + +function TMemoEditorLink.BeginEdit: Boolean; stdcall; +begin + Result := not FStopping; + if Result then + FForm.Show; +end; + + +function TMemoEditorLink.CancelEdit: Boolean; stdcall; +begin + Result := not FStopping; + if Result then begin + FStopping := True; + FForm.Hide; + FTree.CancelEditNode; + end; +end; + + +function TMemoEditorLink.EndEdit: Boolean; stdcall; +begin + Result := not FStopping; + if Result then try + FStopping := True; + if FForm.memoText.Text <> FTree.Text[FNode, FColumn] then + FTree.Text[FNode, FColumn] := FForm.memoText.Text; + FForm.Hide; + except + FStopping := False; + raise; + end; +end; + + +function TMemoEditorLink.GetBounds: TRect; stdcall; +begin + Result := FForm.BoundsRect; +end; + + +procedure TMemoEditorLink.ProcessMessage(var Message: TMessage); stdcall; +begin +end; + + +procedure TMemoEditorLink.SetBounds(R: TRect); stdcall; +begin + // Sets the top left corner of the edit control + if not FStopping then + FForm.TopLeft := R.TopLeft; +end; + + end.