[ ITman @ 02.12.2004. 18:28 ] @
Situacija: Imamo jednu formu koja ima DBGrid gde su putanje video zapisa (.avi), na OnClick događaju DBGrida imamo kod koji kaže:ako je selektovano polje Path_V onda enable-uj dugme ''Brisanje'', a na OnDoubleClick imam sličan kod sa dodatkom da se otvori nova forma koja ima WindowsMediaPlayer ActivX komponentu koja pušta odabrani film pomoću koda u OnShow event-u forme.

Problem: Sve to lepo radi na četiri PC-ja sa XP Pro OS-om ali na petom (za koji je program namenjen) ne radi! Kada kliknem na DBGrid ne izvršava se procedura (tj. ne otključava btnDelete) a takođe ne radi ni event OnDoubleClick DbGrid-a (ne pušta film u novom prozoru) + ne prijavljuje gresku + ne skuca program + sve ostale funkcije programa rade normalno!?

Imali koga da pomogne sa nekim tip-om?
[ Rapaic Rajko @ 03.12.2004. 14:18 ] @
Prepostavljam da je ovo klasican slucaj koriscenja 'bezimenog' try-except-end bloka. Negde se desava greska, ali posto u except delu NEMA NISTA (no code) stvar izgleda misteriozna. Savet: ili stavi ShowMessage u except deo i ispisi javno poruku greske, ili izbaci try-except-end i pusti da exception dodje do Application exception handler-a. U ovom drugom slucaju zakaci event Application.OnException i tu ispisi gresku u neki logger fajl. U ovom drugom slucaju, user nece nista videti, ali ces ti moci da 'vratis film' i eventualno resis problem.

Rajko

P.S. Ako se ispostavi da STVARNO nema greske, onda tu ima malo voodoo-a by XP. I inace je XP sacuvaj boze.
[ morlic @ 03.12.2004. 16:04 ] @
Da dodam na Rajkovo izlaganje:

Dodaj showmessage(ili neki vid logovanja) u event metodima grida kako bi znao sigurno da nisu pozvani.

Da li koristis DBGrid koji dolazi uz Delphi ili je neka dodatna komponenta?


P.S. Ne bih optuzio WinXP tako lako za tu vrstu problema.
[ ITman @ 03.12.2004. 17:57 ] @
Hvala Vam na pokušaju, ali ne nema try catch blokova...Prvo sam mislio da je do verzije WMPlayer-a, pošto sam na mom kompu importovao WMP10 a tom kompu gde ne radi je bio WMP9, pa sam i tamo stavio novu verziju i opet isti problem. Znaci nije to, ali fora je što meni neće da radi onclick event na običnom DBGridu, tek kada bi se odradio taj event otvorila bi se nova forma gde je WMPlayer, znači DBGrid je problem?! I to samo na jednom računaru dok na četiri druga radi!! Pitam se šta bi to moglo biti....ali što je još čudnije imam ja još DBGridova u istom programu i oni ne prave problem na OnClick događajima i rade na svim kompovima....Možda da napravim formu i kod iz početka?
[ morlic @ 03.12.2004. 20:04 ] @
Vidi, prvo treba utvrditi da sta se od dogadjaja poziva a sta ne...Da li je wmplayer problem to mozes da proveris na drugi nacin. To je sada najbitnija stvar.

Ako se na tvojoj masini poziva OnClick, znaci da mora i na drugim. Pitanje je sta jos imas od prateceg koda koji mozda ima neku zavisnost koja se ispoljava bas na toj problematicnoj masini.

Kada stavis proveru za dogadjaj javi rezultat pa da vidimo.
[ Srki_82 @ 04.12.2004. 00:35 ] @
Postuj OnClick dogadjaj za tu problematicnu kontrolu da uradimo review koda ;)
[ ITman @ 04.12.2004. 14:26 ] @
Tu se nalazi kod oba Event-a i kod dugmeta btnDelete:

procedure TfrmSnimciGrid.VideoGridCellClick(Column: TColumn);
begin
If VideoGrid.SelectedField.FullName='Path_v' then
begin
edtDelete.Text:=VideoGrid.SelectedField.AsString;
btnDelete.Enabled:=true;
end;
end;

procedure TfrmSnimciGrid.btnDeleteClick(Sender: TObject);
begin
if FileExists(edtDelete.Text) then
begin
if MessageDlg('Da li stvarno zelite da izbrisete ' + ExtractFileName(edtDelete.Text) + '?',mtConfirmation,[mbYes, mbNo],0)=IDYes then DeleteFile(edtDelete.Text);
qDelete.Parameters.ParamValues['putanja']:=edtDelete.Text;
qDelete.ExecSQL;
end
else Showmessage ('Fajl nije izbrisan - ne nalazi se na disku!');

