DBGrid

dział ogólny

DBGrid

Nowy postprzez seweryn » sobota, 11 lipca 2009, 12:12

Chciałbym aby zaznaczony wiersz tabeli (tak zwana zakładka) miał zielony kolor tła.
00.jpg


Zrobiłem to w ten sposób że w zdarzeniu ClientDataSetAfterScroll zapamiętuje klucz główny w zmiennej key typu int
Kod: Zaznacz cały
void __fastcall TmainForm::ClientDataSetAfterScroll(TDataSet *DataSet)
{
  key=ClientDataSetid->Value;
}


Następnie w zdarzeniu rysowania komórki zmieniam kolor tła na zielony jeżeli klucze się zgadzają
Kod: Zaznacz cały
void __fastcall TmainForm::zawodnicyDBGridDrawDataCell(TObject *Sender,
      const TRect &Rect, TField *Field, TGridDrawState State)
{
  zawodnicyDBGrid->Canvas->Brush->Color=zawodnicyDBGrid->Canvas->Brush->Color;
  if(key==ClientDataSetid->Value)
    zawodnicyDBGrid->Canvas->Brush->Color=clGreen;
  zawodnicyDBGrid->Canvas->FillRect(Rect);
  zawodnicyDBGrid->Canvas->TextOutA(Rect.Left,Rect.Top,Field->AsString);
}


Jest mały problem. Wszystko działa jeżeli poruszam się po tabeli strzałkami a klawiaturze ale gdy przekręcę scrollem na myszce to wyjeżdża niebieska ramka:
01.jpg


Co gorsza jeżeli w tym momencie nacisnę strzałkę na klawiaturze to pojawia się drugi oznaczony wiersz:
02.jpg


To samo dzieje się także bez kolorowania wiersza tzn pojawią się dwa czarne trójkąciki z lewej strony:
03.jpg


Idzie jakoś wyłączyć w moim programie scroll z myszki albo go obsłużyć żeby przełączał mi wiersze tak jak strzałki na klawiaturze?
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: DBGrid

Nowy postprzez seweryn » sobota, 11 lipca 2009, 22:00

Pewne rozwiązanie daje umieszczenie komponentu ApplicationEvents i obsługa zdarzenia OnMessage:

Kod: Zaznacz cały
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
  if(Msg.message==WM_MOUSEWHEEL)
  {
    Msg.message=WM_KEYDOWN;
    Msg.lParam=0;
    int i=Msg.wParam;
    if(i>0) Msg.wParam=VK_UP;
    else Msg.wParam=VK_DOWN;
    Handled=false;
  }
}


Tyle że działa to również na inne komponenty.
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: DBGrid

Nowy postprzez seweryn » niedziela, 12 lipca 2009, 10:26

Dodatkowo jeżeli chcemy nawigować po tabeli za pomocą własnych Buttonów to zamiast używać:
Kod: Zaznacz cały
mainForm->ClientDataSet->Prior();

mainForm->ClientDataSet->Next();


Należy używać odpowiednio:
Kod: Zaznacz cały
PostMessage(mainForm->zawodnicyDBGrid->Handle,WM_KEYDOWN,VK_UP,0);
PostMessage(mainForm->zawodnicyDBGrid->Handle,WM_KEYUP,VK_UP,0);

PostMessage(mainForm->zawodnicyDBGrid->Handle,WM_KEYDOWN,VK_DOWN,0);
PostMessage(mainForm->zawodnicyDBGrid->Handle,WM_KEYUP,VK_DOWN,0);


lub:

Kod: Zaznacz cały
mainForm->ClientDataSet->Prior();
mainForm->zawodnicyDBGrid->Refresh();

mainForm->ClientDataSet->Next();
mainForm->zawodnicyDBGrid->Refresh();


Aby nie było problemów z graffiką.
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: DBGrid

Nowy postprzez Cyfrowy Baron » niedziela, 12 lipca 2009, 11:35

Czy jeżeli zrobisz tak:

Kod: Zaznacz cały
void __fastcall TmainForm::zawodnicyDBGridDrawDataCell(TObject *Sender,
      const TRect &Rect, TField *Field, TGridDrawState State)
{
//  zawodnicyDBGrid->Canvas->Brush->Color=zawodnicyDBGrid->Canvas->Brush->Color; - teraz ten kod jest zbÄ™dny
  if(key == ClientDataSetid->Value)
  {
     zawodnicyDBGrid->Canvas->Brush->Color=clGreen;
     zawodnicyDBGrid->Canvas->FillRect(Rect);
     zawodnicyDBGrid->Canvas->TextOutA(Rect.Left,Rect.Top,Field->AsString);
  } // umieÅ›ciÅ‚em caÅ‚y blok w nawiasach bloku warunkowego
}


Rzecz w tym, że ten fragment:
zawodnicyDBGrid->Canvas->Brush->Color=zawodnicyDBGrid->Canvas->Brush->Color
w połączeniu z tym fragmentem:
if(key == ClientDataSetid->Value)
zawodnicyDBGrid->Canvas->Brush->Color=clGreen;

