Zugriff auf sehr viele ComboBoxen

    Zugriff auf sehr viele ComboBoxen

    Hallo,

    ich hoffe dies ist das richtige Unterforum.
    Auf einem Panel wurden 30 ComboBoxen plaziert, diese werden zur Laufzeit mit Werten gefüllt, die anhängig von der vorherigen ComboBox sind.
    Hierzu habe ich nun 30 Routinen geschrieben, die in jede ComboBox die Auswahlwerte schreibt.
    Dies finde ich sehr umständlich, gibt es hier einen einfacheren Weg, um auf die ComboBoxen zuzugreifen.
    Über einen Hinweis würde ich mich sehr freuen, wenn dieser etwas ausführlicher ausfällt wäre dies super.

    Panel mit ComboBoxen.PNG

    Danke für die Unterstützung.

    Gruß Christopher
    -----------------------------------------------------
    IDE =Delphi XE2 Update 4 Hotfix 1 starter für .Win32
    Hallöle... 8o

    Im Prinzip reicht eine procedure, der die ComboBox und die Daten übergeben werden, zum Ausfüllen für alle aus. Die Preisfrage ist, wie du die Daten zum Füllen zur Verfügung stellst. Hartcodiert? Als Liste? Zeige mal ein wenig QT wie du die CBB derzeit füllst.

    PS: Arbeitest zu wirklich mit XE2 Starter? Das aktuelle DX Berlin gibt es auch als Starter kostenlos. :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „haentschman“ ()

    Erst mal Danke für die Antwort.
    Habe vom Forum leider keine Mail bekommen, das eine Antwort geschrieben wurde, Sorry.
    Ich habe eine Liste die sortiert in eine Tabelle geschrieben wird, in Abhängigkeit vom Gerätenamen, die Liste pro Gerät ist unterschiedlich lange.
    Die Combobox wird erst zur Laufzeit gefüllt, je nach Auswahl der vorherigen CBB.

    Delphi-Code

    1. procedure TMPLS.HOP102_fuellen(Sender: TObject);
    2. var i : integer;
    3. TabellenZeile : integer;
    4. Tabellenspalte : integer;
    5. wert : string;
    6. erlaubt : integer;
    7. begin
    8. TabellenZeile := 0;
    9. Tabellenspalte := 1;
    10. wert := '';
    11. CBHOP102.Items.Clear; // Auswahlliste löschen
    12. VerfuegbareHopsHOP102 := '';
    13. erlaubt := pos( CBHOP101.Text, VerfuegbareHopsHOP101);
    14. if erlaubt <> 0
    15. then
    16. begin
    17. if ((CBHOP101.Text <> '') and (length (CBHOP101.Text) = 6)) // Auswalhliste nicht leer und 6 zeichen lang
    18. then
    19. begin
    20. for i:= 1 to MPLS.STG_MPLS_Knoten.RowCount
    21. do
    22. begin
    23. if CBHOP101.Text = STG_MPLS_Knoten.Cells [1,i] then TabellenZeile := i;
    24. end;
    25. if TabellenZeile <> 0
    26. then
    27. repeat
    28. inc (Tabellenspalte);
    29. wert := Naechster_Wert_aus_Tabelle ( Tabellenspalte, TabellenZeile );
    30. if wert <> ''
    31. then
    32. begin
    33. CBHOP102.Items.Add(wert);
    34. VerfuegbareHopsHOP102 := VerfuegbareHopsHOP102 + wert;
    35. end;
    36. CBHOP102.Enabled := true;
    37. LBHop102.Enabled := true;
    38. until wert = '';
    39. end
    40. else
    41. begin
    42. CBHOP102.Enabled := false;
    43. LBHop102.Enabled := false;
    44. CBHOP102.Text := '';
    45. end;
    46. end
    47. else
    48. begin
    49. CBHOP102.Enabled := false;
    50. LBHop102.Enabled := false;
    51. CBHOP102.Text := '';
    52. CBHOP101.SetFocus;
    53. end;
    54. end;


    Was ist DX Berlin, habe mal Google bemüht aber nichts gefunden.
    Gruß Christopher
    -----------------------------------------------------
    IDE =Delphi XE2 Update 4 Hotfix 1 starter für .Win32

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Stoffel_hessen“ ()

    Hallo,

    mir geht es darum wie ich sinnvoll auf die CBB mit den Namen CBHOP101.Text, CBHOP102.Text, CBHOP103.Text .... CBHOP130.Text zugreifen kann.

    Das hier funktioniert nicht.

    Delphi-Code

    1. for i := 101 to 130
    2. do CBHOP(inttostr(i)).Items.Clear;

    Gruß Christopher
    -----------------------------------------------------
    IDE =Delphi XE2 Update 4 Hotfix 1 starter für .Win32
    Oder pack die Comboboxen in eine TObjectList/TComponentList (OwnsObjects auf false), dann kannst Du die Komponenten ordentlich benennen und sie trotzdem in einer Schleife abarbeiten.
    10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.

    haentschman schrieb:

    Oder pack die Comboboxen in eine TObjectList/TComponentList

    ...noch besser. 8o


    Das mit den TObjectList/TComponentList verstehe ich nicht, macht aber nichts das Andere reicht mir an der Stelle.
    Oder geht das mit den String-Variablen dann.

    VerfuegbareHopsHOP101, VerfuegbareHopsHOP102, VerfuegbareHopsHOP103 ..... VerfuegbareHopsHOP130
    Gruß Christopher
    -----------------------------------------------------
    IDE =Delphi XE2 Update 4 Hotfix 1 starter für .Win32

    Stoffel_hessen schrieb:

    Gibt es sowas wie die FindComponent auch für String-Variablen?

    VerfuegbareHopsHOP101, VerfuegbareHopsHOP102, VerfuegbareHopsHOP103 ..... VerfuegbareHopsHOP130


    Das nicht, aber wenn Du über den Index auf Deine Stringvariablen zugreifen willst, versuchs mal mit einem Array:

    Delphi-Code

    1. VerfuegbareHops: array [101..130] of string

    Zugriff dann über

    Delphi-Code

    1. VerfuegbareHops[{HopNr}]
    Gruß Thomas

    Admin werden ist nicht schwer, sein ......
    Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.

    Thomas schrieb:



    Das nicht, aber wenn Du über den Index auf Deine Stringvariablen zugreifen willst, versuchs mal mit einem Array:

    Delphi-Code

    1. VerfuegbareHops: array [101..130] of string

    Zugriff dann über

    Delphi-Code

    1. VerfuegbareHops[{HopNr}]


    DANKE, da hätte ich auch selbst drauf kommen können.
    Gruß Christopher
    -----------------------------------------------------
    IDE =Delphi XE2 Update 4 Hotfix 1 starter für .Win32
    Habe die Anpassungen nun durchgeführt und dadurch wurde der Code doch um einiges schlanker.
    Danke hierfür.

    Ein kleines Problem würde ich aber gerne noch lösen.
    In jeder ComboBox gibt es unter ereignisse "OnExit" den Aufruf einer procedure "CBHOP102_GeraetOK" die eine Prüfung vollzieht.
    So sieht der Code zur Zeit für jede Combobox aus, also 30 mal mit verschiedenen Nummern (101-130)

    Delphi-Code

    1. procedure TMPLS.CBHOP102_GeraetOK(Sender: TObject);
    2. begin
    3. if not Geraetename_Erlaubt(VerfuegbareHopsHOP102, CBHOP102.Text)
    4. then CBHOP102.SetFocus
    5. else CBHOP101.Enabled := false;
    6. end;


    Nun habe ich versucht auch dies zu optimieren, nur leider ist mir dies nicht gelungen.
    Es wurde eine neue Procedure geschrieben

    Delphi-Code

    1. procedure TMPLS.CBHOP_GeraetOK(Sender: TObject; CBHopNummer: Integer);
    2. begin
    3. if not Geraetename_Erlaubt(VerfuegbareHops[CBHopNummer], (FindComponent('CBHOP'+IntToStr(CBHopNummer)) as TComboBox).Text)
    4. then (FindComponent('CBHOP'+IntToStr(CBHopNummer)) as TComboBox).SetFocus
    5. else (FindComponent('CBHOP'+IntToStr(CBHopNummer - 1)) as TComboBox).Enabled := false;
    6. end;

    Nur leider kann ich diese procedure in der ComboBox unter ereignisse "OnExit" CBHOP_GeraetOK(102) nicht eintragen.
    Gibt es hier einen anderen Weg?
    Gruß Christopher
    -----------------------------------------------------
    IDE =Delphi XE2 Update 4 Hotfix 1 starter für .Win32