Avatar billede anold Nybegynder
13. december 2000 - 10:49 Der er 12 kommentarer og
1 løsning

Find og udskriv Dynamisk oprettet værdi

Jeg har en ScrollBox1 hvor der dynamisk bliver oprettet et X antal label (F.eks. ItemCount = 4)via koden :

For I := 0 To ItemCount-1 Do  // opretter labels og placer dem
      Begin
        Flabel := TLabel.Create(FrmKampnr.ScrollBox1);
        FLabel.parent := FrmKampnr.ScrollBox1;
        FLabel.Name := \'FLabel\' + IntToStr(I);
        FLabel.Left := LeftPos;
        FLabel.Top  := CurTop;
        FLabel.Caption := IntToStr(SpillerNr) +\'  \'+ ListBox.Items[I];

Nu står der 4 labels med navne i

Ud for hver label opretter jeg 3 edit felter (altid 1 mindre end antal labels) med koden:

For X := 1 To ItemCount-1 Do // opretter editfelter og placer dem
            Begin
            FEdit := TEdit.Create(FrmKampnr.ScrollBox1);
            FEdit.parent := FrmKampnr.ScrollBox1;
            FEdit.Name := \'FEdit\' + IntToStr(Taeller);
            Taeller := Taeller +1;
            FEdit.Left := EditLeft;
            FEdit.Top  := CurTop;
            FEdit.Width := 25;
            FEdit.Height := 15;
            FEdit.Text := \' \' ;
            EditLeft := EditLeft+35
            end; 

nu kan brugeren indtaste nogle nummer i disse edit felter (4*3 = 12 stk)F.eks
Edit1  = 1 Edit2  = 3 Edit3  = 3
Edit4  = 1 Edit5  = 4 Edit6  = 6
Edit7  = 2 Edit8  = 3 Edit9  = 6
Edit10 = 2 Edit11 = 4 Edit12 = 5

DVS. at mit skærmbillede ser sådan ud :

FLabel  FEdit1  = 1 FEdit2  = 3 FEdit3  = 5
FLabel  FEdit4  = 1 FEdit5  = 4 FEdit6  = 6
FLabel  FEdit7  = 2 FEdit8  = 3 FEdit9  = 6
FLabel  FEdit10 = 2 FEdit11 = 4 FEdit12 = 5

Eller :

Anne Jensen  1  3  5
Lene Hansen  1  4  6
Tina Nielsen 2  3  6
Lone Jensen  2  4  5 

Nu kommer så mit spørgsmål :

Hvordan finder jeg ud af hvilken 2 edit felter der er ens og hvilken navn står der ud for disse 2 edit felter ???

Håber at der er en som kan hjælpe mig.

Anold

Avatar billede borrisholt Novice
13. december 2000 - 13:25 #1
Hej arnold prøv den her og se om ikke det er det du vil :

  Function CompareInt(a,b : Integer) : Integer;assembler;
  {
    The return value is
    -1 if a is less than b,
    0 if a equals b
    1 if a is greater than b.
  }
  asm
    xor ecx, ecx
    cmp eax, edx
    je @CompareIntDONE
    jg @GreaterThan
    mov ecx, -1
    jmp @CompareIntDONE
  @GreaterThan:
    mov ecx, 1
  @CompareIntDONE:
    mov eax, ecx
  end;

function LabelSortProc(Item1, Item2: TLabel): Integer;
begin
  Result := CompareInt(Item1.Top, Item2.Top);
end;

function EditSortProc(Item1, Item2: TEdit): Integer;
begin
  Result := StrComp(pointer(Item1.Text), pointer(Item2.Text));
end;

var
  ColorArray : array[0..16] of TColor = (clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal, clGray,
                        clSilver, clRed, clLime, clYellow, clBlue, clFuchsia,  clAqua,
                        clLtGray, clDkGray, clWhite);
procedure TForm1.Button2Click(Sender: TObject);
var
  i,j,k : Integer;
  aComp : Tcomponent;
  found : Boolean;
