From 7d168f5526632cd76a4060b8c08bfda7909cf9bd Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Thu, 7 Aug 2008 22:39:22 +0000 Subject: [PATCH] Now the memo editor has its own unit to live in the editor link should also live there. Moves relevant code from main and rename the object to TMemoEditorLink to be more clear. --- source/childwin.pas | 11 ++-- source/main.pas | 119 +----------------------------------------- source/memoeditor.pas | 119 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 123 insertions(+), 126 deletions(-) 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.