Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Combobox anderes Verhalten als in Delphi (https://www.delphipraxis.net/202439-combobox-anderes-verhalten-als-delphi.html)

Moombas 4. Nov 2019 13:21

Combobox anderes Verhalten als in Delphi
 
Ich habe in Delphi eine TComboBox verwendet, in welche ich z.B. Nummern eingebe.
Die Combobox klappt automatisch auf und wählt den (je nach weite der Eingabe) passensten Eintrag schon aus.
Soweit so gut. Ich habe dann eine Prüfung eingebaut, das wenn der eingegebene Text zu keinem Eintrag in der Combobox passt, dieser um 1 Zeichen (das letzte eingegebene) gekürzt wird.

Jetzt stehe ich wie der Ochse vorm Berg:
Problem in Lazarus ist jedoch, das er immer sagt das der eingegebene Text nicht passt, da er immer nur die eingegebenen Zeichen prüft, nicht aber die "Vorauswahl".
Dadurch lösche ich natürlich immer die komplette Eingabe und man hängt quasi fest.

Delphi-Quellcode:
procedure TTools.ChooseFChange(Sender: TObject);
var
  LandD, IPD, IPT, DeviceD, puffer : string;
  i : integer;
begin
  if (ChooseF.Text <> '') and
     (ChooseF.Items.IndexOf(ChooseF.Text) <> -1) then
  begin
    //Bedingungen wenn der Text passt.
  end else
  begin //Wenn der Text nicht passt
    puffer := choosef.Text;
    choosef.Text := '';
    for i := 1 to length(puffer) - 1 do
    begin
      Choosef.Text := Choosef.Text + puffer[i];
    end;
    choosef.SelStart := length(choosef.text);
  end;
end;
Jemand eine Idee wie man das in Lazarus hin bekommt? Die Combobox scheint sich anders zu verhalten.

Moombas 5. Nov 2019 07:12

AW: Combobox anderes Verhalten als in Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Stehe da gerade auf dem Schlauch. Es soll durchaus das OnChange Event verwendet werden, hab das oben nicht erwähnt, sorry.
Und dort bekomme ich die von dir aufgeführten Werte deiner procedure nicht.

Hab es daher so angepasst, funktioniert jedoch auch nicht:
Delphi-Quellcode:
if Assigned(ChooseF.Items) and (ChooseF.Items.Count > 0) then
  begin
    for i := Length(ChooseF.text) - 1 downto 1 do
    begin
      FoundInIndex := ChooseF.Items.IndexOf(ChooseF.text);
      if FoundInIndex > -1 then
      begin
        ShowMessage('Found');
        break;
      end else
      begin
        ChooseF.text := Copy(ChooseF.text, 1, i);
        Choosef.SelStart := length(choosef.text);
      end;
    end;
  end;
Es bleibt zwar wenigstens das Zeichen stehen, aber die Suche geht spätestens ab dem zweiten Zeichen nicht weiter. Ggf. hilft das Beispiel im anhang aus Delphi, wie es funktionieren sollte.
Bild 1 und 2: Die Eingabe bei vorhandenen Einträgen.
Bild 3: Eingabe und mit der letzten Ziffer ("I16x") wurde nichts gefunden und daher wieder um eine Stelle gekürzt ("I16").

Moombas 6. Nov 2019 08:41

AW: Combobox anderes Verhalten als in Delphi
 
Sorry, aber natürlich ist Autocomplete eingeschaltet....
Aber Lazarus arbeitet anders.

Delphi:
1. Du tippst Zeichen für Zeichen ein
2. Autocomplete wird ausgeführt
3. Du kannst im Onchange Combobox.text abfragen und dort steht der autom. vervollständigte Text drin => indexof >= -1
4. Du kannst weiter tippen bis die eingestellte maximale Zeichenanzahl (4) erreicht ist und der index größer -1 ist oder er löscht das letzte eingegebene Zeichen

Lazarus:
1. Du tippst Zeichen für Zeichen ein
2. Autocomplete wird noch NICHT ausgeführt
3. Du kannst im Onchange Combobox.text zwar abfragen aber dort steht nur der eingetippte Text drin => indexof = -1
4. Er löscht sofort das eingegebene Zeichen => man hat quasi immer ein leeres Textfeld.

Moombas 6. Nov 2019 14:26

AW: Combobox anderes Verhalten als in Delphi
 
Was meinst du mit "Weiterentwicklungen"?
Natürlich ist .AutoCompleteText auch gesetzt, von dessen Unterpunkten ich jedoch keinen angefasst habe (True, True, False, True, False).

Der Code im ersten Post ist das einzige was greift bzw. darauf Einfluss nimmt.
Klar, ohne den Code, funktioniert das mit der Eingabe (ohne das löschen des Zeichens), aber die Entscheidenden Punkte meines vorigen Posts sind ja 2. und 3.!

Hast du dir mal im Onchange den Combobox.text ausgeben lassen? Ich bekomme ohne jeglichen anderen Code immer nur das was ich eingegeben habe, nicht aber den "AutoComplete"-Text.
Und genau das ist das Problem!
In Delphi : OnChange -> Combobox.text = Autocomplete-Text
In Lazarus: OnChange -> Combobox.text = Eingegebener-Text


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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