Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ComboBox.Items-Änderung löscht ComboBox.Text (https://www.delphipraxis.net/155657-combobox-items-aenderung-loescht-combobox-text.html)

stahli 2. Nov 2010 22:59


ComboBox.Items-Änderung löscht ComboBox.Text
 
Ich habe einen Eintrag in ComboBox.Text und ändere "im Hindergrund" die Items der Aufklappliste.
Noch nicht in meiner Funktion, aber kurz danach wird ComboBox.Text gelöscht (auch wenn wieder die gleichen Items zugewiesen wurden).

Ich dachte, es würde eine Botschaft verschickt, wollte die mit Application.Processmessages vorziehen und den alten Text wieder zuweisen.
Die Löschung des Textes erfolgt aber erst später.

Weiß jemand Rat?

sx2008 2. Nov 2010 23:11

AW: ComboBox .Items-Änderung löscht ComboBox.Text
 
Steht das Property Style auf csDropDownList?
Falls ja, bleibt der VCL nichts anderes übrig, als den ItemIndex auf -1 zu stellen, sobald du den Items eine neue Stringliste zuweist:
Delphi-Quellcode:
combobox.Style := csDropDownList;
combobox.Items := stringliste;
combobox.ItemIndex := 2; // jetzt ist .Text = Items[2]

combobox.Items := anderestringliste;
// Ist das Gleiche wie
combobox.Items.Assign(anderestringliste);
// Innerhalb von [TStringList].Assign() wird [TStringList].Clear aufgerufen
// Das Clear triggert das Event OnChange, dass wiederum in TCustomComboBox empfangen wird
// da dann combobox.Items.Count = 0 ist
// muss der ItemIndex auf -1 gesetzt werden
Workaround: ItemIndex vor Zuweisung an Items merken und danach wieder setzen

stahli 2. Nov 2010 23:19

AW: ComboBox.Items-Änderung löscht ComboBox.Text
 
Style ist csDropDown.
Der Text kann in der alten und/oder neuen Liste enthalten sein (muss aber auch nicht).
Die Items ändere ich durch ComboBox.Items.Text := StringList.Text;

Ich hätte nicht erwartet, dass das die ComboBox.Text-Eigenschaft löscht.
Muss ich mir morgen Abend nochmal genauer anschauen.

Danke schonmal!

stahli 3. Nov 2010 17:58

AW: ComboBox.Items-Änderung löscht ComboBox.Text
 
Habe es mal in einem Testprojekt untersucht.
Die Probleme entstehen, wenn die Items-Aktualisierung innerhalb ComboBox.OnChange erfolgt.
Ich werde es daher in einem Timer nachträglich lösen.


Delphi-Quellcode:
unit fTestComboBox;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ComboBox1.Items.Add('x'); // nie ein Problem
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ComboBox1.Items.Clear; // außerhalb OnChange kein Problem, Text bleibt erhalten
end;

procedure TForm1.ComboBox1Change(Sender: TObject); // Items-Select
begin
//  Button1Click(Sender); <-- kein Problem
//  Button2Click(Sender); <-- Text wird gelöscht
end;

end.

mkinzler 3. Nov 2010 18:00

AW: ComboBox.Items-Änderung löscht ComboBox.Text
 
Sichere den Text doch einfach vorher weg

stahli 3. Nov 2010 18:06

AW: ComboBox.Items-Änderung löscht ComboBox.Text
 
Hab ich schon versucht in OnChange.
Allerdings ist auch der Text selbst bis zum Ende von OnChange noch korreekt gefüllt (lt. Debuger).
Beim nächsten Schritt ist er aber leer...

ItemIndex will (kann) ich auch nicht verwerten, da der aktuelle Text nach der Neuerstellung der Items dort u.U. nicht (mehr) enthalten sein kann.

Bummi 3. Nov 2010 18:50

AW: ComboBox.Items-Änderung löscht ComboBox.Text
 
Delphi-Quellcode:
var
  s:String;
begin
  s := Combobox1.Text;
  Combobox1.Items.Text := 'ABC'#13#10'2'#13#10'3';
  Combobox1.ItemIndex := Combobox1.Items.IndexOf(s);
end;

stahli 3. Nov 2010 19:32

AW: ComboBox.Items-Änderung löscht ComboBox.Text
 
Problem gelöst, aber mal zur Info:

@Bummi: Das geht eben nicht, weil der Text evtl. vor und/oder nach der Items-Korrektur nicht in der Liste enthalten ist.

Ein Problem bei nachträglicher Korrektur über einen Timer ist auch noch aufgetreten:
Der Text wurde nicht geändert, aber der Cursor wurde vor das erste Zeichen zurückgesetzt.
Dadurch war kein kontinuierliches Schreiben möglich.

Ich ermittle die neue Liste jetzt im ComboBox.OnDropDown.
(Ist ja wohl auch dafür gedacht :wink:)


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