Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Visual C++ - PictureBox, GC, Zaokrąglanie

revolt 05 Sep 2008 15:43 5553 12
  • #1
    revolt
    Level 34  
    A więc narazie mam 3 problemy (po 30 pkt za pomoc za rozwiązanie każdego):

    1.Mam picture boxa na formatce (na tabcontrolu dokładnie). Chciałbym, aby po kliknięciu na przycisk zmieniał się obrazek. Załadowałem pliki do Form1.resX ale teraz jak się do nich odwołać?

    
    this->pictureBox1->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox1.Image")));


    wyrzuca błędy
    Error 1 error C2143: syntax error : missing ';' before '->' d:\prog4\Form1.h 264

    Jak podmienić obrazek w pictureboxie?




    2. tworząc jakiś element za pomocą gcnew jest jakaś funckja niszcząca go jak na delete w kodzie niezarządzanym? Tworzę coś za pomocą gcnew, potem to niszczę ale w pamięci za pomocą delete, ale i tak zostaje




    3. Jak zaokrąglić liczbę do np. 3 miejsc po przecinku?
    richtextBox1->AppendText(System::Convert::ToString(Funkcja(double()))
    np na tym przykładzie?

    z góry dzięki za pomoc

    Moderated By krzychoocpp:

    Temat poprawiłem, proszę zapoznać się z regulaminem, punkt 11.

  • Helpful post
    #2
    Dr.Vee
    VIP Meritorious for electroda.pl
    Witam,

    Ad 3:
    
    double roundFractionalPlaces(double x, unsigned places)
    {
        double scaling = pow(10, places);
        return round(x * scaling) / scaling;
    }
    


    Pozdrawiam,
    Dr.Vee
  • Helpful post
    #3
    tzok
    Moderator of Cars
    Ad. 2:
    W kodzie zarządzanym zasadniczo nie usuwa się obiektów - tym zajmuje się garbage collector - usuwa obiekt (najczęściej w momencie alokacji nowego obiektu) kiedy żadna zmienna nie "trzyma" już referencji do tego obiektu. Jeśli bardzo Ci zależy na ręcznym zwalnianiu zasobów możesz zaimplementować w swojej klasie metodę Dispose().
  • Helpful post
    #4
    Morpheusss
    Level 16  
    Ad 1:
    Najpierw dodajesz ręcznie bitmapę do folderu resources w Solution Explorer. Odwołujesz się do tego następująco:

    System::Resources::ResourceManager^ rm = gcnew System::Resources::ResourceManager("ResourceClient.Images",System.Reflection.Assembly.GetExecutingAssembly());


    Picturebox1->Image = (Image^)rm->GetObject("twoj_obrazek.jpg");
  • #5
    revolt
    Level 34  
    Powiedzmy, że mam np. przycisk button1 na formatce głównej programu Kalkulator. Chciałbym np. przy wywoływaniu konstruktora jakiejś klasy zmienić napis na tym przycisku. I tu pojawia sie problem. Piszać kod pliku cpp klasy jak się odwołać do tego przycisku? Wpisanie button1 nic nie daje (np. intelisense ctrl+spacja nie widzi tego buttona). Wpisując Kalkulator::Form1::button1 jest jeszcze OK ale po dopisaniu -> nie wyświetla mi parametrów itp. buttona1. W jaki sposób to zrobić (i na odwrót jak odwołać się do wewnątrz klasy z poziomu Form1)?
  • Helpful post
    #7
    Morpheusss
    Level 16  
    masz klase X i z klasy X chcesz zmieniać opis przycisku?
    Aby zmienić opis przycisku, musisz mieć do niego referencje. Czyli w klasie X tworzysz sobie
    System::Windows::Forms::Button^ przycisk.
    Następnie, po utworzeniu instancji klasy X twojaklasa, z poziomu formy wywołujesz:
    twojaklasa.przycisk = Button1 (przycisk na formie)
    Potem w klasie X możesz się odwoływać bezpośrednio:
    przycisk->Text = "cośtam"
    Piszę z głowy, jeśli będą jakieś błędy przy kompilacji - powiedz. Napisz też coś więcej o tym co dokładnie chcesz zrobić, bo mój sposób prawdopodobnie jest naokoło :)
    Pozdrawiam!
  • Helpful post
    #8
    Krashan7
    Level 17  
    revolt wrote:
    3. Jak zaokrąglić liczbę do np. 3 miejsc po przecinku?

    Pomnożyć przez 1000, uciąć część ułamkową, podzielić przez 1000. Aby być w pełni w zgodzie z matematycznymi regułami zaokrąglania, można po pomnożeniu przez 1000 dodać do liczby 0.5 (albo -0.5, jeżeli liczba jest ujemna).
  • #9
    revolt
    Level 34  
    No i kolejny problem

    
    
    private: System::Void toolStripButton1_Click_1(System::Object^  sender, System::EventArgs^  e) {
    			
    				
    
    for (int j=0; j<5; j++)
    			 {
    
    				 for (int w=0;w<=treeView1->Nodes[j]->LastNode->Index;w++)
    				 {
    					 if(tabControl1->SelectedTab->Text==treeView1->Nodes[j]->Nodes[w]->Text)
    					 {
    						// MessageBox::Show(treeView1->Nodes[j]->Nodes[w]->Text);
    						 treeView1->Nodes->Remove(treeView1->Nodes[j]->Nodes[w]);
    					 }
    						 
    				 }
    			 }
    		 }
    



    treeView1->Nodes->Remove(treeView1->Nodes[j]->Nodes[w]);

    wyrzuca mi

    An unhandled exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll
    
    Additional information: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.
    


    Jaka może być tego przyczyna? (np. message boxa ładnie pokazuje ta pętla więc z nią wszystko jest OK)
  • Helpful post
    #10
    Dżyszla
    Level 42  
    A są wszystkie węzły w treeview utworzone w momencie wykonywania kodu? Ponadto zwróć uwagę, że podczas usuwania wprowadzasz totlany bałagan w przeglądaniu... Usuwa się albo od końca, albo przy użyciu pętli while i ręcznej inkrementacji licznika wyłącznie w momencie, gdy element nie jest usuwany przez wzgląd na reindeksację po każdym usunięciu.
  • Helpful post
    #11
    Morpheusss
    Level 16  
    sprawdź dla jakiego w program się wysypuje. Dorzuć break; pod linijką treeView1->Nodes->Remove(treeView1->Nodes[j]->Nodes[w]);
    Trudno mi jest wyczaić z kodu co się może sypać. Visual Studio ma świetny debugger, dzięki któremu znajdowanie byków idzie bardzo szybko :)
  • #12
    revolt
    Level 34  
    Ok. I chyba ostatni problem. Obrazek w picboxie zmieniam jedna w ten sposób:
    this->pictureBox1->Image=Image::FromFile("XXX.jpg");

    Wszystko pięknie ładnie dopóki nie zapiszę danych do pliku. Po tej operacji obrazki nie chcą się ładować. Co ciekawe jeżeli zapiszę plik w folderze w którym znajdują się obrazki wszystko jest OK.
  • Helpful post
    #13
    Morpheusss
    Level 16  
    hm.. jedyne co przychodzi mi do głowy - zamykasz plik po zapisie? zasadniczo nie powinno to mieć wpływu na ładowanie obrazka do kontrolki ale... zgodnie z prawem murphyego.. ;) Wysypuje Ci się program, czy po prostu nie przypisuje sie obrazek?