Konwersja zmiennej String na TStringGrid

dział ogólny

Konwersja zmiennej String na TStringGrid

Nowy postprzez szprotek » niedziela, 27 wrzeÅ›nia 2009, 10:43

Potrzebuję nadać nazwy zmiennym TStringGrid w pętli.
Oczywiście coś takiego TStringGrid *Sgr = zmiennastring nie zadziała.
Pewnie jest jakiś sposób aby przekonwertować zmienną String na nazwę zmiennej TString
Ostatnio edytowano środa, 30 września 2009, 12:26 przez Cyfrowy Baron, łącznie edytowano 2 razy
Powód: Błąd w nazwie obiektu w tytule tematu. Zmieniono TStringGrig na TStringGrid
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrig

Nowy postprzez wargo » niedziela, 27 wrzeÅ›nia 2009, 11:47

TStringGrid to jest komponent tworzÄ…cy tabelkÄ™ w programie.

Poczytaj te porady:
http://cyfbar.republika.pl/stringgrid.html aby dowiedzieć się więcej
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrig

Nowy postprzez Cyfrowy Baron » niedziela, 27 wrzeÅ›nia 2009, 14:55

Potrzebuję nadać nazwy zmiennym TStringGrid w pętli.


TStringGrid to klasa nie zmienna.

Chcesz nadać nazwy obiektom utworzonym w oparciu o klasę TStringGrid, czyli chcesz tworzyć obiekty dynamicznie.
Można to zrobić, ale zarządzanie tym będzie stanowić już duży problem. Ta kwestia byłą juz wielokrotnie poruszana na tym forum i nie chce mi się tego wszystkiego powtarzać.

Prosty przykład:
Kod: Zaznacz cały

TStringGrid *Tabela;

for(int i = 0; i < 10; i++)
{
   Tabel = new TStringGrid(this);
   Tabel->Parent  = this;
   Tabela->Name = "Tabela_" + (String)i;
}

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
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrig

Nowy postprzez szprotek » wtorek, 29 wrzeÅ›nia 2009, 21:55

Nie chodzi mi o dynamiczne tworzenie obiektów tylko o wprowadzanie różnych danych do kilku już istniejących stringgridów z jednej pętli
Próbowałem coś takiego:
Kod: Zaznacz cały
TStringGrid *SGr;

for(int i = 0; i < 10; i++)
{
   SGr->Name = "StringGrid" + (String)i;
}

niestety uruchomienie tego zawiesza mi program i nie wiem co z tym zrobić :roll:
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrig

Nowy postprzez Cyfrowy Baron » Å›roda, 30 wrzeÅ›nia 2009, 08:54

Jak wprowadzić dane do StringGrid. Czy chcesz wypełniać komórki obiektu StringGrid?

Jeżeli masz kilka obiektów typy TStringGrid to do każdego musisz wprowadzać dane oddzielnie. Można by siÄ™ posÅ‚użyć przypisaniem polimorficznym i funkcja FindComponent ( ► patrz serwis: Cyfrowy Baron dziaÅ‚: teoria -> Rzutowanie typów, przypisanie polimorficzne) by wypeÅ‚niać komórki obiektu, ale to i tak trzeba robić oddzielnie do każdego obiektu, a nie hurtem.

Właściwość Name obiektu StringGrid to jego nazwa, której nie należy od tak sobie zmieniać.

Kod: Zaznacz cały
SGr->Name = "StringGrid" + (String)i;


To c o tutaj napisałeś to próba zmiany nazwy obiektu SGr na nową.

a to:

Kod: Zaznacz cały
TStringGrid *SGr;


to deklaracja obiektu SGr typy TStringGrid, ale bez definicji obiekt nie będzie istniał. Poza tym tak właśnie tworzy się obiekty dynamicznie. Do tego potrzebna jest jeszcze definicja>

Kod: Zaznacz cały
// deklaracja obiektu:
TStringGrid *SGr;

//definicja obiektu:
SGr = new TStringGrid(this);
SGr->Name = "StringGrid1"; // można nie stosować, obiekt automatycznie przyjmie nazwę SGr
SGr-Parent = this;
SGr->LEft = 8;
SGr->Top = 8;


Przemyśl co chcesz zrobić i opisz to dokładnie.
Jeżeli chcesz wypełnić komórki obiektu StringGrid różnymi danymi to musisz robić to dla każdego obiektu oddzielnie, gdyż w przypadku obiektu StringGrid nie można zastosować przypisanie, typu: StringGrid1 = StringGrid2, zresztą jak w każdym innym obiekcie, można co najwyżej: StringGrid1->Cells[0][0] = StringGrid2->Cells[0][0];
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
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrig

Nowy postprzez szprotek » Å›roda, 30 wrzeÅ›nia 2009, 11:23

w takim razie pozostaje mi zrobić to na wyrażeniach warunkowych

Kod: Zaznacz cały
TStringGrid *SGr;
for(int i=1; i<10; i++)
{
  if(i==1)SGr = StringGrid1;
  if(i==2)SGr = StringGrid2;
   
  SGr->Cells[2][5] = zmiennastring;
  ITD...
}



Tak chyba będzie w takim razie najprościej

W każdym razie wielkie dzięki za pomoc
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrid

Nowy postprzez Cyfrowy Baron » Å›roda, 30 wrzeÅ›nia 2009, 12:15

Ja nie widzę sensu w tym kodzie, ale jestem już po dwóch piwach i to może dlatego...

ten zapis może równie dobrze wyglądać tak:

Kod: Zaznacz cały
for(int i = 0; i < 10; i++)
{
  if(i == 1)
   dynamic_cast<TStringGrid *>(FindComponent("StringGrid" + (String)i))->Cells[2][5] = zmiennaString_1;

  if(i == 2)
   dynamic_cast<TStringGrid *>(FindComponent("StringGrid" + (String)i))->Cells[2][5] = zmiennaString_2;
}


Tylko czemu to ma służyć..?!

Równie dobrze może to wyglądać tak:

Kod: Zaznacz cały
   StringGrid1->Cells[2][5] = zmiennaString_1;
   StringGrid2->Cells[2][5] = zmiennaString_2;


efekt ten sam, a o ile prościej...

Opisz do czego dokładnie zmierzasz, prawdopodobnie istnieje proste rozwiązanie problemu, ale Ty próbujesz zrobić to jakąś okrężną drogą...
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
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrid

Nowy postprzez szprotek » Å›roda, 30 wrzeÅ›nia 2009, 20:26

Mam w programie 7 StrinGridów - taka relacyjna baza danych. Potrzebowałem napisać funkcję, która wykona kilkadziesiąt identycznych operacji dla każdego z nich, jak naprzykład wyszukiwanie pewnych danych i określonych wyników obliczeń a następnie wygenerowanie raportów. Dlatego najprościej to zrobić w pętli a nie powtarzać to samo dla każdego Stringgrida.
:w
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrid

Nowy postprzez Cyfrowy Baron » Å›roda, 30 wrzeÅ›nia 2009, 20:44

Niezależnie od tego co robisz na obiektach, musisz robić to na każdym obiekcie oddzielnie. Powtarzanie kodu dla każdego obiektu typu TStringGrid rzeczywiście jest mało efektywne, ale od czego masz funkcje. Napisz funkcję, która jako argument będzie pobierała wskaźnik na obiekt typu TStringGrid i będzie wywoływać ją, dla każdego obiektu.

Można to zrobić na trzy sposoby:

Kod: Zaznacz cały
void __fastcall TForm1::Funkcje(TStringGrid *aStringGrid)
{
aStringGrid->... coÅ› tam...
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Funkcja( StringGrid1 );
  Funkcja( StringGrid2 );
  Funkcja( StringGrid3 );
  Funkcja( StringGrid4 );
  Funkcja( StringGrid5 );
  Funkcja( StringGrid6 );
  Funkcja( StringGrid7 );
}


z wyszukiwaniem komponentów
Kod: Zaznacz cały
void __fastcall TForm1::Funkcje(TStringGrid *aStringGrid)
{
  aStringGrid->... coÅ› tam...
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for(int i = 1; i <= 7; i++)
  {
    Funkcja( dynamic_cast<TStringGrid *>(FindComponent("StringGrid" + (String)i))->Cells[2][5] );
  }
}


wyszukiwanie obiektów w oparciu o nazwę klasy:
Kod: Zaznacz cały
void __fastcall TForm1::Funkcje(TStringGrid *aStringGrid)
{
  aStringGrid->... coÅ› tam...
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TComponent *Temp;
   int count = this->ComponentCount - 1;
   for(int i = count; i > -1; i--)
   {
    Temp = this->Components[i];

    if(Temp->ClassNameIs("TStringGrid"))
    {
      Funkcja( dynamic_cast<TStringGrid *>(Temp) );
    }
   }
  }
}
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
    NieznanyNieznana

Re: Konwersja zmiennej String na TStringGrid

Nowy postprzez szprotek » Å›roda, 30 wrzeÅ›nia 2009, 22:12

zastosuję to pierwsze. Przy 7 stringgridach będzie to najprostsze i najbardziej czytelne

Jeszcze raz dzięki za pomoc.
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    NieznanyNieznana


  • 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 26 gości

cron