2011-08-02 2 views
9

Je construis une application dans laquelle je veux afficher un bouton sur un formulaire. Je veux afficher la légende du bouton sur deux lignes. J'ai essayé d'utiliser le code suivant dans l'événement OnCreate du formulaire, mais il n'affiche pas la nouvelle ligne.Newline caractère dans la légende du bouton

Button.Caption := 'Hello' + #13#10 + 'world'; 

Toute autre méthode pour ajouter une nouvelle ligne?

+1

's/# 13 # 10/sLineBreak /' –

Répondre

8

Pour très anciennes versions Delphi qui ne sont pas la propriété WordWrap:

Utilisez le code ci-dessous avant le réglage de la légende:

SetWindowLong(Button1.Handle, GWL_STYLE, 
    GetWindowLong(Button1.Handle, GWL_STYLE) or BS_MULTILINE); 

Mais la partie la plus délicate est que ce besoin de code exécution à plusieurs reprises. Lorsque le bouton est recréé, votre paramètre multiligne est perdu. Semblable à this dilemma. Heureusement, la VCL fournit une solution, mais vous devez sous-classer le type TButton, par ex. comme suit:

type 
    TButton = class(StdCtrls.TButton) 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

    TForm1 = class(TForm) 

... 

procedure TButton.CreateParams(var Params: TCreateParams); 
begin 
    inherited CreateParams(Params); 
    Params.Style := Params.Style or BS_MULTILINE; 
end; 
+3

'TButton.CreateParams' serait un endroit plus naturel que' TButton.CreateWnd', pour votre première suggestion. Je ne suis pas sûr que votre deuxième suggestion fonctionnerait. –

+1

@David D'accord, c'est beaucoup mieux! – NGLN

2

Dans les System.pas (qui obtient automatiquement utilisé) est défini comme suit:

const sLineBreak = {$IFDEF LINUX} AnsiChar(#10) {$ENDIF} 
        {$IFDEF MSWINDOWS} AnsiString(#13#10) {$ENDIF}; 

Donc, si vous voulez faire de votre wrap Bouton, assurez-vous AutoSize est définie sur true, puis utiliser les éléments suivants button:

button.Caption: = 'Ligne un' + sLineBreak + 'Ligne deux';

+1

TButton ne dispose pas d'un propriété AutoSize. – JRL

8

Définissez WordWrap sur Vrai. C'est tout.

+0

Je ne parviens pas à trouver cette propriété dans la classe de boutons. pouvez-vous plz tel que claas contient cette propriété. Merci pour votre réponse. – naren

+0

TButton et TBitBtn ont la propriété WordWrap. – Kromster

+1

@naren: Vous n'avez pas spécifié votre version Delphi. Peut-être que Delphis n'avait pas cette propriété. –

2

D'autres vous ont dit ce que vous pouvez faire dans le code: définissez Wordwrap et utilisez SLineBreak.

Mais je suppose que vous souhaitez modifier les lignes multiples dans le concepteur. Ce n'est pas possible dans l'IDE simple. Il y a quelques outils 3ème partie qui le permettent, mais vous pouvez aussi utiliser simplement un '|' pour séparer les lignes, puis, en cours d'utilisation de code quelque chose comme

Button1.Caption := 
    StringReplace(Button1.Caption, '|', SLineBreak, [rfReplaceAll]); 

(Ceci est de la mémoire, comme je l'ai pas Delphi ici, donc s'il vous plaît utilisez la bonne syntaxe).

+0

Je me demande pourquoi cela a été downvoted.C'est ainsi que je l'ai fait dans mon propre code et cela fonctionne très bien –

0

Pour les anciennes versions de Delphi, le bouton Tspeed répond uniquement aux chaînes créées manuellement avec CRLF. TButton non régulier. C'est si vous ne voulez pas pirater la classe TButton comme suggéré dans la meilleure réponse ci-dessus.

1

En Delphi 2007, vous pouvez utiliser ceci:

SpeedButton1.Caption := 'first line' + #13 + 'second line'; 
+0

Cela fonctionne également sur Delphi 5 –