2013-03-16 5 views
8

Ho un modulo in un'applicazione scritta utilizzando FireMonkey. Su quel modulo (modale) c'è un pulsante OK per il quale ho impostato la proprietà Default su True. C'è anche un componente memo. Ora se il tipo digita premi invio mentre scrivi il memo, il modulo viene chiuso invece di inserire un'interruzione di riga nel memo.Interruzioni di riga in TMemo su un modulo con il pulsante predefinito

Quello che mi piacerebbe realizzare, è che quando si preme (o si sposta + si inserisce o smth in quel modo) nel componente memo, si inserisce l'interruzione di riga. In altri componenti, in cui non è possibile digitare interruzioni di riga, mi piacerebbe comunque premere Invio per chiudere il modulo. Il migliore che ho trovato finora è l'aggiunta di codice riportato di seguito in azione forme OnCloseQuery:

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; 

Questo funziona, ma c'è ora c'è un piccolo ritardo fastidioso dopo aver colpito entrare e prima che appaia l'interruzione di riga. Inoltre vorrei una soluzione, che sarebbe meno hacky.

Devo anche sottolineare che ho anche dei moduli che contengono il pulsante OK, ma non il componente memo, tuttavia un memo verrà spostato in quel form in fase di runtime cambiando la sua proprietà genitore.

+1

tentare la memo 'Memo.Lines.BeginUpdate;' prima di cambiare il contenuto Memo e 'Memo.Lines.EndUpdate;' dopo. – Abelisto

+3

Emba ha mancato di implementare TMemo WantReturns, proprietà WantTabs: o (Vorrei utilizzare un evento OnIdle nel modulo per verificare se c'è un TMemo focalizzato per impostare la proprietà Default. Ma Emba non ha TApplicationEvent per FMX: o (Solo TActionList ha Evento OnUpdate che ha generato l'inattività se almeno un'azione è stata definita e assegnata a un controllo –

+1

Nel tuo evento predefinito 'OnClick', verifica se il memo è a fuoco e imposta 'ModalResult' su mrNone se questo è il caso. –

risposta

2

Impostare btnOk.Default-False in di OnEnter, e di nuovo a True nel memo del OnExit

+0

Non è sempre così facile. Ho moduli in cui memo si trova su un altro modulo incorporato nel modulo con il pulsante OK (come in http://stackoverflow.com/a/9048640/721309). Quindi a volte memo non ha modo di sapere se c'è un pulsante. –

+1

In tal caso, potresti creare un discendente di 'TMemo' che cerca nei controlli dei suoi genitori un pulsante con' Default' impostato su 'True', e impostalo su' False' nel metodo 'CMEnter()', e torna a 'Vero' in' CMExit() ' –