Avatar billede circadian Nybegynder
13. januar 2010 - 22:35 Der er 8 kommentarer og
1 løsning

Arrays og properties

Hej,

Jeg skal til at udføre forskellige handlinger med disse elementer:

Unit12.Form12.Person01
Unit12.Form12.Person02
Unit12.Form12.Person03
..
Unit12.Form12.Person20

Altså 20 stk i alt.

Det er forresten Edit felter, men det er vel ikke af betydning?


Da jeg er relativt ny i Delphi har jeg endnu ikke forstået arrays helt, selvom jeg har læst om det på nettet. Altså jeg ved godt hvad et array er, men forstår ikke hvordan man bruger dem i Delphi endnu.

Hvis nu vi siger at jeg vil clear'e de 20 Edit felter, så havde jeg tænkt mig at gøre således:

for i := 01 to 20 do
begin
  Unit12.Form12.Person[i].Clear;
end;

Virker bare ikke.

Hvad gør jeg galt?
Avatar billede kgkg Nybegynder
13. januar 2010 - 23:34 #1
Dine edit felter er jo seperate objekter, de er ikke i et Array, så du kan ikke referere til dem med Person[I].

Hvad er det du vil? Vil du slette teksten fra x antal edit felter?
Avatar billede circadian Nybegynder
13. januar 2010 - 23:37 #2
#1
Jeg vil i dette tilfælde slette teksten fra felterne Person01 til og med Person20.

Men som sagt skal jeg gøre alle mulige ting ved disse felter, så det vil være rart ikke at skulle skrive dem alle hele tiden.
Avatar billede kgkg Nybegynder
14. januar 2010 - 00:17 #3
OK, her er et forslag.

Først og fremmest, skal du navngive de edit felter som skal gennemløbes på en ens måde.

Nu kalder du du dine edit felter for PersonXX. Det der er ens for dine edit felter er at de første 6 tegn er: Person og det kan du bruge til at udvælge dine felter når du skal gøre et eller andet ved dem.

Her er et eksempel, hvor SpeedButton5Click kaldes når der trykkes på en knap.

Proceduren løber alle komponenter i formen igennem, og hvis det er af typen TEDIT og de første 6 tegn af navnet på edit feltet er PERSON, så gøres der et eller andet ved edit feltet.

procedure TForm12.SpeedButton5Click(Sender: TObject);
var
  C: TEdit;
  I: Integer;
begin
  for I := 0 to Form12.ComponentCount - 1 do
  begin
    if (Form12.Components[I] is TEdit) AND (UpperCase(Copy(Form2.Components[I].Name, 0, 6)) = 'PERSON') then
    begin
      C := TEdit(Form12.Components[I]);
      C.Clear;
    end;
  end;
end;

Du kan jo se om det er noget du kan bruge...
Avatar billede circadian Nybegynder
14. januar 2010 - 00:52 #4
#3
Jo tak, det ser ud til at virke.

Efter clear kommandoen skal jeg gøre flere forskellige ting. Jeg har en listbox (ChosenNames) med nogle komponenter (antal varierer). Disse skal så sættes ind i Edit felterne (de samme som vi clearede lige før).


procedure TForm13.SelectNamesSaveBtnClick(Sender: TObject);
var
  C: TEdit;
  I, j: Integer;
begin
// clear'e alle boksene
  for I := 0 to Form12.ComponentCount - 1 do
  begin
    if (Form12.Components[I] is TEdit) AND
      (UpperCase(Copy(Form12.Components[I].Name, 0, 6)) = 'PERSON') then
    begin
      C := TEdit(Form12.Components[I]);
      C.Clear;
      // test
    for j := 0 to 3 do
      begin
        C.Text := ChosenNames.Items[j];
      end;
    end;
  end;
end;

Så får jeg bare fejl - out of bounds.
Avatar billede kgkg Nybegynder
14. januar 2010 - 11:53 #5
Jeg ved ikke rigtigt hvad du vil med det her:

for j := 0 to 3 do
begin
  C.Text := ChosenNames.Items[j];
end;

Du udskifter teksten 4 gange i det aktuelle edit felt.

Og at du fåe en Index out of Bounds, tyder på at ChosenNames ikke indeholder 4 linjer.

Prøv lige at forklarer hvad det er du vil.
Avatar billede circadian Nybegynder
14. januar 2010 - 14:57 #6
Ja skal heller ikke kunne sige om det burde virke det der, det var bare et forsøg.

Ok- jeg har en listbox som brugeren kan overføre nogle elementer til, vilkårligt mange. Når man så trykker på en knap for at gemme disse valgte elementer, så skal hvert enkelt element indsættes i en tekstboks for sig.

Hvis nu vi siger at de 3 første elementer i listboxen er disse:
element0
element1
element2

Så skal 'element0' indsættes i Person01.Text, 'element1' indsættes i Person02.Text, og 'element2' indsættes i Person03.Text.
Først cleares boksene dog, som vi har fundet en løsning på.
Avatar billede kgkg Nybegynder
14. januar 2010 - 15:32 #7
Nu skriver du vilkårligt mange elementer. Kan der være flere end der er af edit felter.

For så holder Så skal 'element0' indsættes i Person01.Text, 'element1' indsættes i Person02.Text, og 'element2' indsættes i Person03.Text ikke.

Har du mulighed for at sende form filen og unit filen til mig?

Hvilken version af Delphi bruger du?
Avatar billede circadian Nybegynder
14. januar 2010 - 16:17 #8
#7
Tak fordi du har lyst til at kigge på det, men det bliver ikke nødvendigt alligevel. Det gik op for mig at det med edit boksene blev et alt for stort arbejde, så vælger bare at gemme de valgte elementer i en ny listbox.

Jeg fik dog også svar på mit første spørgsmål, så du skal have tak :) Og selvfølgelig smid et svar.
Avatar billede kgkg Nybegynder
14. januar 2010 - 16:46 #9
Hermed et svar.
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