CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - DBGRID - numerowanie, zaznaczanie

DBGRID - numerowanie, zaznaczanie

Problemy związane z tworzeniem i zarządzaniem programami bazo-danowymi.
Regulamin działu


Zadając pytania dotyczące baz danych należy podawać szczegółowe informacje o bazie danych nad którą się pracuje, czyli:

  • Rodzaj serwera bazodanowego: MySql, MSSQL, Oracle itp.
  • Wersja bazy danych
  • Technologia bazodanowa używana w programie: ADO, DbExpress, InterBase
  • Komponenty użyte do zestawienia połączenia: ADOConnection, SqlConnection
  • Sposób zestawienia komponentów bazodanowych np. DataSet - DataSource - DbGrid lub DataSet - DataSetProvider - ClientDataSet - DataSource - DbGrid
  • Jeżeli używane były biblioteki innych firm niż Borland, CodeGeer i Embarcadero proszę podać ich nazwy, numer wersji i adres źródła.

DBGRID - numerowanie, zaznaczanie

Nowy postprzez admszczep » wtorek, 7 sierpnia 2012, 14:25

Witam,
Potrzebuje dwie funkcje w DBGrid podłączona baza jest na firebird:
1. Numerowanie rekordów
2. zaznaczanie rekordów do wydruku
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez rafalskraba » czwartek, 9 sierpnia 2012, 21:11

Witaj

ad 1) numerowanie rekordów - można to wykonać automatycznie poprzez odpowiednie zaprojektowanie bazy danych np. tworzysz pole w tablicy które ma wartość INT i jest automatycznie numerowane poprzez generator sql np:
Kod: Zaznacz cały
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.USERS_ID IS NULL) THEN
      NEW.USERS_ID = GEN_ID(USERS_USERS_ID_GEN, 1);
END;


ad 2) proponuję tak skonstruować zapytanie SQL, żebyś mógł wybierać interesujące cię rekordy z bazy danych, dobrą praktyką jest pobranie w/w rekordów do oddzielnej tablicy i umieszczenie jej wyników w QReport albo Rave. Ten drugi w pakiecie Embarcadero.
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez Mironas » piątek, 10 sierpnia 2012, 10:01

Numerowanie rekordów:
Do DataSet dodaj pole integer o nazwie np 'LP' i typie Calculated.
W DataSet OnCalcFields wpisz:
KOD cpp:     UKRYJ  
void __fastcall TForm1::IBDataSet1CalcFields(TDataSet *DataSet)
{
  IBDataSet1LP->AsInteger = DataSet->RecordCount;
}
 

Zaznaczanie rekordów:
DBGrid1 >> Options - włącz opcję 'dgMultiSelect'. Pozwoli to wybierać wiersze z użyciem klawiszy SHIFT i CTRL.
Zakładam, że w tabeli masz pole autonumerowane pole ID. Aby pozyskać wykaz zaznaczonych rekordów wzoruj się na funkcji:
KOD cpp:     UKRYJ  
String TForm1::WybraneIDy()
{
  // Zwraca wykaz wybranych ID-ow (multiselect)
  // ------------------------------------------
  int ilosc = DBGrid1->SelectedRows->Count;
  String wybrane;

  // jeden rekord
  if ( ilosc==0 && sqlTabela->RecordCount )
    wybrane = sqlTabelaID->AsString;

  // kilka rekordow
  else
  {
    TBookmark bm = sqlTabela->GetBookmark();
    if ( ! DBGrid1->SelectedRows->CurrentRowSelected )
      wybrane = wybrane + "," + sqlTabelaID->AsString;
    for (int i=0 ; i<ilosc ; i++)
    {
      sqlTabela->GotoBookmark((void *)DBGrid1->SelectedRows->Items[i].c_str());
      wybrane = wybrane + "," + sqlTabelaID->AsString;
    }
    wybrane.Delete(1,1);  // usun 1 przecinek
    sqlTabela->GotoBookmark(bm);
  }

  return wybrane;
}
 

Wydruk wybranych rekordów:
Wykonaj nowego select-a z filtrowaniem przez wykaz ID-ów zwróconych przez funkcję powyżej. Ten SELECT możesz zrobić na innym DataSet aby nie tracić aktualnego widoku na DBGrid.
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: DBGRID - numerowanie, zaznaczanie

Nowy postprzez Mironas » piątek, 10 sierpnia 2012, 10:34

Jeśli nie chcesz zaznaczać całych wierszy na DBGrid (multiselect) a wolisz w wybranym polu rysować 'ptaszka' po kliknięciu na tym polu, to działaj wg instrukcji:

Do DBGrid-a dodaj pole boolean o nazwie '_check' typu Calculated

DBGrid1DrawColumnCell(...)
KOD cpp:     UKRYJ  
  // Rysowanie CHECK BOX-a
  if ( Column->FieldName == "_check" )
  {
    int x = (Rect.right - Rect.left) / 2 + Rect.left - 5;
    int y = Rect.top + 2;
    // wypelnienie pola kolorem domyslnym tla
    DBGrid1->Canvas->Font->Color = DBGrid1->Canvas->Brush->Color;
    DBGrid1->DefaultDrawDataCell(Rect,Column->Field,State);
    // parametry check box-a
    DBGrid1->Canvas->Brush->Color = clWhite;
    DBGrid1->Canvas->Pen->Color = clBlack;
    DBGrid1->Canvas->Pen->Width = 2;
    // rysowanie pustego kwadratu
    DBGrid1->Canvas->Rectangle(x, y, x+12, y+12);
    // rysowanie 'X'
    if ( sqlTabela_check->AsBoolean ) //
    {
      DBGrid1->Canvas->MoveTo(x+2,y+2);
      DBGrid1->Canvas->LineTo(x+8, y+8);
      DBGrid1->Canvas->MoveTo(x+2,y+8);
      DBGrid1->Canvas->LineTo(x+8, y+2);
    }
  }
 

Po kliknięciu wybranej komórki zmieniasz wartość wo polu '_check' i przerysowujesz DBGrid-a:
DBGrid1->Repaint();
Powodzenia.
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: DBGRID - numerowanie, zaznaczanie

Nowy postprzez admszczep » sobota, 11 sierpnia 2012, 20:41

Dzięki chłopaki za odpowiedz. Co do numerowania to chodziło mi o numerowanie niewyświetlonych rekordów. Pole autoinc mam w każdej tabeli. ale po filtrowaniu itp. numery te są do niczego. Co do zaznaczania dzięki za kod. muszę ko przetestować
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez admszczep » sobota, 11 sierpnia 2012, 21:06

Hej nie wiem czy dobrze robię ale jest jakiś błąd albo robię coś nie tak ;)
Mironas napisał(a):Jeśli nie chcesz zaznaczać całych wierszy na DBGrid (multiselect) a wolisz w wybranym polu rysować 'ptaszka' po kliknięciu na tym polu, to działaj wg instrukcji:

Do DBGrid-a dodaj pole boolean o nazwie '_check' typu Calculated - to rozumiem mam dodać do tabeli

DBGrid1DrawColumnCell(...) - a ten kod do OnDrawColumnCell
KOD cpp:     UKRYJ  
  // Rysowanie CHECK BOX-a
  if ( Column->FieldName == "_check" )
  {
    int x = (Rect.right - Rect.left) / 2 + Rect.left - 5;
    int y = Rect.top + 2;
    // wypelnienie pola kolorem domyslnym tla
    DBGrid1->Canvas->Font->Color = DBGrid1->Canvas->Brush->Color;
    DBGrid1->DefaultDrawDataCell(Rect,Column->Field,State);
    // parametry check box-a
    DBGrid1->Canvas->Brush->Color = clWhite;
    DBGrid1->Canvas->Pen->Color = clBlack;
    DBGrid1->Canvas->Pen->Width = 2;
    // rysowanie pustego kwadratu
    DBGrid1->Canvas->Rectangle(x, y, x+12, y+12);
    // rysowanie 'X'
    if ( sqlTabela_check->AsBoolean ) //<span style="font-weight: bold">mam zdefiniować tą zmienną  sqlTabela_check jak tak to gdzie i jaką </span>
    {
      DBGrid1->Canvas->MoveTo(x+2,y+2);
      DBGrid1->Canvas->LineTo(x+8, y+8);
      DBGrid1->Canvas->MoveTo(x+2,y+8);
      DBGrid1->Canvas->LineTo(x+8, y+2);
    }
  }
 

Po kliknięciu wybranej komórki zmieniasz wartość wo polu '_check' i przerysowujesz DBGrid-a:
DBGrid1->Repaint(); i to nie wiem gdzie i jak dokładnie wstawić
Powodzenia.
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez admszczep » sobota, 11 sierpnia 2012, 21:57

WItam,
znalazłem już błąd ramki i x się rysują ale nie mogę poradzić sobie z zapisanie wartości dla pola _check ;/ proszę o pomoc
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez admszczep » sobota, 11 sierpnia 2012, 22:28

[quote="Mironas"]Numerowanie rekordów:
Do DataSet dodaj pole integer o nazwie np 'LP' i typie Calculated.
W DataSet OnCalcFields wpisz:
[CPP]
void __fastcall TForm1::IBDataSet1CalcFields(TDataSet *DataSet)
{
IBDataSet1LP->AsInteger = DataSet->RecordCount;
}
Numeracja działa idealnie tylko musiałem zmienić na:
SZUKAJLP->AsInteger = DataSet->RecNo;
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez Mironas » poniedziałek, 13 sierpnia 2012, 11:15

admszczep napisał(a):nie mogę poradzić sobie z zapisanie wartości dla pola _check

Jeśli '_check' jest typu Calculated to wartość tego pola zmieniasz w 'OnCalcFields'.
Można np trzymać w pamięci tablicę dwuwymiarową (albo TStringList) z informacją: id_rekortu=zaznaczenie. OnCalcFields jest wywoływane oddzielnie dla każdego rekordu. Dlatego w tym zdarzeniu sprawdzasz jaki jest ID rekordu, porównujesz z podręczną tablicą i wpisujesz wartość do pola. W tym przypadku nie używasz poleceń DataSet->Edit() i DataSet->Post().
Prawdopodobnie aby wywołać OnCalcFields dla wszystkich widocznych rekordów (odświerzanie) będziesz musiał wykonać:
KOD cpp:     UKRYJ  
DBGrid1->Repaint();
ale tego nie jestem pewny. Musisz sprawdzić.

admszczep napisał(a):
Mironas napisał(a):void __fastcall TForm1::IBDataSet1CalcFields(TDataSet *DataSet)
{
IBDataSet1LP->AsInteger = DataSet->RecordCount;
}

Numeracja działa idealnie tylko musiałem zmienić na:
SZUKAJLP->AsInteger = DataSet->RecNo;

TAK, masz rację - mój błąd.
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: DBGRID - numerowanie, zaznaczanie

Nowy postprzez admszczep » wtorek, 14 sierpnia 2012, 14:46

Witam,
możesz podpowiedzieć jak zdefiniować tą tabele aby była widoczna w dla tego pola ???
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez Mironas » wtorek, 14 sierpnia 2012, 15:03

Tabela widoczna dla pola - Co masz na myśli?
Chodzi ci o tabelę z bazy danych czy o podręczną TABLICĘ dwuwymiarową do przechowywania informacji o tym który rekord jest zaznaczony?
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: DBGRID - numerowanie, zaznaczanie

Nowy postprzez admszczep » czwartek, 16 sierpnia 2012, 12:38

Chodzi mi o tablice dwuwymiarową w której będę zapisywał, i po której później będę mógł wybrać rekordy, które zaznaczyłem
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: DBGRID - numerowanie, zaznaczanie

Nowy postprzez Mironas » czwartek, 16 sierpnia 2012, 13:15

Może to być zwykła tablica dwuwymiarowa:
int Tab[100][2];
gdzie 100 to maksymalna ilość rekordów.
Każdy wiersz tej tabeli ma 2 pola typu int. W pierwszym możesz zapisać ID rekordu, w drugim 1-zaznaczony, 0-niezaznaczony.
Jeśli nie znasz maksymalnej ilości rekordów to poczytaj o tablicach z nieokreślonym rozmiarem.

Inny (chyba prostszy) sposób to utworzyć strukturę:
Kod: Zaznacz cały
struct SELINFO
{
  int id;  // id rekordu
  bool select; // informacja czy rekord jest zaznaczony
}

Potem tworzysz vektor lub liste (STL) lub obiekt klasy TList. Dla każdego rekordu umieszczasz w nim element typu SELINFO (oczywiście nazwa dowolna).

Sposób trzeci - trochę dziwny ale IMHO najprostszy:
Zrób widoczny globalnie TStrings i zapisuj do niego tylko ID-y tych rekordów które są zaznaczone. Przy odznaczeniu rekordu usuń z TStrings wiersz z właściwym ID-em. Przy zaznaczeniu - dodawaj.
Utworzenie obiektu TStrings:
KOD cpp:     UKRYJ  
  // w Unit1.h:
  TStrings * lista
  // w OnCreate
  lista = new TStringList();
  // w OnDestroy
  delete lista;
  // dodanie wiersza
  lista->Add(IntToStr(id))
  // sprawdzenie czy na liście jest wiersz z danym ID:
  lista->IndexOf(IntToStr(id));  // zwraca indeks wiersza z ID lub '-1' jeśli nie ma wiersza
  // usunięcie wiersza zawierającego ID:
  int idx = lista->IndexOf(IntToStr(id));
  if ( idx > -1 )
    lista->Delete(idx);

Prawda że proste?
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 Bazy danych

Kto przegląda forum

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

cron