"Ścieżka" obiektu (?).

0

Witam
Mam problem z jakby się wydawało, błahą sprawą w delphi... Niestety, nie bardzo wiem jak nazwać swój problem tak aby google albo help mi pomógł -.- Po nieudanych próbach zwracam się do was z prośbą o pomoc:)

Do rzeczy. Piszę właśnie projekt z delphi do szkoły. Temat: przedstaw wizualnie sortowanie.
Projekt jest już prawie gotowy. Wstawiłem na formę 5 prostokątów, o takiej samej szerokości, ale innej wysokości. Te wysokości wpisałem w tablice, która bd sortowana bąmbelkowo. Po każdym loopie pętli, jeśli zaistnieje taka potrzeba, prostokąty zamienią się swoimi parametrami left. Żeby to zrobić każdy prostokąt nazwałem S(szerokość prostokąta), czyli np. s57, jako że w tablicy widnieje on jako 57. I tu trafiłem na problem, z którym męczę się od kilku godzin; /
mianowicie chce do zmiennej przypisać wartość danego left tak więc postanowiłem to zrobić tak:
b:= 's'+(inttostr(tab[i])); sprawdziłem przez showmessage i gra. Wyskakuje np. s57. Ale jak to teraz przypisać do ścieżki żeby załapało? Próbowałem tak: ** d:=b.left;** ale nie trzeba być sherlockiem, żeby się domyślić, że nie zadziała... dlatego też wstawiałem rozmaite kombinacje jak d:=(b).left; itd. ale nic. Tak : d:='s'+(inttostr(tab[i])).left; też, ale nie ma szans.
Jeżeli ktoś mógłby mi podpowiedzieć, gdzie mogę znaleźć info, jak to nazwać żeby help pomógł albo jak to obejść to bd niezmiernie wdzięczny ;)
Wsadzę też kod, może to pomoże:

 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  ttab= array[1..5] of integer;
  TForm1 = class(TForm)
    S57: TShape;
    S73: TShape;
    S65: TShape;
    S81: TShape;
    S89: TShape;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  tab:ttab=(81,89,57,65,73);
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
y:integer;
b,c:string;
d:integer;
begin
for i:=1 to 5 do
if tab[i]>tab[i+1] then
begin
Y:=tab[i];
tab[i]:=tab[i+1];
tab[i+1]:=y;
b:= 's'+(inttostr(tab[i]));
C:='s'+(inttostr(tab[i+1]));
d:=b.left;                     //TU JEST PROBLEM
showmessage(inttostr(d));
end;
end;
end.
1

Może chodzi Tobie o FindComponent?
Jednak i tak odnoszę wrażenie, że cokolwiek starasz się zrobić, można to wykonać łatwiej.
Btw:

bd sortowana bąmbelkowo

To jakiś modern-połlisz czy co? Bo takie słowa nie istnieją :P

2

FindComponent + rzutowanie na klasę "prostokąta" załatwi sprawę;

Można łatwo rozwiązać ten problem wykorzystując macierz statyczną/dynamiczną i w niej tworzyć obiekty; Także dobrym rozwiązaniem byłoby utworzenie listy np. klasy TObjectList i do niej dodawać obiekty (prostokąty), choć łatwiejszym sposobem byłoby wykorzystać macierz wskaźników (szybciej można przesuwać elementy), a prostokąty tworzyć i zwalniać dynamicznie, ale musiałbyś trochę poczytać i poćwiczyć;

0

Ale sobie życie utrudniasz chłopie...

Racja.

To, czego ty szukasz nazywa się RTTI ale nie jest zalecane ze względu na poleganie na nazwach obiektów, generalnej powolności etc. . Polecam zrobić tablicę obiektów TShape a następnie pobierać i zamieniać je wartościami pobierając z tej tablicy (w takim przypadku nie musisz mieć wartości w dodatkowej tablicy).

2

Może zajrzyj do folderu demo twojej instalacji Delphi i obczaj demo z opisem Threads.
Tam masz jednoczesną wizualizacje 3-ch sortowań.

2

A może lepiej w ten sposób:

unit Unit1; 
interface uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
var f:Boolean;
var y,d:integer;
var b,c:string;
var ShTab:array of TShape;
begin
  SetLength(ShTab,10);
  for i:=0 to Length(ShTab)-1 do
  begin
     ShTab[i]:=TShape.Create(Self);
     ShTab[i].Left:=10;
     ShTab[i].Top:=12*i;
     ShTab[i].Width:=tab[i];
     ShTab[i].Height:=10;
     ShTab[i].Parent:=Self; // EDIT, zapomniałem tego
  end;
  f:=true;
  while f do
  begin
    f:=false;
    for i:=0 to Length(ShTab)-2 do
    begin
      if tab[i]>tab[i+1] then
      begin
        f:=true;
        Y:=ShTab[i].Width;
        ShTab[i].Width:=ShTab[i+1].Width;
        ShTab[i+1].Width:=Y;
        Sleep(200);
        Application.ProcessMessages;
      end;
    end;
  end;
  for i:=0 to Length(ShTab)-1 do ShTab[i].Free;
  SetLength(ShTab,0);