begin
  LabelListe := TList.Create;
  EditListe := TList.Create; //Opret nogle lister til at inde holde vores komponenter.
  for i:= 0 to Componentcount-1 do
  begin
    aComp := Components[i];
    (*
      Placer relevante komponenter i vores lister
    *)
    if aComp is TLabel then
      LabelListe.Add(aComp)
    else if aComp is TEdit then
        EditListe.Add(aComp);
  end;
  LabelListe.Sort(@LabelSortProc);
  EditListe.Sort(@EditSortProc);
  i:=0;
  j:=0;
  while  (i<pred(EditListe.Count)) do
  begin
    found := TEdit(EditListe[i]).Text = TEdit(EditListe[i+1]).Text;
    if found then
    begin
      TEdit(EditListe[i]).Font.Color := ColorArray[j];
      TEdit(EditListe[i+1]).Font.Color := ColorArray[j];
      inc(j);
      //Nu har vi fået mærket edit felterne op parvist så skal vi bare finde de tilhørende labels.
      k:=0;
      while (k<LabelListe.Count) do
      begin
        if Tlabel(LabelListe[k]).Top = TEdit(EditListe[i]).Top then
          Tlabel(LabelListe[k]).Font.Color := ColorArray[j];
        if Tlabel(LabelListe[k+1]).Top = TEdit(EditListe[i+1]).Top then
          Tlabel(LabelListe[k+1]).Font.Color := ColorArray[j+1];
        inc(k,2);
      end;
    end;

    inc(i,2);
  end;
  LabelListe.Free;
  EditListe.Free;
end;

JEns B
Avatar billede anold Nybegynder
13. december 2000 - 14:02 #2
Hej Jens B
Dit program ser meget fint ud.
Men det finder ikke nogle af mine labels
Kan det være fordi at mine labels hedder FLabel
eller fordi at mine Flabel og Fedit er oprettet på en scrollbox?
Anold
Avatar billede pstric Nybegynder
13. december 2000 - 14:59 #3
Hej
Hvad mener du med \'2 edit felter der er ens\'? Jeg forstod det umiddelbart som at du ville have at vide, hvilke 2 edit felter der var indtastet samme værdi i, men det kan jeg ikke rigtigt få til at stemme overens med dit eksempel. Og hvordan ville du sikre dig, at brugeren ikke for eksempel indtastede ettaller i alle felterne. Kan du ikke specificere dit spørgsmål lidt nærmere?
Peter
Avatar billede borrisholt Novice
13. december 2000 - 17:18 #4
Det er fordi du Jeg har glemt at dine kontoller sidder på en ScrollBox ...

Så derfor skal disse to linjer

  for i:= 0 to Componentcount-1 do
  begin
    aComp := Components[i];

erstattes med disse :

  for i:= 0 to ScrollBox1.Componentcount-1 do
  begin
    aComp := ScrollBox1.Components[i];
Avatar billede anold Nybegynder
14. december 2000 - 08:28 #5
Hej Jens B
Så nu køre din kode

men jeg syntes ikke at den finder alle navne i forhold til de indtastet nummer !

Kan du ikke lave det således at man kan printe de navne og de nummer ud som passer sammen ?

Hilsen Anold
Avatar billede borrisholt Novice
14. december 2000 - 08:31 #6
Arnold

Lad os sige du har det her skærm billede :

Anne Jensen  1  3  5
Lene Hansen  1  4  6
Tina Nielsen 2  3  6
Lone Jensen  2  4  5 



Kunne du så ikke vise mig hvilken udskrift du gerne vil have ud af det ...

Jens B
Avatar billede anold Nybegynder
14. december 2000 - 09:00 #7
Hej Jens B

Jeg vil gerne have et udskrift der ser sådan her ud.

Kampnr. 1
Spillernes navn.:
                  Anne Jensen
                  Lene Hansen

Kampnr. 2
Spillernes navn.:
                  Tina Nielsen
                  Lone Jensen

Kampnr. 3
Spillernes navn.:
                  Anne Jensen
                  Tina Nielsen

------------- Ny Side

Kampnr. 4
Spillernes navn.:
                Lene Hansen
                Lone Jensen

