Sortowanie komponentów według wartości Tag

Odpowiedz Nowy wątek
2009-06-18 22:00
0

Witam. Nadal bawie się w tworzenie własnej gry "Kości" i dorobiłem sortowanie kostek według oczek.
Kostek jest jak widać w poniższym kodzie pięć i wylosowane na nich oczka mogą się powtarzać. No
i pytanie czy moiżna jakoś inacze je posortować? Ja tworzę tabliće, którą sortuję procedurą rosnąćo,
a później nazwy dodaje do StringListy. Póki co ważne, że działa ale może ktoś z Was ma jakiś pomysł
jak to uprościć. Używając samej pętli oraz tablicy. A może w ogóle inaczej. Prosiłbym o jakieś źródła.

const
  Ile_Kostek = 5;
  Odstep_Pomiedzy = 20;
var
  I, J : Byte;
  SL : TstringList;
  PozycjaX, PozycjaY : integer;
  TempArray : array[1..Ile_Kostek] of Byte;
begin
  for I := Low(TempArray) to High(TempArray) do
  begin
    Img := TImage(FindComponent(Image_Nazwa + IntToStr(I)));
    TempArray[I] := Img.Tag;
  end;
  SortujTabliceByte(TempArray);
  SL := TstringList.Create;
  for I := 1 to Ile_Kostek do
  begin
    for J := 1 to Ile_Kostek do
    begin
      Img := TImage(FindComponent(Image_Nazwa + IntToStr(J)));
      if (Img.Tag = TempArray[I]) and (Pos(Img.Name, SL.Text) = 0) then
      begin
        sL.Add(Img.Name);
        Break;
      end;
    end;
  end;
  PozycjaX := 10;
  PozycjaY := 20;
  for I := 0 to SL.Count - 1 do
  begin
    Img := TImage(FindComponent(SL[I]));
    Img.Left := PozycjaX;
    Img.Top := PozycjaY;
    PozycjaY := PozycjaY + Img.Height + Odstep_Pomiedzy;
  end;
  SL.Free;
end;

Pozostało 580 znaków

2009-06-18 23:47
0

Ostatecznie poradzono mi na innym forum skorzystanie z obiektu TList. Tak też zrobiłem i teraz
Imagesy sortują się według swoich tagów. Oto kod jakby ktoś potrzebował czegoś podobnego.

const
  Ile_Kostek = 5;
  Image_Nazwa = 'Kostka';
  Odstep_Pomiedzy = 20;

  public
    Img : TImage;

function CompareTags(Item1, Item2: Pointer): Integer;
begin
  Result := TWinControl(item1).Tag - TWinControl(item2).Tag;
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  I : Byte;
  LT : TList;
  PozycjaX, PozycjaY : integer;
begin
  PozycjaX := 10;
  PozycjaY := 20;
  LT := TList.Create;
  for I := 1 to Ile_Kostek do
  begin
    Lt.Add(TImage(FindComponent(Image_Nazwa + IntToStr(I))));
  end;
  Lt.Sort(CompareTags);
    for I := 0 to LT.Count - 1 do
    begin
      with TImage((LT[I])) do
      begin
        Left := PozycjaX;
        Top := PozycjaY;
        PozycjaY := PozycjaY + Height + Odstep_Pomiedzy;
      end;
    end;
end;

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0