Idéen med understående programtekst er: Jeg har lavet 5 edit-bokse med navnene T1, T2, T3, T4 og T5. Pointen er nu, at for-lykken først tildeler T1’s tekst et tilfældigt tal mellem 1 og 6 – dernæst skal T2’s tekst tildeles et nyt tilfældigt tal mellem 1 og 6 – derefter T3’s, T4’s og T5’s. Altså skal for-lykken udfører følgende:
procedure TForm1.SlaaClick(Sender: TObject); begin T1.text:=IntToStr(Random(5)+1); T2.text:=IntToStr(Random(5)+1); T3.text:=IntToStr(Random(5)+1); T4.text:=IntToStr(Random(5)+1); T5.text:=IntToStr(Random(5)+1); end;
Hvordan får jeg 'T'+IntToStr(i) til at fungere som navn for de forskellige Edit-bokse, så følgende virker?
procedure TForm1.SlaaClick(Sender: TObject); var i: integer; begin for i:=1 to 5 do begin 'T'+IntToStr(i).text:=IntToStr(Random(5)+1); end; end;
Der skulle havde stået: Jeg har lavet 5 edit-bokse med navnene T1, T2, T3, T4 og T5. Pointen er nu, at for-lykken først tildeler T1’s tekst et tilfældigt tal mellem 1 og 6 – dernæst skal T2’s tekst tildeles et nyt tilfældigt tal mellem 1 og 6 – derefter T3’s, T4’s og T5’s. Altså skal for-lykken udfører følgende:
Husk altid at kalde randomize inden du bruger random ellers vil den starte med samme tal altid.
Nedenstående er lidt klodset men det virker. Husk den tager alle dine Tedit på din form.
procedure TForm1.Button1Click(Sender: TObject); var i : Integer; str : string; begin randomize; for i := 0 to ComponentCount-1 do if (Components[i] is Tedit) then (Components[i] as Tedit).text := IntToStr(Random(5)+1);
for i := 0 to ComponentCount-1 do if (Components[i] is Tedit) then str := str + (Components[i] as Tedit).text; showmessage(str); end;
"I can see clearly now, the rain is gone..." Jibii!!!
Et stort skulderklap til Admin for at få fikset problemet!!! :)
Nå, men tilbage til problemet...
Først skal variablerne erklæres:
public Edits: array [1..5] of TEdit;
Så skal klasserne oprettes:
procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin Randomize; for I := 1 to 10 do begin Edits[I] := TEdit.Create(Self); Edits[I].Parent := Self; Edits[I].Top := I * 20 + 10; Edits[I].Left := 10; //Så kan du ellers selv sætte properties end; end;
Når vi er færdige med at bruge dem, må vi hellere fjerne dem fra hukommelsen igen:
procedure TForm1.FormClose(Sender: TObject); var I: Integer; begin for I := 1 to 5 do Edits[I].Free; end;
Og nu det smarte... Du ville jo gerne skrive noget i Text-property'en:
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 1 to 5 do Edits[I].Text := IntToStr(Random(5)+1); end;
Hvis du også vil opsnappe events for dine edits, så kan det gøres således:
Du opretter en ny procedure under public, private eller hvad du nu vil og giver den parameteret "Sender: TObject", hvis det nu skal være for OnChange...
Eksempel:
public procedure EditsChange(Sender: TObject);
Under FormCreate sætter du så følge linie ind i loopet efter at Edit'en er oprettet:
Edits[I].OnChange := EditsChange;
Når så OnChange bliver kaldt fra en Edit, så har vi proceduren der håndterer hvad der skal ske...
procedure TForm1.EditsChange(Sender: TObject); begin (Sender as TEdit).Text := 'Du har skrevet noget i den her Edit!'; end;
Hvis du sætter dine Edits' tag-property, så kan du måske endda bedre holde styr på dem...
Under FormCreate, i loopet, efter edit'en er oprettet skriver du:
Edits[I].Tag := I;
Så har du en tal-variabel under din edit som angiver dens nummer i dit array...
Så kunne OnChange-proceduren f.eks. se således ud:
procedure TForm1.EditsChange(Sender: TObject); begin Caption := 'Du har ændret i edit nr. ' + IntToStr((Sender as TComponent).Tag); end;
Grunden til at jeg skrive TComponent og ikke TEdit er at Tag-property'en allerede er tilført i TComponent-klassen og da TEdit nedarver fra TComponent, så kan vi lige så godt bruge den... Det skader dog ikke at skrive TEdit i stedet for, hvis du har det bedre med det! ;)
Nå, det må vist være dagens lektie for i aften...
Håber det bragte mere forståelse end forvirring!
//hermandsen
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.