Kampnr. 5
Spillernes navn.:
                Anne Jensen
                Lone Jensen

Kampnr. 6
Spillernes navn.:
                Lene Hansen
                Tina Nielsen
               
Som du kan se så må Hver side der bliver printet  MAX Indholde 3 Kampe.

Håber at det hjælper dig lidt
Hilsen Anold




Avatar billede borrisholt Novice
14. december 2000 - 10:20 #8
Hej Arnold

Prøv lige at sætte en ListBox på din form, bare lige for at teste det her :

procedure TForm1.Button2Click(Sender: TObject);
var
  i,k : Integer;
  aComp : TComponent;
begin
  LabelListe := TList.Create;
  EditListe := TList.Create; //Opret nogle lister til at inde holde vores komponenter.

  for i:= 0 to ScrollBox1.Componentcount-1 do
  begin
    aComp := ScrollBox1.Components[i];
    //Placer relevante komponenter i vores lister
    if aComp is TLabel then
      LabelListe.Add(aComp)
    else if aComp is TEdit then
      EditListe.Add(aComp);
  end;

  LabelListe.Sort(@LabelSortProc);
  EditListe.Sort(@EditSortProc);
  i:=0;

  while i <EditListe.Count  do
  begin
    if i mod 2 = 0 then
      ListBox1.Items.Add(\'Kamp nummer \'+  TEdit(EditListe.Items[i]).Text);
    k:=0;
    while k<LabelListe.Count do
    begin
      if (TEdit(EditListe.Items[i]).Top = TLabel(LabelListe.Items[k]).Top) then
        ListBox1.Items.Add(\'    \' + TLabel(LabelListe.Items[k]).Caption);
        inc(k);
    end;
    inc(i);
  end; 

  LabelListe.Free;
  EditListe.Free;
end;

så kan vi lave udsktift bag efter ... Når jeg ved det her virker ...

Jens b
Avatar billede anold Nybegynder
14. december 2000 - 10:43 #9
Hej Jens B

Ja det virker Fint.
Avatar billede borrisholt Novice
14. december 2000 - 12:26 #10
Så Arnold nu kan den skrive ud, lave kaffe, riste brød, afvise avis sælgere og holde fogden fra døren !

Send en mail til Jens@Borrisholt.com så retunerer jeg dig projektet.

JEns B
Avatar billede pellelil Nybegynder
15. december 2000 - 08:31 #11
borrisholt> hvis den også kan fodre HEST\'en så vil jeg da gerne købe den :-)

anold> \"Den rigtige måde\" (i min bog) er at lave nogle strukture inde i maven af dit program (evt. i forbindelse med Class\'es) som indeholder de oplysninger du vil behandle. Du bør ikke tage udgangs punkt i hvilke labels/og eller listboxe du har på skærmen:
<SNIP>
  TSpiller = Class
  FNavn : String;  // F.eks. Anne Jensen
  end;

  TKamp = Class
  FNr      : Integer;  // Kamp Nr 1
  FSpiller1 : TSpiller;  // F.eks: \"peger\" på TSpiller (Anne Jensen)
  FSpiller2 : TSpiller;  // F.eks: \"peger\" på TSpiller (Lene Hansen)
  end
</SNIP>

Ovenstående kunne nu godt (på det \"stadie\") være records, men det vil være naturligt at at bruge Class da du så kan tilføje methoder i det omfang de vil være ønskeligt. Evt. kunne du lave endnu en class (\"TKampe\" eller lign.) som kunne indeholde en TList/TStringList med alle dine kampe. TKampe kunne så have methodeR der opbygger din udskrift/dit skærmbillede på baggrund af de data der ligger i dine \"strukture\"

Blot et forslag !
Avatar billede anold Nybegynder
20. december 2000 - 09:26 #12
Hej Jens
så er jeg tilbage igen.
jeg har lige svaret på din mail
Hilsen anders
Avatar billede borrisholt Novice
24. december 2000 - 13:00 #13
Hej Anders

Fik du det til at virke det jeg sendte dig ?

Jens B
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