logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak połączyć własne klasy z TForm w Borland C++ Builder?

kossak21 29 Gru 2008 20:26 2210 10
REKLAMA
  • #1 5920347
    kossak21
    Poziom 12  
    Posty: 19
    Pomógł: 1
    Mam napisany program są to 3 klasy, które chciałbym wykorzystać w aplikacji okienkowej. Jestem początkujący wiem, że muszę załączyć plik z klasami, ale czy coś oprócz tego należy zrobić aby móc wykorzystywać własne klasy? Po załączeniu sytuacja wygląda tak, że borlad połączył oba pliki, ale nie mogę korzystać z klas, wiem że coś pominąłem ale nie wiem co?? Jeżeli ktoś mógłby napisać jak powinno wyglądać poprawne połączenie, co powinno zawierać, byłbym wdzięczny.
  • REKLAMA
  • #2 5921456
    szeryf.rm
    Poziom 22  
    Posty: 639
    Pomógł: 16
    Ocena: 28
    Łączenie jest trywialne, polecam sprawdzić na czymś prostym najpierw, np. zwykła klasa, która nic nie robi a jedynie zwraca przy pomocy jakiejś funkcji wartość, którą wpisujesz do labela na próbę. Jak zrobisz coś prostego i nie uda ci się połączyć to spakuj i wystaw na elektrodę. Bez tego dyskusja będzie przebiegać na zasadzie "mi to nie działa", "zrób tak", "mi to nie działa" itd. No chyba, że ktoś łaskawy dla ciebie sam wystawi gotowy projekt na próbę :).
  • #3 5926615
    pan_kotek
    Poziom 20  
    Posty: 561
    Pomógł: 12
    Ocena: 114
    Ja się też podepnę bo problem mam podobny.

    Mam klasę kwadrat
    
    class kwadrat{
    public:
    int tx1,tx2,ty1,ty2;
    };
    


    mam pierwszy kwadrat i wskaźnik do niego
    
    kwadrat pierwszy;
    kwadrat *p=&pierwszy;


    mogę mu nadać nowe wartości
    
    p->tx1=10; //dziala
    p->ty1=50;
    p->tx2=10;
    p->ty2=50;

    mogę wyświetlić w polach Edit

    
       Edit1->Text=p->tx1; //dziala
       Edit2->Text=p->ty1;
       Edit3->Text=p->tx2;
       Edit4->Text=p->ty2;


    ale nie działa wyświetalanie tego kwadratu na Canvas
    
    Image1->Canvas->Rectangle(p->tx1,p->ty1,p->tx2,p->ty2);
    


    jak mogę w inny sposób wyświetlić ten kwadrat?
  • REKLAMA
  • #4 5926948
    szeryf.rm
    Poziom 22  
    Posty: 639
    Pomógł: 16
    Ocena: 28
    pan_kotek, a co tu może nie działać? :P
    Możesz mieć kolor zły ustawiony w Image1->Canvas,
    Możesz mieć Image1->Visible = false zamiast true i parę innych rzeczy. Umieść tutaj źródło, bo twój problem jak tak banalny, że chyba nikt ci nie powie bez kodu, bo wiara nie sięga tak daleko :P

    A tak na poważnie to dajcie kody źródłowe prostych programów. Przecież to 5 minut roboty.
  • REKLAMA
  • #5 5952538
    kossak21
    Poziom 12  
    Posty: 19
    Pomógł: 1
    A wiec tak wracając do mojego problemu, wrzucę kawałek kodu z klasą list:


    // lista - wersja obiektowa
    
    #include <iostream.h>
    #include <string.h>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    class item
    { public:
    	char name[30];
    	item *next;
    };
    
    class list
    {
     private:
    	item *head;
     public:
     	list(); // konstruktor
            list(list &l); // konstruktor kopiujacy
    	~list(); // destruktor
    
    	void dodaj(char *f);
     	void dodaj_na_koniec(char *f);
     	void usun(char *f);
            void wyszukaj(int x, char *f);
            int  wyszukaj(char *f);
            void wyswietl(void);
    	list operator=(list l);
            list operator+(char *f);
    
            list operator-(char *f);
    
            void operator+=(char *f);
    
    	void operator-=(char *f);
    
    
            void sortuj(void);
    	void porzadek(char *f);
    
    }; 


    pomijam definicje funkcji, bo program na aplikacji dos śmiga.
    Co w taki razie trzeba zrobić, aby to działało w okienkach. Jak stworzyć hierarchie plików? Przykładowo żeby wpisać jakieś nazwisko do listy za pośrednictwem EDIT. Jak odwołać się do swoich funkcji w klasie, bo przez this nie działa, są dostępne wszystkie opcje, bottony itp ale nie moje klasy dołączone. Tak to wygląda jakby nie były znane przez tą część programu.
  • REKLAMA
  • #6 5953769
    pan_kotek
    Poziom 20  
    Posty: 561
    Pomógł: 12
    Ocena: 114
    a moj problem wygląda tak:
    
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    int tx1=0,tx2=0,ty1=0,ty2=0;
    class kwadrat{
    public:
    int tx1,tx2,ty1,ty2;
    };
    TForm1 *Form1;
    kwadrat pierwszy;
    kwadrat *p=&pierwszy;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner){}
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {Image1->Canvas->Rectangle(p->tx1,p->ty1,p->tx2,p->ty2);}
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    p->tx1=10;
    p->ty1=50;
    p->tx2=10;
    p->ty2=50;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
       Edit1->Text=p->tx1;
       Edit2->Text=p->ty1;
       Edit3->Text=p->tx2;
       Edit4->Text=p->ty2;
    }
    //---------------------------------------------------------------------------
    

    button 1 wpisuje wartosci do obiektu klasy kwadrat (czytam symfonię C++)
    button2 powinien rysować kwadrat a nie rysuje
    button 3 wyświetla jakie są wartości tx1..tx2 w kwadrat pierwszy
  • #7 5954737
    szeryf.rm
    Poziom 22  
    Posty: 639
    Pomógł: 16
    Ocena: 28
    pan_kotek zlituj się i zamieść pełen projekt. Ten kod jest poprawny i u mnie działa. Idę o zakład że twój image, jest super wymiarów, jest widoczny itd. U mnie jest dobrze, więc działa, ale u ciebie za pewne nie jest dobrze, więc nie działa. Jak zamieścisz spakowany CAŁY projekt to będzie w łatwiej znaleźć błąd, bo tutaj wszystko jest ok.

    kossak21 Twój konstruktor kopiujący bije po oczach. Polecam ci sprawdzić jak on działa i napisać go poprawnie.
    Operatory - dawno nie widziałem takich dzieł jak u ciebie. Ciekawe parametry przekazujesz i ciekawe zwracasz. Polecam ci poczytać nt. jezyka C++. Podejrzewam, że dlatego masz problem, bo po prostu ten język nie jest ci do końca znany i nie wszystko w nim jest dla ciebie zrozumiałe. Miejscami masz po prostu problemy z krótkowzrocznością podczas pisania.
    
    Klasa(const Klasa &o) - kopiujący
    Klasa& operator=(const Klasa &o) 
    Klasa& opeartor+=(const Klasa &o) 
    Klasa& operator-=(const Klasa &o)
    

    W wyjątkowych sytuacjach += i -= wyglądają inaczej i dotyczy to przypadków kiedy zwracane jest coś innego, ale to naprawdę rzadkość.

    Jak się uczysz C++ to zainteresuj się nim dokładniej. W C++ są już napisane listy, kolejki, tablice, które mają wiele wiele fajnych rzeczy. Wszystko to tkwi ukryte pod hasłem STL. Poszukaj a wiele się dowiesz.

    Natomiast tutaj popraw wszystko i tak jak kolega przedstaw kod w postaci całego spakowanego projektu. Inaczej po tym co napisałeś, wiem jedynie że nie czujesz się dobrze w c++ i nic więcej powiedzieć nie mogę. Jakby był projekt to dałoby się więcej.
  • #8 5956308
    kossak21
    Poziom 12  
    Posty: 19
    Pomógł: 1
    Faktycznie całkiem możliwe, że jest tak jak mówisz, ale mimo to kod programu działa, a klasa jest założeniem zadania, które dostałem od prowadzącego doktora, ja zaczynam z tym językiem i wcale nie twierdze, że znam się na tym, dlatego pisze w takim dziale. Ale dziękuje za zwrócenie uwagi na błędny zapis, zobaczę czy to coś zmieni. Postaram się w najbliższym czasie zamieścić coś więcej. Thx pozdro.
  • #9 5957558
    pan_kotek
    Poziom 20  
    Posty: 561
    Pomógł: 12
    Ocena: 114
    OK załączam cały spakowany projekt.
    Okno jest małe jest na nim "Image" po którym staram się rysować oraz
    4 przyciski.
    "wpisz dane" wpisuje dane do klasy kwadrat tx1...ty2
    "rysuj" powinien narysować kwardat zrobiony z elementów tej klasy
    "na edit" wyświetla aktualne wartosci tx1...ty2(z klasy)
    ''prost" rysuje testowy kwadracik w bliskiej odleglosci
    Załączniki:
    • elektroda.rar (338.04 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 5959788
    szeryf.rm
    Poziom 22  
    Posty: 639
    Pomógł: 16
    Ocena: 28
    Po piewsze. Szanowny kolega pan_kotek załużył na uwagę negatywną. Ten trywialny projekt idzie spakować do 22kB!! a nie 338kB!! Druga uwaga to nie pakuj w rar, jeśli naprawdę nie musisz. Rób lepiej zip.

    A program nie działa ci, bo nie myślałeś co piszesz. Parametry które podajesz to współrzędne dwóch punktów. Pierwszy z nich to jeden wierzchołek prostokąta, drugi to wierzchołek po przekątnej tego prostokąta. Dla klawisza "Prost" zrobiłeś dobrze, ale dla klawisza "Wpisz dane" już nie. Zobacz jakie współrzędne mają punkty twojego kwadratu.

    Za to, że musiałem ściągnąć ten plik, ty poklikaj na "Pomógł". Jako zadanie domowe, udowodnij, że można spakować bezstratnie cały projekt do 22kB. A jak tego dokonać, to już pomyśl sam.
  • #11 5961347
    pan_kotek
    Poziom 20  
    Posty: 561
    Pomógł: 12
    Ocena: 114
    Można,fakt niepotrzebnie spakowałem plik *.tds to ponad 2M.

    Jeszcze raz wielkie dzięki ,mój głupi błąd wpisywałem wartości nie tam gdzie trzeba.

Podsumowanie tematu

✨ Dyskusja dotyczy integracji własnych klas C++ z formularzem TForm w środowisku Borland C++ Builder. Autor pyta, jak poprawnie dołączyć i wykorzystać własne klasy w aplikacji okienkowej, gdyż po załączeniu plików z klasami nie może z nich korzystać. W odpowiedziach podkreślono, że samo dołączenie pliku nagłówkowego to za mało – konieczne jest poprawne zdefiniowanie i użycie klas oraz ich instancji w kontekście formularza. Przykładowo, problem z rysowaniem obiektu klasy kwadrat na komponencie Image wynikał z błędnego przypisania współrzędnych prostokąta. Zalecano sprawdzenie widoczności i właściwości komponentu Canvas, a także poprawne ustawienie parametrów rysowania. Wskazano również na potrzebę przesłania pełnego, działającego projektu w celu dokładnej analizy błędów. Poruszono kwestie konstruktorów kopiujących i operatorów przeciążonych w klasach, które mogą powodować problemy, jeśli są niepoprawnie zaimplementowane. Ostatecznie problem z rysowaniem kwadratu rozwiązano przez poprawne przypisanie wartości współrzędnych i właściwe użycie komponentów VCL. Dyskusja zawierała także uwagi dotyczące optymalizacji rozmiaru spakowanego projektu i formatu archiwum.
Wygenerowane przez model językowy.
REKLAMA