Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Odwoływanie sie do dynamicznie stworzonego obiekt TImage c++

pitboo 20 Maj 2008 20:50 3150 21
  • #1 20 Maj 2008 20:50
    pitboo
    Poziom 12  

    Witam

    Mam problem. W programie po uruchomieniu nie mam żadnego obiektu Timage. po wciśnięciu Buttona Program tworzy mi dynamicznie obiekty TImage w określonej przezemnie ilości. W jaki sposób mogę odwołać się do tak utworzonych obiektów żeby np wczytać do nich pliki bmp?

    0 21
  • #3 20 Maj 2008 21:18
    pitboo
    Poziom 12  

    jak to zapamiętać w zmiennych mże jakiś przykałd ??

    tworze je takim kodem

    w ten sposób

    x=Edit1->Text.ToInt();
    y=Edit2->Text.ToInt();
    Memo1->Lines->Add(x);
    Memo1->Lines->Add(y);
    TImage* DynamicImage=new TImage(this);
    DynamicImage->Left=x;
    DynamicImage->Top=y;
    DynamicImage->Name="Image"+s;
    DynamicImage->Parent=this;

    a w jaki sposób uzyskac te wskaźniki skąd sie je bierze ??? jak wyglądała by konstrukcja wypełnienia tego obrazkiem ?? dla nie dynamicznych robię to tak

    Image1->Picture->LoadFromFile("bitmap.bmp");

    może przykład kodu do wypełnienia pojedynczego dynamicznego obiekrtu?

    0
  • Pomocny post
    #4 20 Maj 2008 21:25
    Dżyszla
    Poziom 42  

    Robisz najprościej tablicę elementów TImage i odwołujesz się jak do normalnego image o nazwie będącej zmienną. Wszak To jest dokłądnie to samo.
    Czemu wskaźnik?

    Code:

    for(int i=0;i<10;i++)
       ImagesTable[i]=TImage->Create(this);

    . . .

    for(int i=0;i<10;i++)
       ImagesTable[i]->Free();

    (mogę mieszać, nie uzywam na codzień BC++).

    0
  • #5 20 Maj 2008 21:29
    pitboo
    Poziom 12  

    hmmm nie myslałem że to takie proste ... dzisiaj już nie dam rady sprawdzić ... jak tylko wypróbuje dam znać z wyników ... ;)

    0
  • Pomocny post
    #7 20 Maj 2008 21:39
    JIIIS
    Poziom 17  

    Dżyszla napisał:
    Robisz najprościej tablicę elementów TImage i odwołujesz się jak do normalnego image o nazwie będącej zmienną. Wszak To jest dokłądnie to samo.
    Czemu wskaźnik?

    Code:

    for(int i=0;i<10;i++)
       ImagesTable[i]=TImage->Create(this);

    . . .

    for(int i=0;i<10;i++)
       ImagesTable[i]->Free();

    (mogę mieszać, nie uzywam na codzień BC++).


    widze, ze kolega pisze w Delphi :D, w C++ Builderze jest tak:

    Code:

    for(int i=0;i<10;i++)
       ImagesTable[i]=new TImage();

    . . .

    for(int i=0;i<10;i++)
       delete ImagesTable[i];


    no i trzeba jeszcze odpowiednio zadeklarowac ImagesTable :)

    EDIT: a myslisz, ze podajemy ci niesprawdzone sposoby? :P

    0
  • #8 20 Maj 2008 21:39
    pitboo
    Poziom 12  

    to sprawdzony sposób ??:> ktoś już to zastosował kiedyś ??:> jakiś podręcznik czy cuś ?

    0
  • Pomocny post
    #9 20 Maj 2008 21:41
    Dżyszla
    Poziom 42  

    JIIIS , a to prawda :) Dlatego dopisek zrobiłem, że mogłem namieszać :) Dzięki za skorygowanie.

    pitboo - sprawdzony. To nie jest żadne czary-mary :D Jedyne co trzeba pamiętać, to obowiązkowo nadać rodzica obiektowi, jeśli ma być widoczny na formie. Nazwa jest zupełnie zbyteczna.

    0
  • #10 20 Maj 2008 21:51
    pitboo
    Poziom 12  

    CZyli jest tak że potem zamiast tego

    Image1->Picture->LoadFromFile("bitmap.bmp");

    robię coś takiego

    ImagesTable[i]->Picture->LoadFromFile("bitmap.bmp");

    i musi działać ?

    P.S. sie tak dopytuje bo coś sie nie czuje silny w temacie... ;)

    0
  • #12 22 Maj 2008 13:18
    pitboo
    Poziom 12  

    No to natrafiłem na kolejny problem ...

    Wcześniej przesuwałem obrazki takim kodem


    Code:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    pozX = X;
    pozY = Y;
    go = true;
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if(go){
    Image1->Left = (Image1->Left - pozX) + X;
    Image1->Top = (Image1->Top - pozY) + Y;
          }
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Image1MouseU(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    go = false;
    }



    No a teraz jak mam dynamiczne to nie mogę sobie poradzić z przesuwaniem :/

    0
  • Pomocny post
    #13 22 Maj 2008 14:29
    JIIIS
    Poziom 17  

    moze tak:

    Code:
    ImageList[i]->Left = (ImageList[i]->Left - pozX) + X; 
    
    ImageList[i]->Top = (ImageList[i]->Top - pozY) + Y;


    i - nr obrazka (liczone od 0)

    0
  • #14 22 Maj 2008 21:04
    pitboo
    Poziom 12  

    Konkretnie to chodzi mi o przesuwanie tych dynamicznie stworzonych obiektów po kliknięciu na nie myszą. Tzn. jak wykryć w który kliknąłem żeby go przeciągnąć ?

    0
  • Pomocny post
    #15 22 Maj 2008 23:12
    JIIIS
    Poziom 17  

    tu jest wskazowka:

    Code:
    void __fastcall TForm1::FormCreate(TObject *Sender)
    
    {
       for (int i = 0; i < 10; i++)
       {
          images[i] = new TImage(this);
          images[i]->Picture->LoadFromFile("c:\\obrazek.bmp");
          images[i]->Top = i * 30;
          images[i]->Parent = this;
          images[i]->OnMouseDown = imageMouseDown;
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::imageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       dynamic_cast<TImage*>(Sender)->Left += 50;
    }
    //---------------------------------------------------------------------------


    w pliku *.h musi byc jeszcze dodane w sekcji public:

    Code:
    void __fastcall TForm1::imageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);


    do przeciagania TImagesow musisz obsluzyc zdarzenia OnMouseDown obrazka (wcisnieto mysz na obrazku), OnMouseMove formularza (jezdzimy mysza) i OnMouseUp(puscilismy mysze)

    0
  • #16 23 Maj 2008 14:23
    pitboo
    Poziom 12  

    Zrealizowane :]

    Teraz napotkałem na taki problem.
    Jak wygeneruje 100 obrazków czy jest jakiś sposób żeby je rozróżniać ...
    Tzn jak wykryć który obiekt został kliknięty ??
    Jest jakaś komenda zwracająca wartość obiektu nad którym znajduje sie kursor ???

    Chciałbym zrealizować takie przesuwanie obiektów właśnie jak zaproponowałeś i podmieniać w formule tylko obiekt który ma być przesuwany jako zmienna ale nie wiem jak pobrać tą zmienną wskazującą nad jakim obiektem znajduje sie kursor ... Jest coś takiego wogóle możliwe żeby odczytywać nazwę obiektu lub jakiś parametr identyfikujący go ?? wiem że można OnMouseEnter wywoływać jakieś zdarzenia ale jak pobrać nazwę obiektu nad którym sie znajduje kursor??? Czy przy pomocy właśnie tego zdarzenia ???

    0
  • Pomocny post
    #17 23 Maj 2008 14:27
    JIIIS
    Poziom 17  

    pitboo napisał:
    Zrealizowane :]

    Teraz napotkałem na taki problem.
    Jak wygeneruje 100 obrazków czy jest jakiś sposób żeby je rozróżniać ...
    Tzn jak wykryć który obiekt został kliknięty ??
    Jest jakaś komenda zwracająca wartość obiektu nad którym znajduje sie kursor ???

    Chciałbym zrealizować takie przesuwanie obiektów właśnie jak zaproponowałeś i podmieniać w formule tylko obiekt który ma być przesuwany jako zmienna ale nie wiem jak pobrać tą zmienną wskazującą nad jakim obiektem znajduje sie kursor ... Jest coś takiego wogóle możliwe żeby odczytywać nazwę obiektu lub jakiś parametr identyfikujący go ?? wiem że można OnMouseEnter wywoływać jakieś zdarzenia ale jak pobrać nazwę obiektu nad którym sie znajduje kursor??? Czy przy pomocy właśnie tego zdarzenia ???


    dokladnie OnMouseEnter do obslugi wejscia na obrazek, i OnMouseMove do obslugi przesuwania myszy, a obrazek rozroznisz tak samo jak podalem wczesniej

    0
  • #18 23 Maj 2008 14:37
    pitboo
    Poziom 12  

    Wielkie dzięki ... Wracam do kontynuowania programu:]

    0
  • #19 27 Maj 2008 18:04
    pitboo
    Poziom 12  

    Kolejny problem ...

    Chcę zrealizować następującą rzecz.

    Generuje 20 dynamicznych obiektów TImage. Wczytuje do każdego zdjęcie z cyfrą od 1 do 20. Po wciśnięciu klawisza w Memo1 chcę otrzymać wartość wciśniętej karty. W jaki sposób zrealizować rozpoznawanie który z obiektów został wciśnięty ???
    Funkcja dynamic_cast<TImage*>(Sender)-> w tym przypadku nie rozróżnia konkretnego obiektu. Pliki zdjęć nazywają sie odpowienido 001.bmp 002.bmp itd.

    Proszę o pomoc.

    0
  • #21 27 Maj 2008 18:10
    pitboo
    Poziom 12  

    Code:

    void __fastcall TForm1::ObrazekDown(TObject *Sender, TMouseButton Button,
         TShiftState Shift, int X, int Y)
    {//wciśnięty klawisz myszy na dynamicznym obrazku

    switch(Button)
    {
    case mbLeft: {
       pozX = X;
       pozY = Y;
       go = true;
       }   break;
    case mbRight: {
       go = false;
       }    break;
    case mbMiddle: {
       go = false;
       }    break;
    default: {
       go = false;
    }   break;
    }



    Jak przydziele jak sie odwoływać po tym tagu do obiektu ?? zamiast
    Code:

    dynamic_cast<TImage*>(Sender)->


    co powinienem wpisać?

    0
  Szukaj w 5mln produktów