如果您嘗試分配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;
在現實世界裏,你不會使用類幫手,但你寧願子類,但我認爲你應該明白了。
我相信你必須稱它爲你自己。 而這很奇怪,因爲TMemo和TRichEdit在你調用Lines.LoadFromFile時觸發onchange事件 – 2014-09-23 09:21:24
我沒有在這裏安裝SyncEdit。但據我記得,你用TRichEdit以同樣的方式做它: RichEdit1.Lines.LoadFromFile('unit6.pas'); if assign(RichEdit1.OnChange)then RichEdit1.OnChange(RichEdit1); – 2014-09-23 09:30:15
@JensBorrisholt:我會等待更好的解決方案 – 2014-09-23 15:17:19