2013-03-16 4 views
8

Ich habe ein Formular in einer Anwendung geschrieben mit FireMonkey. Auf dieser (modalen) Form gibt es einen OK-Button, für den ich die Default-Eigenschaft auf True gesetzt habe. Es gibt auch eine Memo-Komponente. Wenn Sie nun beim Eingeben des Memos die Eingabetaste drücken, wird das Formular geschlossen, anstatt den Zeilenumbruch in das Memo einzufügen.Zeilenumbrüche in TMemo in einem Formular mit Standardschaltfläche

Was ich erreichen möchte, ist, dass, wenn eingegeben (oder shift + enter oder smth wie) in Memo-Komponente gedrückt wird, dann Zeilenumbruch eingegeben wird. In anderen Komponenten, in denen Sie keine Zeilenumbrüche eingeben können, möchte ich trotzdem die Eingabetaste drücken, um das Formular zu schließen. Das Beste, was ich bisher gefunden füge folgenden Code in Formen OnCloseQuery Aktion:

if (Focused.GetObject.ClassName = 'TMemo') and (ModalResult = mrOk) then 
begin 
    CanClose := False; 
    Memo := TMemo(Focused.GetObject); 
    Memo.InsertAfter(Memo.CaretPosition, sLineBreak, [TInsertOption.ioMoveCaret, 
    TInsertOption.ioCanUndo]); 
end 
else 
    CanClose := True; 

Dies funktioniert, aber es jetzt ist es eine kleine ärgerliche Verzögerung nach dem Zeilenumbruch erscheint eingeben und bevor man. Auch hätte ich gerne Lösung, das wäre weniger hacky.

Ich sollte auch darauf hinweisen, dass ich auch Formulare habe, die die Schaltfläche OK enthalten, aber nicht die Memo-Komponente, jedoch wird ein Memo zur Laufzeit durch Ändern seiner übergeordneten Eigenschaft in dieses Formular verschoben.

+1

Try 'Memo.Lines.BeginUpdate Memo;' vor Memo Inhalt zu ändern und 'Memo.Lines.EndUpdate;' danach. – Abelisto

+3

Emba versäumt, TMemo WantReturns, WantTabs-Eigenschaften zu implementieren: o (Ich würde ein OnIdle-Ereignis im Formular verwenden, um zu überprüfen, ob ein fokussiertes TMemo die Default-Eigenschaft festlegt. Aber Emba hat auch kein TApplicationEvent für FMX: o (Nur TActionList hat OnUpdate Ereignis, das im Leerlauf ausgelöst wurde, wenn mindestens eine Aktion definiert und einem Steuerelement zugewiesen wurde –

+1

In der Standardschaltfläche 'OnClick' testen Sie, ob das Memo fokussiert ist, und setzen Sie' ModalResult' auf mrNone, falls dies der Fall ist. –

Antwort

2

btnOk.Default-False In Ihrem OnEnter Memo und zurück zu True in dem OnExit

+0

Es ist nicht immer so einfach. Ich habe Formulare, wo Memo auf einem anderen Formular ist, das in Form mit der Schaltfläche OK eingebettet ist (wie in http://stackoverflow.com/a/9048640/721309). Daher kann Memo manchmal nicht wissen, ob es einen Knopf gibt. –

+1

In diesem Fall könnten Sie einen Nachkomme von 'TMemo' erstellen, der durch die Steuerelemente des übergeordneten Elements nach einer Schaltfläche sucht, bei der' Default' auf 'True' gesetzt ist und in der 'CMEnter()' Methode auf 'False' gesetzt wird Zurück zu 'True' in' CMExit() ' –