Avatar billede akjaer Nybegynder
12. november 2002 - 18:07 Der er 9 kommentarer

Tildeling af tekst til Edit-bokse i for-lykke

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;
Avatar billede akjaer Nybegynder
12. november 2002 - 18:08 #1
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:
Avatar billede akjaer Nybegynder
12. november 2002 - 18:08 #2
Det virkede heller ikke!
Avatar billede stoney Nybegynder
12. november 2002 - 18:33 #3
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;

Stoney
Avatar billede akjaer Nybegynder
12. november 2002 - 18:44 #4
Er der en nemmere løsning???
Avatar billede akjaer Nybegynder
12. november 2002 - 19:15 #5
Det er nemlig ikke OK, at den tager alle TEdits på formen!
Avatar billede hermandsen Juniormester
12. november 2002 - 23:16 #6
Du kan oprette et statisk array af TEdit's på din form, så er det lettere at holde styr på!

Jeg har lavet noget til det i dette spørgsmål:
http://www.eksperten.dk/spm/275517

Se mit svar 26/10-2002 20:30:30...
Avatar billede akjaer Nybegynder
13. november 2002 - 18:32 #7
Vil du gøre mig den tjeneste, at forklare hvordan jeg kan integrere dette i mit lykke?
Avatar billede hermandsen Juniormester
13. november 2002 - 19:54 #8
Jaaaah, hvis jeg kunne læse spørgsmålet... Jeg er efterhånden ved at være træt af den bug!!! :(((((

Nå, men så vidt jeg husker så var det noget med at skrive Text-property'en i en masse Edits...

private
  Edits: array [1..7{hvor mange du nu ønsker}] of TEdit;

//Når du så har oprettet de edits som det var beskrevet i det andet spørgsmål, så er det let at skrive til dem!

var
  I: Integer;
begin
  for I := 1 to 7 do
    Edits[I].Text := 'Hest!';
end;
Avatar billede hermandsen Juniormester
13. november 2002 - 23:22 #9
"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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester