StringGrid - Pytanie

dział ogólny

StringGrid - Pytanie

Nowy postprzez Pitek » piÄ…tek, 30 października 2009, 19:27

Witam Mam pytanie. Czy istnieje polecenie które w pewnej sytuacji pominęło by daną komórkę np.
Kod: Zaznacz cały
if(StringGrid1->Cells[1][1]=="16")
{
pomiń(SringGrid21->Cells[2][3]);
}

Może wygląda to dziwnie ale jest mi to potrzebne do obliczania z dużo ilością wyjątków.
Tak jest w exelu.
Nie wiem dlaczego ale na komórkach można wykonać tylko jedno działanie np.
a=komórka1 * komórka2 bo a=komórka1 * komórka2 / komórka3 to już nie chodzi.
A to przykładowy kod z exela to co chciałbym zastosować w StringGrid
Kod: Zaznacz cały
=(JEŻELI(B4>0;$B$3*B4)+JEŻELI(C4>0;$C$3*C4) itd.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: StringGrid - Pytanie

Nowy postprzez Cyfrowy Baron » piÄ…tek, 30 października 2009, 19:58

Nic podobnego nie wyjdzie. TStringGrid to zwykła tabela i nic ponadto, chcesz więcej - sam musisz stworzyć odpowiednie funkcje i algorytmy.
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: StringGrid - Pytanie

Nowy postprzez Pitek » niedziela, 1 listopada 2009, 17:45

Nie potrafie wykombinować funkcji która sprawdzałaby czy w StringGrid1 wpisano 0 i pobierałaby wartość z wiersza 0 w kolumnie w której to zero sie pojawiło potem gdyby wystąpiło jeszcze jedno zero zmienna przechowująca wcześniejszą wartość musiałaby być dodana do tej nowej i take od 2 do 25 kolumny i od 1 do 40 wiersza niby takie proste ale nie wiem gdzie umieścić funkcję i jak dokładnie ją zapisać bo ciągle mam źle i nie robi tego co bym chcial.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: StringGrid - Pytanie

Nowy postprzez Cyfrowy Baron » niedziela, 1 listopada 2009, 19:27

Po pierwsze Twój wywód jest niezrozumiały, wiec nie wiem co jest Tobie potrzebne, chociaż TY zapewne doskonale wiesz czego chcesz, tylko nie potrafisz tak ubrać tego w słowa by inni również wiedzieli...

Po drugie cokolwiek chcesz pobrać z tabeli, porównać zawartość różnych komórek to musisz to robić komórka po komórce. Do zwracania zawartości komórki i wprowadzania wartości do komórki służy funkcja Cells:

StringGrid->Cells[numer komulny][numer wiersza]

Podałeś zakres kolumn 2 -> 25 i zakres wierszy 1 -> 40, więc sprawdzanie, porównywanie czy co tam jeszcze może odbywać się w dwóch pętlach for:

Kod: Zaznacz cały
for(int col = 2; col <= 25; col++) // 2 -> poczÄ…tkowa kolumna, 25 -> ostania kolumna
{
    for(int row = 1; row <= 40) row++)
    {

      String zmienna = StringGrid->Cells[col][row];
      if(zmienna == "jest coÅ› tam równa")
      {
        // to program coÅ› tam robi
      }
      else
      {
        // jeżeli nie jest równa to robi coÅ› innego
      }
    }
}


Oczywiście najrozsądniej jest stworzyć odpowiednie funkcje i klasy np. ze wskaźnikami na tabelę.

Swego czasu napisałem z wykorzystaniem tabeli TStringGrid program do obsługi bazy danych magazynu zajmującego się wydawaniem ubrań dla 500 pracowników firmy. Program przechowywał w osobnych kartach historię obsługi każdego pracownika, ale potrafił również sprawdzić kiedy (po jakim czasie z podaniem daty) danemu pracownikowi przysługuje nowa odzież robocza i informował o tym w odpowiednim czasie, Obsługiwał dokumenty PW, WW, WZ, ZZ i tworzył protokoły strat, oraz wiele innych. Żadna z funkcji, które zastosowałem nie znajdowała się w tabeli StringGrid, wszystko trzeba było mozolnie tworzyć, a zadanie było o tyle trudniejsze, że nie wykorzystałem żadnej z gotowych baz typu BDE, SQL itp.. Tak wiec to wszystko można zrobić, ale TStringGrid niczego nie ułatwi, dostarcza tylko obiekt podzielony na komórki, cała resztę trzeba sobie wymyślić.
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: StringGrid - Pytanie

Nowy postprzez Pitek » poniedziaÅ‚ek, 2 listopada 2009, 18:23

Ma pan rację jest mi bardzo ciężko ubrać to w słowa a co dopiero przedstawić w inny sposób i to mnie bardzo denerwuje że nie potrafie podzielić się problemem aby mi ktoś pomógł ale może oś wykombinuję w każdym razie narazie dziękuję !
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: StringGrid - Pytanie

Nowy postprzez Pitek » wtorek, 3 listopada 2009, 23:37

Mam pytanie. Czy po kliknięciu na przycisk mogę odnieść sie do ACol i ARow w if np.
Kod: Zaznacz cały
void __fastcall TForm1::StringGrid1SetEditText(TObject *Sender, int ACol, int ARow,
          const UnicodeString Value)



Kod: Zaznacz cały
if( (ACol >= 2 && ACol <= 25) && (ARow >= 1 && ARow <= 40) )
{

  if(StringGrid1->Cells[ACol][ARow] == "0")
{
Close();
}

Ale powyższy kod nie jest w zdarzeniu OnSetEditText tylko tak poprstu czy jestem w stanie zadeklarować zmienne w OnClick przycisku odnoszące się do ACol (kolumn) i ARow(wierszy) ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: StringGrid - Pytanie

Nowy postprzez Cyfrowy Baron » Å›roda, 4 listopada 2009, 08:21

W ten sposób nie jesteś w stanie odnieść się do komórek StringGrid. Musisz zadeklarować zmienne ACol i ARow, gdyż funkcja OnClick przycisku nie posiada takich argumentów jak np. funkcja OnSetEditText obiektu StringGrid, dlatego tworzenie zakresu w zdarzeniu OnClick nie ma sensu.
Możesz to zrobić tak:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int ACol = StringGrid1->Col;
  int ARow = StringGrid1->Row;

  if(StringGrid1->Cells[ACol][ARow] == "0")
  {
   Close();
  }
}


StringGrid1->Col i StringGrid1->Row odnoszą się do aktualnie zaznaczonej (wybranej) komórki obiektu StringGrid.
Jeżeli chcesz tworzyć zakres to musisz posłużyć się dwiema pętlami for:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for(int col = 2; col <= 25)
  {
    for(int row = 1; row <= 40; row++)
    {
     if(StringGrid1->Cells[col][row] == "0")
     {
      Close();
     }
   }
  }
}


Program zostanie zamknięty po napotkaniu pierwszej komórki zawierającej wartość 0, ale to oczywiście nie ma znaczenia czy to pierwsza komórka czy ostania, gdyż z Twojego przykładu wynika, że program ma zostać zamknięty gdy dowolna komórka z podanego zakresu zawiera wartość 0, więc przeszukiwanie całej tabeli nie ma sensu, wystarczy pierwsza napotkana komórka z wartością 0 by warunek został spełniony.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
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: StringGrid - Pytanie

Nowy postprzez Pitek » Å›roda, 4 listopada 2009, 23:46

Dokładnie o to mi chodziło bardzo dziękuję !!!
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    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 3 gości