end;


procedure TfrmSnimciGrid.VideoGridDblClick(Sender: TObject);
Var VP:TfrmVideoPlayer;
begin
If VideoGrid.SelectedField.FullName='Path_v' then
begin
PathV.Text:=VideoGrid.SelectedField.AsString;
if not FileExists(PathV.text) then
begin
Showmessage('Fajl ne postoji na kompjuteru, ubacite odgovarajuci disk u CD ROM sa fajlom:'+pathV.Text);
btnUcitajVideo.Visible:=true;
end
else
begin
PathV.SelectAll;
PathV.CopyToClipboard;
VP:=TfrmVideoPlayer.create(frmSnimciGrid);
VP.show;
end;
end;
end;
[ Srki_82 @ 05.12.2004. 00:51 ] @
Deluje kao da je sve ok. Mozda je na tom Win na kojem nece da radi program DblClick podesen na jako brzo u Control Panel-u pa nikad ni ne detektuje DblClick?
[ morlic @ 05.12.2004. 01:32 ] @
Ne znam da li si probao ono sto sam ti rekao, ali usput pogledaj da ti nije postavljeno u opcijama grida dgRowSelect jer tada se ne desava onclick i ondbclick onako kako si ti zamislio.
[ neor @ 05.12.2004. 08:21 ] @
Pogledaj da nemas OnClick na Formu ili na cemu ti vec stoji grid. Da li imas definisan neki windows message handler koji je mozda uhvatio daj click?
[ ITman @ 05.12.2004. 14:55 ] @
Ovako: dgRowSelect mi je true - zato što sam hteo da mi je ceo red označen, a pre toga u formi, nakon filtriranja Ado Table-a koj puni ovaj DbGrid, imam VideoGrid.SelectedField.Index:=1 - time sam odredio da je polje , ma na koji deo reda korisnik kliknuo, bude polje "Path_V" + jos to proveravam uslovom IF koji se moze videti u post-ovanom kodu. Kazem Vam stos je u tome da ovo ne radi bas na racunaru na kome je predvidjeno a testirao sam program na jos cetiri masine sa istim OS-om i sve sljaka! Inace ne verujem da je do podesavanja brzine kliktanja misa jer meni ne radi ni OnClick ni OnDouble Click na tom (Murpy law) kompu (naravno samo u mom programu).

p.s. U cemu je stos ako je ukljucen dgRowSlelect zasto se ne bi odigravali dogadjaji OnClick na nacin koji sam zamislio?
[ morlic @ 05.12.2004. 18:15 ] @
Tu je znaci problem, kao sto kaze dokumentacija:

Citat:

Set SelectedField to move focus to a particular field in the grid. Read SelectedField to obtain access to the field component for the currently selected cell. If there is not currently selected cell, SelectedField is nil (Delphi) or NULL (C++). For example, when an entire row is selected, SelectedField is nil or NULL.


To sto ti pokusavas nije predvidjeno da radi tako kako si ti zamislio, jednostavno tako su uradili, nije garantovano da ce SelectedField raditi ako je dgRowSelect postavljen na true, sto si ti u praksi i osetio.

Znaci te dve stvari se potiru, grid smatra da ne mozes da dobijes informaciju koja kolona je izabrana ukoliko je ceo red selektovan. To sto negde radi, a negde ne je druga stvar i vezana je za (los) kvalitet posla koji su odradili Borlandovi ljudi. Ako te interesuje pogledaj DB.pas gde se desava sve to sto tebe zanima.

Plus imas i logicki problem u programu. Ako si vec fiksirao koja kolona te zanima zasto uopste postavljas selected index? Znaci:

Revizija tvog koda za OnClick (za dalje ces se snaci):

Code:

procedure TfrmSnimciGrid.VideoGridCellClick(Column: TColumn);
begin
  with  VideoGrid.DataSource.DataSet do
  begin
    if IsEmpty then 
       exit; // Izlazimo ako je dataset prazan
    edtDelete.Text:= FieldByName('Path_v').AsString;
    btnDelete.Enabled:= true;
  end;
end;


Imas tu jos jedan sitniji problem. Ako je dgRowSelect true onda se posle OnDbClick-a desava OnClick, ali mislim da to nece biti strasno u kontekstu onoga sto ti radis na onclick.

Sve bi ovo bilo reseno ranije da si ti uradio na prvom mestu ono sto sam ti rekao: postavio logovanje dogadjaja i odmah ustanovio da se dogadjaji pozivaju, ali da ostatak koda ne radi kako treba.
[ ITman @ 05.12.2004. 23:29 ] @
Hvala na ispravci! Sutra cu probati na spornoj masini, moracu vise paznje da posvetim dokumentaciji u ovakvim slucajevima. Thanks!