2014-09-23 27 views
1

我有一個使用TSynEdit的項目。我發現當我撥打SynEdit1.Lines.LoadFromFile()時,事件OnChange未被解僱。當我調用TSynEdit.Lines的方法LoadFromFile時不會觸發事件OnChange

例如:

unit Unit1; 

{$mode objfpc}{$H+} 

interface 

uses 
    Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs, 
    StdCtrls; 

type 

    { TForm1 } 

    TForm1 = class(TForm) 
    Button1: TButton; 
    SynEdit1: TSynEdit; 
    procedure Button1Click(Sender: TObject); 
    procedure SynEdit1Change(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.lfm} 

{ TForm1 } 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    SynEdit1.Lines.LoadFromFile('unit1.pas'); 
end; 

procedure TForm1.SynEdit1Change(Sender: TObject); 
begin 
    Caption:=Caption + '!'; 
end; 

end. 

在上面的例子中,我創建具有一個按鈕和一個SynEdit的形式。

SynEdit1.Lines.LoadFromFile()被調用時,我怎樣才能使事件OnChange被解僱?

+0

我相信你必須稱它爲你自己。 而這很奇怪,因爲TMemo和TRichEdit在你調用Lines.LoadFromFile時觸發onchange事件 – 2014-09-23 09:21:24

+0

我沒有在這裏安裝SyncEdit。但據我記得,你用TRichEdit以同樣的方式做它: RichEdit1.Lines.LoadFromFile('unit6.pas'); if assign(RichEdit1.OnChange)then RichEdit1.OnChange(RichEdit1); – 2014-09-23 09:30:15

+0

@JensBorrisholt:我會等待更好的解決方案 – 2014-09-23 15:17:19

回答

1

如果您嘗試分配synedit的所有事件處理程序,您可以獲得的最好方式是編輯器被清除時的通知。例如,如果你測試下面的代碼的形式,標題將按鈕點擊事件之後被設置爲「清除」:

uses 
    Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs, 
    StdCtrls, LazSynEditText; 

type 
    TSynEditEx = class helper for TSynEdit 
    function getTextBuffer: TSynEditStrings; 
    end; 

    TForm1 = class(TForm) 
    Button1: TButton; 
    SynEdit1: TSynEdit; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    procedure textCleared(sender: TObject); 
    procedure textHistoryModified(sender: TObject); 
    procedure textBuffChanged(sender: TObject); 
    procedure textLineChanged(sender: TObject); 
    procedure textEditAction(sender: TObject); 
    procedure textModdChanged(sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 
{$R *.lfm} 

function TSynEditEx.getTextBuffer: TSynEditStrings; 
begin 
    exit(TextBuffer); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    SynEdit1.getTextBuffer.AddNotifyHandler(senrCleared, @textCleared); 
    SynEdit1.getTextBuffer.AddNotifyHandler(senrUndoRedoAdded, @textHistoryModified); 
    SynEdit1.getTextBuffer.AddNotifyHandler(senrTextBufferChanged, @textBuffChanged); 
    SynEdit1.getTextBuffer.AddNotifyHandler(senrLineChange, @textLineChanged); 
    SynEdit1.getTextBuffer.AddNotifyHandler(senrModifiedChanged, @textModdChanged); 
end; 

procedure TForm1.textModdChanged(sender: TObject); 
begin 
    Caption := Caption + ' ModdChanged'; 
end; 

procedure TForm1.textEditAction(sender: TObject); 
begin 
    Caption := Caption + ' EditAction'; 
end; 

procedure TForm1.textLineChanged(sender: TObject); 
begin 
    Caption := Caption + ' LineChanged'; 
end; 

procedure TForm1.textBuffChanged(sender: TObject); 
begin 
    Caption := Caption + ' BuffChanged'; 
end; 

procedure TForm1.textCleared(sender: TObject); 
begin 
    Caption := Caption + ' Cleared'; 
end; 

procedure TForm1.textHistoryModified(sender: TObject); 
begin 
    Caption := Caption + ' HistoryModified'; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    SynEdit1.Lines.LoadFromFile('unit1.pas'); 
end; 

因此,唯一的解決辦法是繼承TSynEdit並推出定製LoadFromFile方法,然後觸發onChange事件在裏面。據我所知,基於短的調查,這是唯一的辦法,有點像這樣:

uses 
    Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs, 
    StdCtrls, LazSynEditText; 

type 
    TSynEditEx = class helper for TSynEdit 
    procedure LoadFromFile(const aFilename: string); 
    end; 

    TForm1 = class(TForm) 
    Button1: TButton; 
    SynEdit1: TSynEdit; 
    procedure Button1Click(Sender: TObject); 
    procedure SynEdit1Change(Sender: TObject); 
    private 
    end; 

var 
    Form1: TForm1; 

implementation 
{$R *.lfm} 

procedure TSynEditEx.LoadFromFile(const aFilename: string); 
begin 
    Lines.LoadFromFile('unit1.pas'); 
    if assigned(onChange) then 
    onChange(self); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    SynEdit1.LoadFromFile('unit1.pas'); 
end; 

procedure TForm1.SynEdit1Change(Sender: TObject); 
begin 
    caption := caption + '!'; 
end; 

在現實世界裏,你不會使用類幫手,但你寧願子類,但我認爲你應該明白了。

+0

這是一個非常短暫而有效的解決方案。謝謝。 – 2014-09-25 03:02:25

相關問題