end;

end.
0

Ale sobie życie utrudniasz chłopie...

Może i tak ale to ze względu na to, że jestem bardzo początkującym programistą, a delphi zajmuję się od 2miech itylko dlatego, że jest w programie technikum ;p Po prostu wymyśliłem jak napisać program bazując na swojej wiedzy i umiejętnościach(jak widać nikłych) ;p

To jakiś modern-połlisz czy co? Bo takie słowa nie istnieją
Chodzi Ci o samo "bd" ? Jest to skrót, nie oficjalny ale dość powszechny w moim środowisku, więc myślałem, że jest szerzej znany ;p

A co do samego problemu to przeanalizowałem wasze rady i przeprowadziłem kilka prób... Najpierw spróbowałem FindComponent z rzutowaniem. O samym rzutowaniu znalazłem tu na forum wątek więc w miarę ogarnąłem o co chodzi, aczkolwiek coś robię źle...

 b:integer;
b:=findcomponent(tobject('s+inttostr(tab[i]')).left;

Co do rozwiązania _13th_Dragon to na pewno jest ono lepsze niż moje, jednak analizowałem Twój kod, poczytałem o tablicach dynamicznych(nigdy wcześniej ich nie używałem) ale nie do końca ogarniam to z tworzeniem tych obiektów... A że, ten projekt mam na jutro, to chyba przymierzę się do przerobienia tego gotowca z demo/threads, aczkolwiek, mogę za to beknąć.

0
b:=findcomponent(tobject('s+inttostr(tab[i]')).left;

Ja raczej skłaniałbym się ku konstrukcji:

B := TKlasaObiektuKtoregoWartoscChceszWyciagnac(FindComponent(S+IntToStr(Tab[I]))).Left;
0

Ja raczej skłaniałbym się ku konstrukcji:

B := TKlasaObiektuKtoregoWartoscChceszWyciagnac(FindComponent(S+IntToStr(Tab[I]))).Left;
</quote>

też nie łapie: undeclarated identifier: "left" może to przez zmienną? jakiego typu powinna być b w tym momencie?

0

to już załatwiłem, do zmiennej przypisuje się wartość, natomiast problem jest w kolejnych 2 linijkach... Można wgl robić w ten sposób?

 b:=tshape(findcomponent('s+inttostr(tab[i]')).left;
tshape(findcomponent('s'+inttostr(tab[i])).left:= tshape(findcomponent('s'+inttostr(tab[i+1])).left;
tshape(findcomponent('s'+inttostr(tab[i+1])).left:=b;

Błąd taki jak w poprzednim, nie widzi tu left

1

Wg mnie beż sensu się rozwodzicie nad tematem, kiedy pytacz potrzebuje tylko tego:

procedure TForm1.Button1Click(Sender: TObject);
var i,k:byte;
var f:Boolean;
var y:integer;
var ShTab:array of TShape;
begin
  SetLength(ShTab,10);
  for i:=0 to Length(ShTab)-1 do
  begin
     ShTab[i]:=TShape.Create(Self);
     ShTab[i].Left:=10;
     ShTab[i].Top:=10+12*i;
     ShTab[i].Width:=10+random(90);
     ShTab[i].Height:=10;
     ShTab[i].Parent:=Self; // EDIT, zapomniałem tego
  end;
  f:=true;
  while f do
  begin
    f:=false;
    for i:=0 to Length(ShTab)-2 do
    begin
      if ShTab[i].Width>ShTab[i+1].Width then
      begin
        f:=true;
        for k:=1 to 3 do
        begin
          ShTab[i].Brush.Color:=clRed;
          ShTab[i+1].Brush.Color:=clWhite;
          Sleep(100);
          Application.ProcessMessages;
          ShTab[i].Brush.Color:=clWhite;
          ShTab[i+1].Brush.Color:=clRed;
          Sleep(100);
          Application.ProcessMessages;
        end;
        Y:=ShTab[i].Width;
        ShTab[i].Width:=ShTab[i+1].Width;
        ShTab[i+1].Width:=Y;
        for k:=1 to 3 do
        begin
          ShTab[i].Brush.Color:=clBlue;
          ShTab[i+1].Brush.Color:=clWhite;
          Sleep(100);
          Application.ProcessMessages;
          ShTab[i].Brush.Color:=clWhite;
          ShTab[i+1].Brush.Color:=clBlue;
          Sleep(100);
          Application.ProcessMessages;
        end;
        ShTab[i+1].Brush.Color:=clWhite;
      end;
    end;
  end;
  for k:=1 to 8 do
  begin
    for I:=0 to Length(ShTab)-1 do ShTab[i].Brush.Color:=clGreen;
    Sleep(200);
    Application.ProcessMessages;
    for I:=0 to Length(ShTab)-1 do ShTab[i].Brush.Color:=clWhite;
    Sleep(200);
    Application.ProcessMessages;
  end;
  for i:=0 to Length(ShTab)-1 do ShTab[i].Free;
  SetLength(ShTab,0);
end;
0
Thorez napisał(a):

Błąd taki jak w poprzednim, nie widzi tu left

Spójrz na ustawienie nawiasów...


```delphi tshape(findcomponent('s'+inttostr(tab[i])) ``` *formatuj kod normalnie, ok?* Wersja sformatowana: ```delphi TShape(FindComponent('S'+IntToStr(Tab[I])).Left ``` Idziemy dalej: ```delphi TShape(FindComponent('S'+IntToStr(Tab[I]) ).Left ``` Widzisz problem? Próbujesz odczytać `Left` bezpośrednio z wyniku zwracanego przez `FindComponent`, zamiast najpierw rzutować. Czyli poprawnie byłoby: ```delphi TShape(FindComponent('S'+IntToStr(Tab[I]))).Left ```
0

Mam ExtCtrls. Połączyłem te dwa kody od Ciebie. Wsadziłem buttona na formę i to wszystko? Bo jak próbuję kompilować to wyskakuje "FormCreate method referenced by Form1.OnCreate doesn't exist. Jeżeli ją usunę, to odpala się ale po naciśnięciu buttona nic się nie dzieje, jeżeli nie usunę no to się nie kompiluje. O co chodzi?

podaje kod jaki mam wsadzony:

 unit Unit1przy;
interface uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i,k:byte;
var f:Boolean;
var y:integer;
var ShTab:array of TShape;
begin
  SetLength(ShTab,10);
  for i:=0 to Length(ShTab)-1 do
  begin
     ShTab[i]:=TShape.Create(Self);
     ShTab[i].Left:=10;
     ShTab[i].Top:=10+12*i;
     ShTab[i].Width:=10+random(90);
     ShTab[i].Height:=10;
     ShTab[i].Parent:=Self;
  end;
  f:=true;
  while f do
  begin
    f:=false;
    for i:=0 to Length(ShTab)-2 do
    begin
      if ShTab[i].Width>ShTab[i+1].Width then
      begin
        f:=true;
        for k:=1 to 3 do
        begin
          ShTab[i].Brush.Color:=clRed;
          ShTab[i+1].Brush.Color:=clWhite;
          Sleep(100);
          Application.ProcessMessages;
          ShTab[i].Brush.Color:=clWhite;
          ShTab[i+1].Brush.Color:=clRed;
          Sleep(100);
          Application.ProcessMessages;
        end;
        Y:=ShTab[i].Width;
        ShTab[i].Width:=ShTab[i+1].Width;
        ShTab[i+1].Width:=Y;
        for k:=1 to 3 do
        begin
          ShTab[i].Brush.Color:=clBlue;
          ShTab[i+1].Brush.Color:=clWhite;
          Sleep(100);
          Application.ProcessMessages;
          ShTab[i].Brush.Color:=clWhite;
          ShTab[i+1].Brush.Color:=clBlue;
          Sleep(100);
          Application.ProcessMessages;
        end;
        ShTab[i+1].Brush.Color:=clWhite;
      end;
    end;
  end;
  for k:=1 to 8 do
  begin
    for I:=0 to Length(ShTab)-1 do ShTab[i].Brush.Color:=clGreen;
    Sleep(200);
    Application.ProcessMessages;
    for I:=0 to Length(ShTab)-1 do ShTab[i].Brush.Color:=clWhite;
    Sleep(200);
    Application.ProcessMessages;
  end;
  for i:=0 to Length(ShTab)-1 do ShTab[i].Free;
  SetLength(ShTab,0);
end;

end.
0

A masz podpięty Button1Click pod Button1.OnClick?
OnCreate ma być usunięty, przecież nie masz tego FormCreate.
Oraz musisz podwójnie kliknąć na przycisk przed kompilacją.

0

Chodzi Mi o te dwie. Rzeczywiście przeoczyłem nawias, ale po poprawie dalej wyskakuje błąd: Statement expected, but expression of type 'TShape" found

Tshape(FindComponent('s+IntToStr(tab[i]'))).Left:= Tshape(FindComponent('s'+IntToStr(tab[i+1]))).Left;
Tshape(FindComponent('s'+IntToStr(tab[i+1]))).Left:=b;
0

_13th_Dragon Twoja metoda działa. Bardzo Ci dziękuje;)

Nie ma to jak metoda Kopiuj+Wklej...

Skopiowałem, to prawda, ale analizowałem. Z większością rozwiązań miałem styczność pierwszy raz, dlatego miałem problem. Ale w wolnej chwili na pewno nadrobię ;p

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