gdzie do warunku przypisana jest tylko pierwsza linijka czyli: zawodnicyDBGrid->Canvas->Brush->Color=clGreen;, gdyż brak nawiasów - może wywoływać nie tyle błędy ile nie taką jak oczekujesz realizację zadania.
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: DBGrid

Nowy postprzez seweryn » niedziela, 12 lipca 2009, 18:39

ten fragment akurat jest ok. W większości jest on skopiowany z:

http://cyfbar.republika.pl/stringgrid.html#grid4


Jeżeli zrobiłbym to w ten sposób:
Kod: Zaznacz cały
  if(key == ClientDataSetid->Value)
  {
     zawodnicyDBGrid->Canvas->Brush->Color=clGreen;
     zawodnicyDBGrid->Canvas->FillRect(Rect);
     zawodnicyDBGrid->Canvas->TextOutA(Rect.Left,Rect.Top,Field->AsString);
  } // umieÅ›ciÅ‚em caÅ‚y blok w nawiasach bloku warunkowego


to nie działało by mi to tak jak chcę bo mam tam dodatkowy warunek którego nie wklejałem żeby nie zaciemniać:
Kod: Zaznacz cały
void __fastcall TmainForm::zawodnicyDBGridDrawDataCell(TObject *Sender,
      const TRect &Rect, TField *Field, TGridDrawState State)
{
  zawodnicyDBGrid->Canvas->Brush->Color=zawodnicyDBGrid->Canvas->Brush->Color;
  if(key==ClientDataSetid->Value)
    zawodnicyDBGrid->Canvas->Brush->Color=clGreen;

  zawodnicyDBGrid->Canvas->FillRect(Rect);

  //////////////////////////////////////////////////////
  //sprawdza z innej tabeli ClientDataSet1///////////////////
  //////////////////////////////////////////////////////
  TBookmark bok=ClientDataSet1->GetBookmark();

  ClientDataSet1->Locate("nazwa",ClientDataSetklub->Value,Opts);
  if( ClientDataSet1licklubowa->Value=="Nie")
    zawodnicyDBGrid->Canvas->Font->Color=clRed;

  ClientDataSet1->GotoBookmark(bok);
  ClientDataSet1->FreeBookmark(bok);
  //////////////////////////////////////////////////////
   //////////////////////////////////////////////////////

  zawodnicyDBGrid->Canvas->TextOutA(Rect.Left,Rect.Top,Field->AsString);
}


Teraz po wszystkich poprawkach działa mi ok.

Mam jeszcze jedno pytanie:
Chciałem mój program uruchomić u kolegi. Podczas uruchamiania wyskoczył mi błąd ładowania biblioteki MIDAS.dll. Wyczytałem że trzeba:
1. Skopiować plik midas.dll do folderu system32
2. Zarejestrować go wpisując w wierszu poleceń: "regsvr32 midas.dll"

Jest możliwość w moim programie sprawdzenia czy ta biblioteka jest zarejestrowana i jeżeli nie to ją zarejestrować?
Czy mogę "wkąpilować" plik midas.dll w exe mojego programu, tak żebym w folderze miał jeden plik exe i on wszytko w sobie zawierał?
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: DBGrid

Nowy postprzez wargo » niedziela, 12 lipca 2009, 19:21

seweryn napisał(a):Czy mogę "wkąpilować" plik midas.dll w exe mojego programu, tak żebym w folderze miał jeden plik exe i on wszytko w sobie zawierał?

► patrz serwis: Cyfrowy Baron (Umieszczanie programu w programie)
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: DBGrid

Nowy postprzez Cyfrowy Baron » niedziela, 12 lipca 2009, 20:41

Możesz dołączać biblioteki umieszczając je w zasobach programu i wypakowując jeżeli brakuje.
Inna rzecz, jeżeli umieścisz bibliotekę DLL w katalogu z programem to efekt będzie taki sam jak z katalogem systemowym, gdyż program najpierw szuka potrzebnej biblioteki we własnym katalogu, a dopiero potem w katalogu systemowym.
Rejestracja biblioteki nie jest chyba konieczna, ale nie jestem pewien jak to jest z tÄ… konkretnÄ… bibliotekÄ….

Są programy które pozwalają spakować razem aplikację wraz z dołączonymi do niej bibliotekami, program może wtedy korzystać z takiej biblioteki bez wypakowywania jej, działa jako pojedynczy plik -> Exe Stealth Packer.
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: DBGrid

Nowy postprzez seweryn » niedziela, 12 lipca 2009, 22:51

Exe Stealth Packer - znalazłem tylko wersje Shareware



Fajna sprawa. Umieściłem sobie tak libmysql.dll ale niestety z midas.dll to nie działa.
W konstruktorze sprawdzam czy plik istnieje i jeżeli nie to wypakowuje:
Kod: Zaznacz cały
  AnsiString w=(AnsiString)getenv("WINDIR")+"\\system32\\";

  if(!FileExists(w+"midas.dll"))
  {
    ExtractExe(ID_APPL1,w+"midas.dll");
    ShellExecute(Application->Handle,"open","regsvr32",(w+"midas.dll").c_str(),"",SW_NORMAL);
  }

  if(!FileExists(w+"libmysql.dll")) ExtractExe(ID_APPL2,w+"libmysql.dll");



001.jpg


Sprawę chwilowo rozwiązałem w ten sposób że utworzyłem plik instalator.bat

Kod: Zaznacz cały
copy midas.dll %WINDIR%\system32\midas.dll
cd %WINDIR%\system32
regsvr32 midas.dll


Niestety nie zadowala mnie to. Spróbuje jeszcze coś pokombinować z programem konsowolym. Może on nie potrzebuje midas.dll.

Spróbuj przenieś do innego folderu plik c:\windows\system32\midas.dll
U mnie nawet builder ma problem z otworzeniem formy projetu.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: DBGrid

Nowy postprzez seweryn » niedziela, 12 lipca 2009, 23:18

Jeżeli instalator pliku midas.dll napisany jest w programie konsolowym to wszystko działa ok :)
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: DBGrid

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 13 lipca 2009, 08:11

Może zrób tak.
Umieść w zasobach programu plik midas.dll pod zmienioną nazwą np. midas.bak
Umieść go pod taką nazwą w zasobach programu.
Wypakuj go pod taką nazwą, następnie zmień nazwę ponownie na midas.dll
Zarejestruj go.
Napisz czy zadziałało.

NIe napisałeś czy umieszczenie pliku midas.dll w katalogu programu działa, wydaje mi się, ze nie ma konieczności umieszczania go akurat w katalogu systemowym.
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: DBGrid

Nowy postprzez seweryn » poniedziaÅ‚ek, 13 lipca 2009, 13:21

Problem był tak:
U mnie na komputerze program działa bez żadnych problemów.
Zawiozłem do kolegi na pen drive. Skopiowałem folder z programem na pulpit. W folderze znajdowały się pliki:
zawodnicy.exe
libmysql.dll
midas.dll
Po uruchomieniu programu (tego na pulpicie) wszystko zadziałało.
Gdy wyłączyłem program i wyciąłem pen driva ,a następnie ponownie chciałem uruchomić ten sam program(na pulpicie) to się wysypał komunikatem jak w wyższym poście.
Program o dziwo działał tylko przy włożonym pendrivie. Skopiowanie pliku midas.dll do katalogu system32 nie pomagało. Dopiero po uruchomieniu regsvr32 midas.dll program ruszył.
Teraz wystarczy żeby plik midas.dll był w którymś z katalogów: system32 lub katalog programu.

Po głębszej analizie okazało się że problemem nie jest aplikacja z formą tylko błąd generuje komponent ClientDataSet. W momencie gdy jego właściwość Active zmieniam z false na true, to program się wysypuje.
Rozwiązałem to tak:
1. Wszystkim komponentom bazodanowym ustawiłem właściwość Active=false w inspektorze obiektów.
2. W zdarzeniu formy OnCreate umieściłem kod:
Kod: Zaznacz cały
void __fastcall TmainForm::FormCreate(TObject *Sender)
{
  AnsiString w=(AnsiString)getenv("WINDIR")+"\\system32\\";
  if(!FileExists(w+"midas.dll"))
  {
    ExtractExe(ID_APPL1,w+"midas.dll");
    ShellExecute(Application->Handle,"open","regsvr32",(w+"midas.dll").c_str(),"",SW_NORMAL);
  }

  if(!FileExists(w+"libmysql.dll")) ExtractExe(ID_APPL2,w+"libmysql.dll");

  try
  {
    ZConnection->Connected=true;
    ZReadOnlyQuery->Active=true;
    ClientDataSet->Active=true;
    ZReadOnlyQuery1->Active=true;
    ClientDataSet1->Active=true;

  }
  catch(...)
  {
    ShowMessage("Nieudane podłączenie do bazy danych! Sprawdź czy dziaÅ‚a internet.");
    Application->Terminate();
  }
}


Teraz działa prawie idealnie. Jedyne co mi się jeszcze nie podoba to to, że linia kodu
Kod: Zaznacz cały
    ShellExecute(Application->Handle,"open","regsvr32",(w+"midas.dll").c_str(),"",SW_NORMAL);

generuje komunikat:
002.jpg

Idzie coś jakoś zamknąć ten komunikat automatycznie?
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: DBGrid

Nowy postprzez seweryn » poniedziaÅ‚ek, 13 lipca 2009, 13:26

Problem rozwiązany. Program regsvr32 wystarczy uruchomić z opcją /s co oznacza tryb cichy(bez komunikatów)
Kod: Zaznacz cały
  ShellExecute(Application->Handle,"open","regsvr32","/s",(w+"midas.dll").c_str(),SW_NORMAL);


Dziękuje wszystkim za pomoc.
Avatar użytkownika
seweryn
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): sobota, 11 lipca 2009, 10:42
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder 2010
    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ł: Google [Bot] i 4 gości