Oppure

Loading
23/04/11 17:51
rep87
Buonasera ragazzi...
Io ho un programma con varie label nello stesso form..

MI è nata una domanda: è possibile creare un numero x di label in automatico?

Esempio: nell'edit 1 del form 1 l'utente inserisce il numero di label da creare nel form 2.
Come fare per ottenere questo scopo?!
Io pensavo ad un array dinamico, il cui limite era il numero ottenuto in input...ma poi come fare?!
E' giusta come idea, o sono totalmente fuori strada?

Grazie dell'aiuto...e BUONA PASQUA A TUTTI! =)...
aaa
23/04/11 18:41
a_butta
var
  LabelArray: array of TLabel;

procedure LabelCreateClick(Sender: TObject);
begin
  SetLength(LabelArray, StrToInt(TextBox1.Text));
  for I:= 0 to High(LabelArray) do
    begin
      LabelArray[I]:= TLabel.Create(Self);
      LabelArray[I].Parent:= Self;
      LabelArray[I].Top:= Top;
      // Qui inserisci tutti i parametri di ogni label
      LabelArray[I].Visible:= True;
   end;
end;


Buona Pasqua anche a te
aaa
26/04/11 7:17
Goblin
rep87, a_butta ti ha dato, diciamo, le linee guida e tutte le informazioni per creare quello che chiedi, ovviamente non ti ha dato la pappa pronta, come è giusto che sia, Chi mastica almeno un po' di pascal, (delphi deriva dall OP 7.0 di borland) vede subito che alcune informazioni mancano e devono essere rimpiazzate "ad hoc" dal programmatore a cui serve il pezzo di codice, queste informazioni devono essere inserite proprio dove c'e' il commento "// Qui inserisci tutti i parametri di ogni label", le info che mancano sono una variabile per gestire la left della label, una variabile per gestire il top del componente label, il font, e altre cosine. Dunque la funzione è da considerarsi "meta codice" una linea guida dove tu andrai ad imbastire il tuo codice di creazione label.
Giusto per rispondere alla tua domanda che vedi solo l'ultima, ... mi sembra ovvio se non aumenti il top e il left della label verranno create tutte nello stesso punto.
G.
Ibis redibis non morieris in bello
26/04/11 21:53
Goblin
ho riletto il tuo post iniziale, le label che crei le devi riutilizzare? oppure sono label che fanno "da contorno"?
nel primo caso invece di un array ti consiglio l'uso dell'oggetto TComponentList, contenuto nella unit Contnrs, , nel secondo caso è inutile creare un lista, basta assegnare l'owner in fase di creazione e alla distruzione ci pensa lui. In ogni caso centralizzerei la creazione della label in un solo punto estraendola dal loop per posizionarla, qualcosa del tipo:

procedure TForm1.LabelClick(Sender: TObject);
begin
ShowMessage('Click su label '+ (sender as TLabel).Caption+ ' con nome '+(sender as TLabel).Name);
end;

function TForm1.CreaLabelXY(oForm: TForm; oParent: TWinControl; nLeft, nTop: Integer; sCaption: String): TLabel;
function GetNomeLabel: String;
Var x: Integer;
begin
x:=0;
Repeat
Result := 'Label'+IntToStr(x);
Inc(x);
until Not Assigned(oForm.FindComponent(Result));
end;
begin
Result := TLabel.Create(oForm);
Result.Parent := oParent;
Result.Top := nTop;
Result.Left := nLeft;
Result.Caption := sCaption;
Result.OnClick := LabelClick;
Result.Name := GetNomeLabel;
end;

e il loop di creazione

procedure TForm1.Button1Click(Sender: TObject);
Var x,y: Integer;
a: Integer;
begin
x := 10;
y := 10;
For a:= 1 to StrToInt(Edit1.Text) do
Begin
CreaLabelXY(Self, Self, x,y, IntToStr(a));
Inc(y,18);
end;
end;

la function CreaLabelXY ritorna un oggetto di tipo TLabel in modo da poterlo inserire dentro una lista oppure crearlo senza includerlo in un riferimento.
la function GetNomeLabel ritorna un nome univoco per la label
la procedura LabelClick assegna l'evento onclick alla label.
Il tutto è da considerarsi come esempio e deve essere inserito nel tuo contesto
G.
Ultima modifica effettuata da Goblin 26/04/11 22:26
Ibis redibis non morieris in bello