procedure TMyForm.c(iNumero : integer; sValeur : string); begin if FindComponent('Label'+ IntToStr(iNumero)) <> nil then TLabel(FindComponent('Label'+ IntToStr(iNumero))).Caption := sValeur; end;
procedure setCaption(label: TLabel; const caption: string); begin label.Caption := caption; end; .... .... procedure TForm1.toto; begin // ALabel est un TLabel // Edit1 est un TEdit setCaption(ALabel, Edit1.Text); end;
procedure setCaptions(aControls: array of TControl; aCaptions: array of string; const aRefresh: boolean= false); var X,LC,LS: integer; begin LC := Length(aControls); LS := Length(aCaptions); for X := 0 to LC-1 do aControls[X].SetTextBuf(PChar(aCaptions[X mod LS])); if aRefresh then Application.processMessages; end; { exemples : } setCaptions([lbl1], ['A']); // lbl1 = "A" setCaptions([lbl1, btn1], ['A','B']); // lbl1 = A, btn1 = "B" setCaptions([lbl1, btn1, pnl2], ['-']); // lbl1 = btn1 = pnl2 = "-" setCaptions([lbl1, lbl2, lbl3, lbl4], ['+','-']); // lbl1 = lbl3 = "+", lbl2 = lbl4 = "-" // Et en mode LoL procedure setCaptionsFmt(aControls: array of TControl; aFormats: array of string; aConsts: array of array of const; const aRefresh: boolean= false); begin var X,LCtl,LFmt,LCnt: integer; begin LCtl := Length(aControls); LSFmt := Length(aFormats); LCnt := Length(aConsts); for X := 0 to LCtl-1 do aControls[X].SetTextBuf(PChar(format(aFormats[X mod LFmt],aConsts[X mod LCnt))); if aRefresh then Application.processMessages; end; {exemples :} setCaptionsFmt( [lbl1, lbl2], // controls ['Progression %d sur %d', 'Total %.2f%%'], // descripteurs de formats [ [PgBar1.Position,PgBar1.Max], [PgBar1.Position/PbBar1.Max*100] ] ); // lbl1 = "Progression 27 sur 524" // lbl2 = "Total 5.15%"
PROCEDURE Tform1.SetCaption(C:TControl; S:String{; Const ARefresh: Boolean= False}); Begin C.SetTextBuf(PChar(S)); //IF ARefresh THEN // Application.ProcessMessages; End;
Je découvre qu'il n'est pas forcé que tous les arguments annoncés dans la procédure soient présents dans l'appel de cette procédure-> Si tu mets une valeur par défaut à un paramètre de ta fonction, le paramètre est en effet facultatif
Évidemment pour une constante dont on donne la valeur, ça parait normal.-> Non, c'est juste que tu ne peux pas modifier ça valeur dans le corps de ta fonction, le mot "const" ajouté devant un paramètre sert à ça.
Mais je ne comprends pas pourquoi il y a un Application.ProcessMessages. D'autant plus qu'il n'est jamais activé puisque ARefresh est fixé à false.-> Application.ProcessMessages permet de "dépiler" tous les messages windows en attente de traitement avant de continuer ton programme. Dans le cas présent, ça permet de rafraichir le caption de ton label. Si on reprend cette procedure :
PROCEDURE Tform1.SetCaption(C:TControl; S:String; Const ARefresh: Boolean= False); Begin C.SetTextBuf(PChar(S)); IF ARefresh THEN Application.ProcessMessages; End;
PROCEDURE Tform1.SetCaption(C:TControl; S:String; Const ARefresh: Boolean= False); Begin C.SetTextBuf(PChar(S)); ARefresh := True; // Là, tu dois avoir des problèmes... IF ARefresh THEN Application.ProcessMessages; End;
modifier ça valeur
TControl.Update;