AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TComboEdit ItemIndex funktioniert in Firemonkey nicht
Thema durchsuchen
Ansicht
Themen-Optionen

TComboEdit ItemIndex funktioniert in Firemonkey nicht

Ein Thema von QuickAndDirty · begonnen am 5. Okt 2018 · letzter Beitrag vom 11. Okt 2018
Antwort Antwort
Seite 2 von 2     12   
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 5. Okt 2018, 14:18
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  (ComboEdit1.Items as TStringList).CaseSensitive := True;
end;
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#12

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 5. Okt 2018, 14:21
Das Verhalten von IndexOf basiert auf: https://docs.microsoft.com/en-us/win...indstringexact

Es verhält sich also korrekt, wenn auch nicht wie erwünscht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#13

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 5. Okt 2018, 15:25
z.B.:
Zitat von mkinzler:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  (ComboEdit1.Items as TStringList).CaseSensitive := True;
end;
Wenn man bei CB_FINDSTRINGEXACT das CaseSensitiv mit angeben kann, dann könnte man auch statt ComboEdit1.Items.IndexOf auf ComboEdit1.Perform(...) oder SendMessage(ComboEdit1.Handle, ...) verwenden.

Hab noch nicht nachgesehn/ausprobiert.

Beispiel VCL-TMemo.
Dort hast du Memo.Lines: TStrings, was ein TMemoLines ist.
An den interne Klassen-Typ kommt man bei VCL/FMX oft nich ran, da die Entwickler so intelligent waren und solche Typen oftmals in der Unit-Implementation definieren, anstatt im Interface.
Aber man kann nachsehn welcher Typ das ist, von wem er abgeleitet wurde und dann via Casts oder RTTI an dessen Einstellungen rumspielen.

Die Komponente ableiten und beim Erstellen einen eigenen TStrings-Typen verwenden geht auch manchmal.
(ist ja nicht jede Komponente so grauenhaft implementiert, wie StdCtrls.TCustomMemo.Create ... z.B. im DevExpress überall zu sehen > TcxCustomMemo.GetInnerEditClass: TControlClass)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Okt 2018 um 15:31 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#14

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 5. Okt 2018, 15:32
Innereien bei Delphi 7:
Delphi-Quellcode:
function TCustomComboBoxStrings.IndexOf(const S: string): Integer;
begin
  Result := SendMessage(ComboBox.Handle, CB_FINDSTRINGEXACT, -1, LongInt(PChar(S)));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 5. Okt 2018, 18:21
Ich brauche leider den Itemindex bereits im OnChange Ereignis.
Also, ich habe zwar leider nicht ganz verstanden, was Du machen möchtest, aber wenn Du das aktuellste ItemIndex haben willst, dann musst Du nicht das OnChange-Event, sondern das OnChangeTracking-Event nehmen.

Dabei gilt folgende Besonderheit: Wenn Du den ItemIndex selber programmgesteuert (also nicht der User in der Bedienung) änderst, löst das kein OnChange-Event aus, aber das OnChangeTracking-Event. Da erhältst Du dann auch das aktuelle ItemIndex.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#16

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 9. Okt 2018, 00:27
Ich brauche leider den Itemindex bereits im OnChange Ereignis.
Also, ich habe zwar leider nicht ganz verstanden, was Du machen möchtest, aber wenn Du das aktuellste ItemIndex haben willst, dann musst Du nicht das OnChange-Event, sondern das OnChangeTracking-Event nehmen.

Dabei gilt folgende Besonderheit: Wenn Du den ItemIndex selber programmgesteuert (also nicht der User in der Bedienung) änderst, löst das kein OnChange-Event aus, aber das OnChangeTracking-Event. Da erhältst Du dann auch das aktuelle ItemIndex.
Ich ändere den Itemindex mit einem Mausklick auf das gewünschte Item. Nicht per code! Das control startet daraufhin von sichaus eine suche nach einem Item mit dem "sametext" des Items das ich angeklickt habe und setzt den Itemindex entsprechend falsch und führt dann das Onchange ereignis aus.
Nach dem onchange ereignis und setzt es den Itemindex auf das Item das angeklickt wurde.....argh...also auf das richtige Item...

