Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Items aus einer Liste abfragen (https://www.delphipraxis.net/166598-items-aus-einer-liste-abfragen.html)

ByTheTime 21. Feb 2012 11:50

Items aus einer Liste abfragen
 
Der Titel ist nicht ganz passend gewählt, ich muss das erklären...

Hallo,
mein Programm besitzt u.a. 2 ComboBoxen. In einer wählt man eine Disziplin aus (z.B. Schwimmen). Dahinter befindet sich eine ComboBox in der man den Trainingsinhalt auswählt (z.B. '3km'). Jetzt soll mein Programm andere Felder ergänzen (2 Felder, einmal beim Edit 'Schwimmen - km' die Kilometer Anzahl und einmal beim Edit 'Umfang des Extensiven Trainings' ebenfalls die km). Das habe ich bisher so gelöst:
Delphi-Quellcode:
if AnsiSameText(ComboDis.Text, 'Schwimmen') then //Überprüfen ob schwimmen, denn es gibt ja z.B. noch Fahrrad, etc.
  begin
    if (AnsiSameText(ComboContent.Text, '3km')) or (AnsiSameText(ComboContent.Text, '2x1,5km')) then //or 3x1km or ...
     begin
       ComboSkm.Text := '3'; //Schwimmen Kilometer
       ComboExAkm.Text := '3'; //Extensives Ausdauertraining (ExA) Kilometer
     end;

    {Das ganze noch für diverse ander Disziplinen und Distanzen}

  end;
Seht ihr mein Problem? Ich muss für jede Distanz einen einzelnen "if .. or .. then" hinzufügen. Mit der Zeit wird das jedoch unübersichtlich und umständlich, denn 3km kann man auf 1000 verschiedene weisen schwimmen (10x300m, 100x30m, 2x1km, etc.). Und das nun noch für sehr viele andere Disziplinen wie Fahrrad fahren, Laufen, etc. Jetzt suche ich eine Möglichkeit das ganze zu vereinfachen, habe jedoch nichts passendes gefunden.
Ich habe mir das ungefährso vorgestellt:
Ich habe eine Art Liste. Die heißt z.B. "SchwimmenListe3km". Hier trage ich jetzt alle Möglichkeiten ein (3km, 10x300m, 100x30m, 2x1km, etc.). Jetzt muss ich im Prinzip die Liste nach ihren Items abfragen:

Delphi-Quellcode:
if AnsiSameText(ComboContent.Text, SchwimmenListe3km.Items) then
     begin
       ComboSkm.Text := '3'; //Schwimmen Kilometer
       ComboExAkm.Text := '3'; //Extensives Ausdauertraining (ExA) Kilometer
     end;
Ich hoffe ich habe mich annährend verständlich ausgedrückt, wie ich mir das vorstelle :S Habt ihr sowas ähnliches schonmal gemacht?

Lukas

Bummi 21. Feb 2012 11:54

AW: Items aus einer Liste abfragen
 
Häng' doch Objekte mit den benötigten Zusatzinformationen an die Items.Objects ...

ibp 21. Feb 2012 11:56

AW: Items aus einer Liste abfragen
 
Abfrage ob der "Suchtext" in deineCombobox vorhanden ist..
Code:
deineCombobox.items.indexOf('mein itemtext') >= 0

Popov 21. Feb 2012 12:35

AW: Items aus einer Liste abfragen
 
Zitat:

Zitat von ByTheTime (Beitrag 1152110)
Ich hoffe ich habe mich annährend verständlich ausgedrückt, wie ich mir das vorstelle ...

Um Bummis Vorschlag wirst du nicht herumkommen, denn du kannst im Item-String nur eine begrenzte Information unterbringen. Ich weiß nicht wie gut du dich mit dem anhängen von Objekten an Items auskennst, wobei das eigentlich relativ simpel ist.

Ich habe zufällig an einer anderen Stelle mal ein Beispiel gepostet. Das sieht in etwa so aus:
Delphi-Quellcode:
type
  TInfo = class
    DT: TDateTime;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Info: TInfo;
  p: Integer;
begin
  with ListBox1 do
  begin
    Info := TInfo.Create; //Beispiel-Objekt Erstellen
    Info.DT := Now;

    p := Items.AddObject('Datum und Zeit (' + DateTimeToStr(Info.DT) + ')', Info); //Zuweisen

    if p > -1 then
      ShowMessage(Format('Aktuelle Zeit im Item %d als Objekt gespeichert.',
      [p]));
  end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
  DT: TDateTime;
  Info: TInfo;
begin
  with ListBox1 do
  begin
    if Count = 0 then Exit;
    if ItemIndex = -1 then Exit;
 
    Info := TInfo(Items.Objects[ItemIndex]); //Auslesen
    DT := Info.DT;

    ShowMessage('Im Objekt gespeicherte Zeit: ' + TimeToStr(DT));
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
  Info: TInfo;
begin
  with ListBox1 do //Objekte müssen separat freigegeben werden
    for i := 0 to Items.Count - 1 do
    begin
      Info := TInfo(Items.Objects[i]); //Freigeben
      Info.Free;
    end;
end;
Solltest du ein Profi sein, übersehe das Beispiel.

Ansonsten erkläre ich das Beispiel kurz: ganz oben wird eine einfache Klasse erstellt die wie ein Record aufgebaut ist. Bei Zuweisung Objekt erstellen und zuweisen, dann nach belieben damit arbeiten und beim Beenden des Programms (oder leeren der Liste) auch immer das Objekt frei geben.

DeddyH 21. Feb 2012 12:40

AW: Items aus einer Liste abfragen
 
Auf Dauer dürfte das auch der einzig gangbare Weg sein: Datenhaltung in einer Klasse, Ablegen der Instanzen in einer Liste (das können auch TStrings sein) und Darstellung der Daten dann eben in Edits etc. Damit entfiele dann auch ein Stringvergleich, da man so das Objekt des aktuellen ItemIndex der Combobox auswertet und nicht den Text der Combobox.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz