Znikająca miniatura Drag&Drop

dział ogólny

Znikająca miniatura Drag&Drop

Nowy postprzez Mironas » poniedziałek, 9 lipca 2012, 14:14

Witam,

Obsługuję Drag&Drop z wykorzystaniem obiektu dziedziczącego po TDragControlObject. Podczas przeciągania wyświetla mi się miniatura przeciąganego elementu. Jednak jeśli najadę myszką na dowolny element interfejsu (np.: TPanel) który został utworzony dynamicznie w trakcie działania programu - to miniatura znika. Na elementach umieszczonych jeszcze w IDE wszystko działa OK.

Czy ktoś ma jakiś pomysł dlaczego tak się dzieje?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 lipca 2012, 16:54

Opisz to jakoś tak by można zrozumieć o co chodzi, albo załącz ten program.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Mironas » poniedziałek, 9 lipca 2012, 17:34

Załączam źródła (C++Builder XE)

1. Na interfejsie jest kilka paneli (TPanel) utworzonych w IDE.
2. W OnCreate tworzę dynamicznie jeden dodatkowy panel (Panel01)

Po uruchomieniu przeciągam myszką element z ListView na inny element. W trakcie przeciągania widoczna jest miniatura 'przyklejona' do myszki. Miniatura jest widoczna niezależnie gdzie znajduje się mysz (nawet poza oknem programu). Jednak jeśli najadę myszką na Panel01 (ten utworzony dynamicznie) to miniatura znika.

Mam nadzieję że teraz dobrze to wyjaśniłem.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Mironas » poniedziałek, 9 lipca 2012, 17:42

Już wiem!!!

Dla nowo tworzonego komponentu (panela) muszę dodać:
PanelX->ControlStyle << csDisplayDragImage;

Sorki za zamieszanie ale dwie godziny nad tym myślałem, i dopiero teraz zauważyłem problem.

Gorąco pozdrawiam
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 lipca 2012, 18:02

Przenieś kod odpowiedzialny za dynamiczne tworzenie Panel'u do konstruktora klasy:

KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  TPanel* PanelX = new TPanel(this);
  PanelX->Parent = Form1;
  PanelX->Align = alRight;
  PanelX->Width = 50;
  PanelX->Caption = "01";

  SetControlsControlStyle(this);
}


Wtedy to:

mpsoft napisał(a):Dla nowo tworzonego komponentu (panela) muszę dodać:
PanelX->ControlStyle << csDisplayDragImage;


będzie zbędne!

Nie wiem co kombinujesz z tym Panel'em dynamicznych, gdyż na tym etapie programu to jest on zupełnie zbędny, ale powinieneś pamiętać, że obiekt dla którego deklaracja: TPanel* PanelX jak i definicja: PanelX = new TPanel(this); są tworzone wewnątrz jakiegoś zdarzenia/funkcji nie będzie dostępny poza tym zdarzeniem. To oznacza, że jeżeli tworzysz go w ten sposób w zdarzeniu onCreate, OnShow, czy w konstruktorze klasy, to tylko w tych zdarzeniach możesz się do niego odwoływać.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Mironas » poniedziałek, 9 lipca 2012, 18:12

Ten programik to tylko demonstracja DragAndDrop jaką zastosowałem w większym programie. Nie chciałem zaśmiecać wątku długimi źródłami więc przesłałem tylko przykładowe 'demo' problemu.

W docelowym programie co jakiś czas tworzę dynamicznie nowe komponenty (nie tylko w OnCreate) więc tak jak pisałem muszę dla każdego nowego komponentu użyć:
Kod: Zaznacz cały
PanelX->ControlStyle << csDisplayDragImage;

... co skutecznie rozwiązuje problem.

Pozdrawiam.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 lipca 2012, 18:17

Widzę, że orientujesz się w kodzie, czy jednak zdajesz sobie sprawę z tego:

mpsoft napisał(a):W docelowym programie co jakiś czas tworzę dynamicznie nowe komponenty (nie tylko w OnCreate)

Cyfrowy Baron napisał(a):tworzone wewnątrz jakiegoś zdarzenia/funkcji nie będzie dostępny poza tym zdarzeniem.


Bo wiele osób, często popełnia błąd wychodząc z założenia, że deklaracja lokalna wystarczy, by obiekt był dostępny globalnie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Mironas » poniedziałek, 9 lipca 2012, 18:34

Spoko.
Wskaźniki do nowych komponentów przechowuję w TList.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 lipca 2012, 19:10

A nie lepszy byłby kontener np. vector?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Znikająca miniatura Drag&Drop

Nowy postprzez Mironas » poniedziałek, 9 lipca 2012, 20:11

Czy lepszy? Wg mnie równie dobry, a TList jest (IMHO) prostszy w stosowaniu. Każdy może wybrać co lubi.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości