ClientDataSet - losowe zaznaczenie wiersza w tabelce Jvdbgrid

0

Cześć mam pytane.
Potrzebuje dać random na ClientDataSet Chodzi o losowe zaznaczenie wiersza w tabelce Jvdbgrid1. Gdzie wierszy może być różna ilość. Coś podobnego jak tu random na Listboxie:

ListBox1.ItemIndex := Random(ListBox1.Items.Count) - 0;

Nie mam pojęcia jak to złożyć ClientDataSet.Locate :=random
Po czym wykonała by się ta linijka:

 PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3').AsString, MediaPlayer1,Image2);

0
ClientDataSet.RecNo:=Random(ClientDataSet.RecordCount);
0

Tak oto mi chodziło ale jak teraz to złożyć do porządku, niby działa ale jak ma odegrać ostatni wiersz w tabelce wyskakuję błąd:

  • At beginning of table *
procedure TForm1.btnNextClick(Sender: TObject);
begin
  self.ListBox1.ItemIndex := Random(ListBox1.Items.Count) - 0 ;
  DodajALL();
  begin
   ClientDataSet1.RecNo:=Random(ClientDataSet1.RecordCount) - 0;
   PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3').AsString, MediaPlayer1,Image2);
   end
end;
0
self.ListBox1.ItemIndex := Random(ListBox1.Items.Count -1) ;
0

Problem rozwiązany

procedure TForm1.btnNextClick(Sender: TObject);
begin
  ListBox1.ItemIndex := Trunc(Random(ListBox1.Items.Count));
  DodajALL();
  begin
   ClientDataSet1.First;
   ClientDataSet1.MoveBy(Random(ClientDataSet1.RecordCount));
   PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3').AsString, MediaPlayer1,Image2);
   end
end;

0

Jednak zapytam. Mam powyższe losowe odgrywanie rekordów w tabelce Jvdbgrid ClientDataSet.

Jak teraz przeskoczyć na inny rekord niż ten wylosowany. Mam tylko dwa rekordy w tabelce. Przykładowo był wylosowany rekord 1 jak pod ButtonClick przeskoczyć na drugi rekord. I na odwrót w zależności od wylosowanego rekordu. Czyli rekord +1 lub -1 A najlepiej by fizycznie na niego nie przeskakiwać tylko pozostać dalej na tym wylosowanym ale odegrać z pod drugiego(brakuje mi określenia na to) tą linijkę:

PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3').AsString, MediaPlayer1,Image2); 
0
DataSet.Next; //DataSet.RecNo:=DataSet.RecNo+1; //następny
DataSet.Prior; //DataSet.RecNo:=DataSet.RecNo-1; //poprzedni

Edit:
możesz rozpiąć kontrolki z datasetem:

DataSet.DisableControls;
DataSet.Next;
odtworzPlik;
DataSet.Prior;
DataSet.EnableControls;
0

chodzi mi o coś podobnego tylko by "logiczny kursor" pozostał na swoim miejscu a buton działał tez jako repeat

procedure TForm1.ToggleRecord;
begin
  ClientDataSet1.Next;
  if ClientDataSet1.Eof then
    ClientDataset1.Prior;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  if assigned(self.idictionary) then
  begin
   ToggleRecord;
   PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3')
        .AsString, MediaPlayer1, Image2);
  end;
end;
0

Po kombinacjach alpejskich udało mi się wykonać to czego oczekuję. da się to jakoś sensowniej złożyć ?

procedure TForm1.btn1Click(Sender: TObject);
begin
  if assigned(self.idictionary) then
  begin

    if ClientDataSet1.RecNo = 1 then
    begin
      ClientDataSet1.Next;
      PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3')
        .AsString, MediaPlayer1, Image2);
      ClientDataSet1.Prior;
    end;

    if ClientDataSet1.RecNo = 2 then
    begin
      ClientDataSet1.Prior;
      PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3')
        .AsString, MediaPlayer1, Image2);
      ClientDataSet1.Next;
    end;
  end;
end;
0

Wywal te Selfy, bo do niczego nie służą i tylko niepotrzebnie wydłużają kod.

0

A mam ostatnie pytanie już nie odnośnie kodu a samej tabelki Jvdbgrid. Mam w niej ScrollBara(vertical). Nie chce go na stałe usuwać ale uaktywnić go lub ukryć całkowicie dopóki nie będzie potrzebny tak jak jest w Memo a on u mnie się przewija za każdym klikiem w button gdy czytam dane z tabelki. Nie mam na tyle rekordów a tabelka jest większa. Drażni to niepotrzebne przewijanie tego scrollbara, bo jest na pół tabelki (nie wiem czemu) i za każdym razem opada w dół. Można temu jakoś zaradzić ?

0

@Ona
komponent TDBgrid sam, w zależności od sytuacji, pokazuje lub nie pokazuje scrollbary

0

To pytanie inne. Które z rozwiązań jest lepsze? czy to tylko kwestia smaku? one robią dokładnie to samo chodzi mi z punkty profesjonalisty i zapisu, Chyba że idzie to zrobić bardziej profesjonalnie już pomijając self :)

procedure TForm1.ToggleRecord;
begin
  if assigned(self.idictionary) then
  begin
 
    if ClientDataSet1.RecNo = 1 then
    begin
      ClientDataSet1.Next;
      PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3')
        .AsString, MediaPlayer1, Image2);
      ClientDataSet1.Prior;
    end;
 
    if ClientDataSet1.RecNo = 2 then
    begin
      ClientDataSet1.Prior;
      PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3')
        .AsString, MediaPlayer1, Image2);
      ClientDataSet1.Next;
    end;
  end;
end;

albo

procedure TForm1.ToggleRecord;
var
  Distance: Integer;

begin
  if assigned(self.idictionary) then
  begin
    if ClientDataSet1.RecNo = 2 then
      Distance := -1
    else
      Distance := 1;

    ClientDataSet1.MoveBy(Distance);

    PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3')
      .AsString, MediaPlayer1, Image2);

    Distance := -Distance;
    ClientDataSet1.MoveBy(Distance);
  end;
end;
0

Te kody różnią się w działaniu - pierwsza wersja odtworzy dźwięk tylko i wyłącznie w przypadku, gdy RecNo zwróci wartość 1 lub 2. Druga wersja odtworzy dźwięk zawsze - jeśli RecNo zwróci 2 to przejdzie w tył, a jeśli zwróci dowolny inny indeks to odtworzy dźwięk i przejdzie w przód.

1 użytkowników online, w tym zalogowanych: 0, gości: 1