ComboBox

    Hallo liebe Delphi Gemeinde,

    erst einmal ein frohes und besinnliches Weihnachtsfest an alle die in Delphi-Treff unterwegs sind.

    Ich benutze Windows 10 64 Bit, mit Delphi Berlin 10.1.

    Ich habe ein Problem mit der ComboBox.

    Der Anwender soll die vorgegebenen Einträge nicht ändern können.

    Er soll lediglich die vorgegebenen Werte auswählen können.

    Es gibt hier ja leider kein ReadOnly.

    Dazu gibt es zwar unter Style andere Möglichkeiten, hier besteht jedoch das Problem das die vom Anwender eingestellten Texte beim Aufruf der Combobox nicht angezeigt werden.

    Was gibt es hier für Möglichkeiten die Texteingabe oder das Löschen des Textes mit der Tastatur zu verhindern???

    Gruß gringo ?(
    Hallo DeddyH,

    also ich lese die Daten aus einer Datei ein.
    Z.B.
    a_druck.C1.Text:=allgem.C1;
    a_druck.C2.Text:=allgem.C2;
    a_druck.C3.Text:=allgem.C3;

    a_druck.C1 ist die ComboBox.
    allgem.C1 ist eine Textvariable aus einer Datei.
    Die lese ich so ein:
    a_druck.C1.Text:=allgem.C1;
    Das klappt bei csDropDown aber nicht bei csDropDownList .
    Was kann ich tun??

    gringo
    Was ich meinte:

    Delphi-Code

    1. ComboBox.Items.Add('Eins');
    2. ComboBox.Items.Add('Zwei');
    3. ComboBox.Items.Add('Drei');
    4. ComboBox.Items.Add('Vier');
    5. // Die folgende Zeile ist hier natürlich unnötig, kann aber zum Tragen kommen, wenn man die Daten dynamisch einliest
    6. if ComboBox.Items.Count > 0 then
    7. ComboBox.ItemIndex := 0;
    10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
    Hallo DeddyH,

    das wird nicht funktionieren.
    Der Anwender wählt aus ca. 10 Begriffen aus der Combobox einen aus und diesen Begriff speichert er in einer Datei.
    Der von Ihm gespeicherte Begriff soll nun beim erneuten aufrufen der Combobox angezeigt werden.
    Und das funktioniert nur bei csDropDown.

    gringo
    csDropDownList heißt doch, dass der Anwender lediglich einen der vordefinierten Einträge auswählen kann, also genau das, was Du beabsichtigst. Wird der eingelesene Eintrag nicht angezeigt, kann das nur bedeuten, dass der betreffende String nicht in der Liste enthalten ist. Also würde ich dem abhelfen, indem ich ihn bei Bedarf einfach hinzufüge, anstatt zu versuchen, irgendwelche Eingaben zu verbieten, oder?
    10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
    Hallo DeddyH,

    das mit dem auswählen klappt ja auch.
    danach werden die ausgewählten Begriffe aus der ComboBox Textzeile in einer Datei gespeichert.
    Bei einem erneuten aufrufen der ComboBox sollen die vom Anwender ausgewählten und gespeicherten Begriffe ja in der ComboBox Textzeile auch wieder angezeigt werden.
    Dazu wird die Datei gelesen und die ausgewählten Begriffe wieder in die ComboBox Textzeile eingefügt.
    Also: a_druck.C1.Text:=allgem.C1; (Siehe weiter oben).
    Der Anwender soll also sehen können, welchen Begriff er das letzte mal ausgewählt hat.
    Ich hoffe, dass ich mich verständlich ausgedrückt habe.

    gringo
    Und wo soll da jetzt der riesige Unterscheid sein zwischen Setzen des Textes und Auswahl des ItemIndex anhand des Strings, wenn dieser schon vorhanden ist? Ich glaube, wir reden aneinander vorbei.
    10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
    Hallo DeddyH,

    danke für das Beispiel.
    Wir haben also doch nicht aneinander vorbeigesprochen.
    Genau so soll es sein.
    Ich habe Dir mal meine Load und Speicher Procedur geschickt.
    So raffiniert wie Du kann ich leider nicht programieren.
    Ich mache das immer noch nach altem Schema.
    Also "a_druck.C1 bis a_druck.C15" sind Comboboxen die je ca. 15 verschiedene Strings zur Auswahl haben.
    "allgem.C1-allgem.C15" sind Stringvariablen in die die Werte gespeichert werden.
    Ich habe zum testen "a_druck.C1" als csDropDownList gemacht und die anderen als csDropDown.
    Beim Lesen der Datei werden alle Texte in "a_druck.C2 bis a_druck.C15" eingefügt.
    Nur a_druck.C1bleibt leer obwohl die Variable "allgem.C1" einen Wert hat.
    Was müsste ich bei mir ändern, damit es klappt.

    gringo

    Delphi-Code

    1. procedure Ta_druck.a_fahrz_druck_lesen;
    2. begin
    3. if fileexists(lpf+'a_fahrz_druck.ald') then
    4. begin
    5. Try
    6. assignfile (allgem1,lpf+'a_fahrz_druck.ald');
    7. Reset (allgem1);
    8. Read(allgem1,allgem);
    9. a_druck.C1.Text:=allgem.C1;
    10. a_druck.C2.Text:=allgem.C2;
    11. a_druck.C3.Text:=allgem.C3;
    12. a_druck.C4.Text:=allgem.C4;
    13. a_druck.C5.Text:=allgem.C5;
    14. a_druck.C6.Text:=allgem.C6;
    15. a_druck.C7.Text:=allgem.C7;
    16. a_druck.C8.Text:=allgem.C8;
    17. a_druck.C9.Text:=allgem.C9;
    18. a_druck.C10.Text:=allgem.C10;
    19. a_druck.C11.Text:=allgem.C11;
    20. a_druck.C12.Text:=allgem.C12;
    21. a_druck.C13.Text:=allgem.C13;
    22. a_druck.C14.Text:=allgem.C14;
    23. a_druck.C15.Text:=allgem.C15;
    24. closefile(allgem1);
    25. except
    26. closefile(allgem1);
    27. end;
    28. end else a_fahrz_druck_anlegen;
    29. end;



    Delphi-Code

    1. procedure Ta_druck.a_fahrz_druck_speichern;
    2. begin
    3. if fileexists(lpf+'a_fahrz_druck.ald') then
    4. begin
    5. Try
    6. assignfile (allgem1,lpf+'a_fahrz_druck.ald');
    7. Rewrite (allgem1);
    8. write(allgem1,allgem);
    9. closefile(allgem1);
    10. except
    11. closefile(allgem1);
    12. a_fahrz_druck_anlegen;
    13. end;
    14. end else a_fahrz_druck_anlegen;
    15. end;
    Hallo DeddyH,
    ich habe die Routinen nach Deinem Schema geändert.
    Statt 'a_druck.C1.Text:=allgem.C1;'
    Schreibe ich jetzt:
    idx := a_druck.C1.Items.IndexOf(allgem.C1);
    if idx > -1 then a_druck.C1.ItemIndex := idx;

    und dann klappt es auch.
    Vielen Dank für Deine Hilfe.
    gringo

    Gringo schrieb:


    Delphi-Code

    1. procedure Ta_druck.a_fahrz_druck_lesen;
    2. try
    3. ...
    4. ...
    5. closefile(allgem1);
    6. except
    7. closefile(allgem1);
    8. end;
    9. end else a_fahrz_druck_anlegen;
    10. end;


    Hat zwar nix mit deiner Frage zu tun, aber warum benutzt du da nicht Try Finally ? Dann kannst du ein closeFile sparen
    Glückauf

    Herr, wirf Hirn vom Himmel

    Ein Leben ohne Möpse ist möglich, aber sinnlos ( Loriot )
    Der beste Platz für Politiker ist das Wahlplakat. Dort ist er tragbar, geräuschlos und leicht zu entfernen ( Loriot )

    Es gibt Leute, die fühlen sich überall gedemütigt, wo sie nicht frech sein dürfen ( Otto Weiss )