Dynamiczny TImage... problemy Access Violation

0

Witam wszystkich, mam pewien problem. Tworzę sobie dynamicznie obiekt TImage w ten sposób:

var
Form1: TForm1;
Image: TImage;
Nazwa: String;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin

Image := TImage.Create(Self);
Image.Parent := Form1;
Image.Hint := 'delphi';
Image.Left := 0;
Image.Name := 'obraz';
nazwa := Image.Name;

TImage(Nazwa).Hint := 'hint';

ShowMessage(TImage(nazwa).Hint);

no i tutaj wszystko jest w porządku... tzn do obiektu zostaje przypisany Hint i można go wyświetlić. Ale kiedy w miejsce

TImage(Nazwa).Hint := 'hint';

wstawimy

TImage(Nazwa).Left := 0;

pojawia się błąd Access Violation.... moje pytanie brzmi dlaczego to nie działa poprawnie, i dlaczego nie można odwołać się do właściwości Left, Top etc.. co robię nie tak? gdzie jest błąd??

0

A dlaczego nie odwołujesz się przez "Image", tj. "Image.Left := 0" ?

0

Tworzę dużo komponentów typu TImage, i musze się odwołać do każdego z nich, wszystko musi być dynamicznie... a jak na razie lipa, każdy ma inną nazwę(nadawaną dynamicznie). Ale to inny problem skoro nawet do jednego nie można się odwołać poprawnie. Hint można zmienić a już Left nie... dziwne

0

Tak nie działa rzutowanie; aż dziwne, że nie otrzymujesz jakiegoś warninga/hinta od kompilatora.
To czego szukasz, to FindComponent, chociaż najlepiej byłoby, jakbyś wstawiał dane do jakiejś tablicy (lub jeszcze lepiej: jakiegoś kontenera/listy, np.w Lazarusie masz generyczne TFPGList).

0

no dobra... próbowałem z TComponents i FindComponent owszem działa... ale działa tak wolno że to po prostu odpada (przy odrysowywaniu Image widoczne jest opóźnienie i to duże, spowodowane pętlą wyszukiwania komponentów). Powiedzmy że znam nazwę komponentu TImage stworzonego dynamicznie np

Image.Name := 'obraz';

i teraz jak zmienić Left bez stosowania wyszukiwania komponentów,

w programie mam tablicę z nazwami utworzonych komponentów(jest poprawna)

Tablica: array [1..10] of String;

ale na razie nie odwoływałem się do tablicy

1

Nie możesz zrobić po prostu tablicy TImage-ów?
Strasznie przekombinowujesz, a ponadto rozwiązanie ze statyczną tablicą jest... bezsensowne.

0

mam tablicę z utworzonymi obiektami, ale nie mogę od razu stworzyć 100 obiektów typu Image, to zależy od tego co użytkownik będzie robił w programie...

a Ty jak byś tą tablice stworzył? jakiś kod może??

w sumie tablica z komponentami TImage to może być to... spróbuję

1

a Ty jak byś tą tablice stworzył?

Nijaką, po co tutaj się męczyć ręcznie z tablicami?
Przy okazji:
[kogo, co?] tę tablicę.

jakiś kod może??

Z przyjemnością (pisane z palca):

{$MODE OBJFPC}
{...}
Uses {...}, FGL;
{...}
Implementation
Type TImgList = specialize TFPGList<TImage>; // lub po prostu Pointer, gdyby miał problem z obiektem
Var ImgList: TImgList;

Procedure TForm1.btn1Click(Sender: TObject);
Var Image: TImage;
Begin
 Image := TImage.Create(self);

 With Image do
 Begin
  Parent := Form1;
  Hint := 'delphi';
  Left := 0;
  Name := 'obraz';
 End;

 { ID utworzonego obrazka := }ImgList.Add(Image);
End;

{...}
initialization 
 ImgList := TImgList.Create; // lub wrzucić to do `OnCreate` formy.

Odwoływanie się do konkretnego komponentu z tej listy:

ImgList[ID].Cośtam

lub:

TImage(ImgList[ID]).Cośtam

ewentualnie:

(ImgList[ID] as TImage).Cośtam

Ale ten kod nie skompiluje się pod Delphi, z którego - jak wnioskuję po `{$R *.dfm}` - korzystasz. Niemniej, jeżeli to coś nowszego od jedenastoletniego Delphi 7, na pewno istnieje jakiś generyczny odpowiednik Lazarusowego `TFPGList`.
PS:

ale nie mogę od razu stworzyć 100 obiektów typu Image

O tablicach dynamicznych się słyszało? A najlepiej wybierz coś dedykowanego z RTL, a nie baw się w tablice.

0

Dobra chłopaki działa pięknie na tablicy obiektów! :) Dzięki za pomysł... pozostała jeszcze kwestia tablicy rozszerzanej dynamicznie ale z tym sobie jakoś poradzę....

Pozdrawiam!:)

0

var Images:array of TImage;

SetLength(Images,N);

0
tweety napisał(a)

pozostała jeszcze kwestia tablicy rozszerzanej dynamicznie ale z tym sobie jakoś poradzę....

Jeśli piszesz o tym co myślę, a myślę o grze, to odradzam zabaw z macierzami - jeśli musisz tworzyć dużo komponentów, gdzie nie muszą być jakoś indeksowane (i odwołania do nich nie muszą być skonstruowane poprzez indeks) to skorzystaj z listy (np. TObjectList) - zaoszczędzisz czasu na przepisywanie elementów macierzy podczas usuwania obiektu z jej środka;

Poza tym jeśli dalej robisz tę grę, to także odradzam zabaw w budowanie gry z kontrolek TImage - przekonasz się za niedługo jak wszystko będzie wolno działać;

0

Grę robię swoją drogą, a to jest inny projekt.

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