Avatar billede wolker Nybegynder
26. marts 2002 - 22:53 Der er 4 kommentarer og
1 løsning

Mange checkbokse

Hej
Der må være en her der hurtig kan svare mig på hvordan jeg gør når jeg nu har 16 checkbokse, som jeg gerne vil sætte til true eller false via en løkke ala.

for i := 1 to 16 do
  checkboks[i] := Get_resultat(i);

hvor Get_resultat(i) er en funktion der returnerer true eller false afhængig af en beregning.
Get_resultat(i) er lavet, så spørgsmålet går kun på hvordan jeg sætte de 16 checkbokse uden at jeg skal til at bruge case ell. lign.
Avatar billede speedy Nybegynder
26. marts 2002 - 23:15 #1
Det jeg ville gøre var at oprette checkboxene i formens onCreate. sådan her:

Først lav en global variabel som denne:

CB: array[1..16] of TCheckBox;

i formens onCreate skriver du dette:

var
  i: integer;
begin
  for i := 1 to 16 do
    begin
      CB[i] := TCheckBox.Create(Self);
      CB[i].Left := 10;
      CB[i].Top := 20*i;
      CB[i].Caption := 'Checkbox' + inttostr(i);
      Form1.InsertControl(CB[i]);
    end;
end;


Så kan du derefter køre din løkke som du selv har skrevet den.

for i := 1 to 16 do
  CB[i] := Get_resultat(i);


/SpEeDy
Avatar billede wolker Nybegynder
26. marts 2002 - 23:44 #2
>>speedy
Det må da kunne lade sig gøre, uden at jeg skal til at oprette checkboksene programatisk. Da det vil være noget bøvlet for mig at gøre eftersom at de ikke er placeret i en række, og formen er også færdig lavet.
Og det vil også være hurtigere at lave en case struktur i stedet for, men umiddelbart synes jeg bare at det er en ulogisk måde at gøre det på.
Avatar billede speedy Nybegynder
27. marts 2002 - 00:23 #3
Okay, så kan du gøre sådan her:

Gå ind og ændr alle checkboxenes tag property til det nummer som de har, og så kan du bruge dette når du vil "udfylde" dem.

procedure fill;
var
  i: integer;
begin
  for i := 0 to Pred(form1.ComponentCount) do
    begin
      if Form1.Components[i] is TCheckBox then
        (Form1.Components[i] as TCheckBox).Checked := Get_resultat((Form1.Components[i] as TCheckBox).Tag);
    end;
end;


/SpEeDy
Avatar billede wolker Nybegynder
27. marts 2002 - 01:38 #4
Det var ikke helt det jeg ledte efter, så jeg løste det selv på en mere smart måde, synes jeg da selv :-)

Men du ledte mig på sporet og du gad at svare på spørgsmålet, så du får pointene.

Min løsning ser ca. sådan her ud:
var
const get_resultat :array of string = ('AA','CB','LP','CF','VK',..........);
const p3 :string = 'AALPCF';
cb: array[1..16] of TCheckBox;

procedure init_checkboks_array;
begin
  cb[1] := checkboks1;  cb[2] := checkboks2;
  cb[3] := checkboks3;  cb[4] := checkboks4;
  o.s.v......
end;

procedure set_checkboks;
begin
  for i := 1 to 16 do
    cb[i].Checked := (pos(Get_resultat[i],p3)<>0);
end;

På den her måde synes jeg det er mere smart, for så kan jeg gå direkte ind og aflæse en checkboks ved at sige

if cb[7].checked then
  do something
else
  showmessage(cb[7].caption + ' er ikke indstalleret');
Avatar billede speedy Nybegynder
27. marts 2002 - 07:49 #5
Jamen okay og tak for point!

Det var godt du selv kunne finde ud af noget ud fra min ide. Det er jo også lidt svært helt præcist at vide hvordan dem man hjælpers kode er opbygget så man kan hjælpe på den bedst mulige måde :)

/SpEeDy
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