Der beste weg wäre dieser code schnipsel gewesen!
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  (ComboEdit1.Items as TStringList).CaseSensitive := True;
end;
aber als der kam hatte ich mir schon ein eigenes Frankenstein-Control gebaut was das wie gewünscht macht.
Jeder der das TComboedit control benutzt sollte mkinzlers Lösung verwenden!
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 9. Okt 2018, 20:56
Ich brauche leider den Itemindex bereits im OnChange Ereignis.
Also, ich habe zwar leider nicht ganz verstanden, was Du machen möchtest, aber wenn Du das aktuellste ItemIndex haben willst, dann musst Du nicht das OnChange-Event, sondern das OnChangeTracking-Event nehmen.

Dabei gilt folgende Besonderheit: Wenn Du den ItemIndex selber programmgesteuert (also nicht der User in der Bedienung) änderst, löst das kein OnChange-Event aus, aber das OnChangeTracking-Event. Da erhältst Du dann auch das aktuelle ItemIndex.
Ich ändere den Itemindex mit einem Mausklick auf das gewünschte Item. Nicht per code! Das control startet daraufhin von sichaus eine suche nach einem Item mit dem "sametext" des Items das ich angeklickt habe und setzt den Itemindex entsprechend falsch und führt dann das Onchange ereignis aus.
Nach dem onchange ereignis und setzt es den Itemindex auf das Item das angeklickt wurde.....argh...also auf das richtige Item...

Der beste weg wäre dieser code schnipsel gewesen!
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  (ComboEdit1.Items as TStringList).CaseSensitive := True;
end;
aber als der kam hatte ich mir schon ein eigenes Frankenstein-Control gebaut was das wie gewünscht macht.
Jeder der das TComboedit control benutzt sollte mkinzlers Lösung verwenden!
Aber nur, wenn man ganz bewusst vom Standardverhalten abweichen will, denn Standard ist, dass Strings.indexof eben nicht case-sensitiv ist: http://docwiki.embarcadero.com/Libra...trings.IndexOf

Insofern kann ich hier keinen Fehler erkennen und der Aussage TComboEdit ItemIndex funktioniert in Firemonkey nicht, könnte ich so nicht zustimmen.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#18

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 10. Okt 2018, 12:40
Ich sage nicht das IndexOf nicht funktioniert!
Ich sage das TcomboEdit nicht in der Lage ist mir den TComboEdit.IitemIndex des angeklickten Items im OnChange event zu liefern!
Tatsächlich weicht der ItemIndex vom angezeigten Text und vom ausgewählten element ab!
Das liegt scheinbar daran das TStrings.IndexOf involviert ist.
In TCombobox ist das kein Problem!
Und TComboEdit.ItemIindex wird in der DoMousUp methode noch gesetzt, auf den richtigen wert!
Ich kann mit nem Buttonklick den wert abfragen!

TComboEdit.ItemIndex verhält sich also wie folgt
Ausgangs Zustand:
TComboEdit.ItemIndex zeigt auf ein Element
TComboEdit.Text enthält den String des Elements das durch TComboEdit.ItemIndex referenziert wird.

Zustand im OnChange Ereignis nach dem man ein anderes Element angeklickt hat:
TComboEdit.ItemIndex Referenziert auf das erste Element das einen "sametext" aber abweichenden String hat wie das angeklickte Element!
TComboEdit.Text enthält den String des elements das Angeklickt wurde, aber NICHT durch TComboEdit.ItemIndex referenziert wird.

Zustand wenn mann danach auf einen Button klickt:
TComboEdit.ItemIndex zeigt auf ein Element
TComboEdit.Text enthält den String des Elements das durch TComboEdit.ItemIndex referenziert wird.


Ok, also absolut das Verhalten das TComboedit zeigen soll! Wenn das so ist...
Ich habe mir eine Lösung gebaut die sich verhält wie erwartet.
Ich bin glücklich.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (10. Okt 2018 um 13:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 10. Okt 2018, 19:54
Danke, dass Du das Problem noch mal konkreter beschrieben hast, es ist oft nicht einfach, das Problem ohne konkretes Demo nachzuvollziehen.

Aber mit Deiner zusätzlichen Beschreibung konnte ich es schon besser verstehen und war in der Lage selber ein entsprechendes Demo zu bauen und kann bestätigen, dass da doch - eben in dem von Dir beschriebenen bestimmten Fall - ein Fehler ist.

Ich habe einen entsprechenden Fehlerreport hier eingestellt: https://quality.embarcadero.com/browse/RSP-21401

Geändert von Harry Stahl (10. Okt 2018 um 19:57 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#20

AW: TComboEdit ItemIndex funktioniert in Firemonkey nicht

  Alt 11. Okt 2018, 11:06
Cool Danke!

Aber das Verhalten ist verrückt oder?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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