Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TRadioGroup verschachteln


Desperado - Mo 21.01.13 19:54
Titel: TRadioGroup verschachteln
Hallo Zusammen,
ich muss im Rahmen meines Studiums eine Abschlussarbeit in Delphi schreiben. Thema ist die Erstellung einer Musik- und Videosammlung. Nun verzweifel ich gerade an einer Stelle und hoffe, dass man mir hier weiterhelfen kann.

Zu den einzelnen Stücken wird jeweils: Interpret, Titel, Jahr und Art(Musik oder Video) erfasst. Es soll möglich sein zwischen den einzelnen Datensätzen zu navigieren (Erster, Nächster, Vorheriger und Letzter). Das ist soweit auch kein Problem. Jetzt soll ich jedoch eine zusätzliche Auswahl ermöglichen, sodass nur Videos, nur Musik oder Alles angezeigt wird. Ich habe dafür, wie bereits für die "Art" eine RadioGroup erstellt. Wie schaffe ich es nun, dass beispielsweise bei Auswahl "nur Videos", wenn ich auf meinen Button "erster Datensatz" klicke, das erste Video aus den gesamten Datensätzen angezeigt wird. Mit Schleifen bin ich leider bisher nicht zu einem Erfolg gekommen.

Ein Beispiel für den Button btnErster:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
 procedure TForm1.btnErsterClick(Sender: TObject);
 begin
 if radiogroup2.itemindex=2 then
 
  btnErster.Visible:=true;
  btnNaechster.Visible:=true;
  btnVorheriger.Visible:=true;
  btnLetzter.Visible:=true;
  lblsongnummer.Caption:='1';
with aSammlung[1do
begin
    edtInterpret.Text:=Interpret;
    edtTitel.Text:=Titel;
    edtAlbum.Text:=Album;
    begin
      case Art of
      Musik: RadioGroup1.ItemIndex:=0;
      Video: RadioGroup1.ItemIndex:=1;
    end//case
    cBox1.Text:=Genre;
    edtJahr.Text:=IntToStr (Jahr);
    edtDauerStunden.Text:=IntToStr (DauerStunden);
    edtDauerMinuten.Text:=IntToStr (DauerMinuten);
    edtDauerSekunden.Text:=IntToStr (DauerSekunden);
    edtSpeicherort.text:=Speicherort;

end;
nIndex:=1
end//with aSammlung[1] do
end;
end;




Ich will jetzt, dass bei RadioGroup2=0 der erste Datensatz angezeigt wird, bei dem RadioGroup1=0 ist und bei RadioGroup2=1 der erste Datensatz, bei dem RadioGroup1=1 ist

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 22.01.2013 um 11:13


Blawen - Mo 21.01.13 21:24

Hallo und :welcome:

Sofern ich nichts übersehen habe, kann ich mit Deinem "Quellcode-Auszug" nichts anfangen.
Soll heissen, ich sehe nur Zuweisungen, aber nicht, wie Du an Deine Daten kommst.

Vom Grundsatz her muss Du Deine Datenmenge auf die gewünschte Auswahl reduzieren (Sinngemäss "Select * from Tabelle where Sparte = Wunsch"), dann musst Du keine Verrenkungen machen.

Die Hauptfrage dürfte daher sein:
Verwendest Du eine Datenbank oder eine andere Lösung?


bummi - Mo 21.01.13 22:18

crosspost http://www.delphipraxis.net/172761-hilfe.html#post1200013


Desperado - Di 22.01.13 01:59


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TForm1.btnSpeichernClick(Sender: TObject);
begin
 if (StrToInt(edtJahr.Text)<2014)                                   // Nur gültige Daten zulassen
 and (StrToInt(edtDauerSekunden.Text)<61)                           // Nur gültige Sekundenzahlen zulassen
 and (StrToInt(edtDauerMinuten.Text)<61)  then                      // Nur gültige Minutenzahlen zulassen
   begin
    if bNeu then
    begin
    nAnzahl:=nAnzahl+1;
    nIndex:=nAnzahl;
    bNeu:=false
   end;
  btnErster.Visible:=true;
  btnNaechster.Visible:=true;
  btnVorheriger.Visible:=true;
  btnLetzter.Visible:=true;
  lblSongnummer.Caption:=IntToStr(nIndex);
with aSammlung[nIndex] do
begin
    interpret:=edtInterpret.Text;
    Titel:=edtTitel.Text;
    Album:=edtAlbum.Text;
    begin
     case RadioGroup1.ItemIndex of
    0: Art:=Musik;
    1: Art:=Video;
    end//case
    Genre:=cbox1.Text;
    Jahr:= StrToInt(edtJahr.Text);
    DauerStunden:=StrToInt (edtDauerStunden.Text);
    DauerMinuten:=StrToInt (edtDauerMinuten.Text);
    DauerSekunden:=StrToInt (edtDauerSekunden.Text);
    Speicherort:= edtSpeicherort.Text;
  end;
end//with aSammlung[nIndex] do




So speicher ich meine Datensätze ein (Ich hoffe das ist das was du meintest). Dabei wird bNeu= True gesetzt, wenn man auf den Button "neuer Datensatz" klickt. Prinzipiell geht es mir ja jetzt nur darum, dass das Programm zum Index 1 springt und prüft, ob es sich um ein Video handelt. Falls dem so ist soll der ganze Datensatz angezeigt werden, wenn nicht wird der Datensatz mit dem Index 2 darauf geprüft, bis sich irgendwann eins findet.


WasWeißDennIch - Di 22.01.13 09:14

Vielleicht sollte man künftig Logik und Darstellung von einander trennen, aber das soll jetzt nicht das Thema sein. Das Einfachste dürfte IMO eine sequentielle Suche sein, in Pseudocode:

Quelltext
1:
2:
3:
Auf Listenanfang
solange nicht Listenende und Kriterien nicht erfüllt
  nächstes Listenelement

Dazu kann man noch z.B. eine Bool'sche Variable mitführen, die angibt, ob es einen Treffer gab.


Blawen - Di 22.01.13 23:38

user profile iconDesperado hat folgendes geschrieben Zum zitierten Posting springen:
So speicher ich meine Datensätze ein (Ich hoffe das ist das was du meintest). Dabei wird bNeu= True gesetzt, wenn man auf den Button "neuer Datensatz" klickt. Prinzipiell geht es mir ja jetzt nur darum, dass das Programm zum Index 1 springt und prüft, ob es sich um ein Video handelt. Falls dem so ist soll der ganze Datensatz angezeigt werden, wenn nicht wird der Datensatz mit dem Index 2 darauf geprüft, bis sich irgendwann eins findet.

Nein, die Frage bleibt nach wie vor bestehen.

Ich sehe Zuweisungen im Sinne von

Delphi-Quelltext
1:
  Genre:=cbox1.Text;                    


Aber dies hat mit dem speichern der Daten noch gar nichst zu tun, zumindest nicht direkt.
Aktuell befüllst Du ein Array - mehr geschieht (anscheinend) noch nicht.

Willst Du also aktuell Deine Daten im Array sortieren oder, oder, oder...?


Darum nochmals:
Verwendest Du eine Datenbank oder eine eine andere Lösung?
Zitat:
Vielleicht sollte man künftig Logik und Darstellung von einander trennen, aber das soll jetzt nicht das Thema sein.
Wie wahr, aber eine logische Logik ist für mich noch nicht wirklich implementiert...