![]() |
Combobox: im Onselect Text ändern geht nicht
In der Stringliste meiner Combobox befindet sich, je nach Land, in dem sich der gerade bearbeitete Kunde befindet, die Österreichische oder die Deutsche Postleitzahlentabelle mit allen zugehörigen Orten. Die Beziehung ist leider nicht 1:1, zu vielen Orten gibt es mehrere Postleitzahlen und zu vielen Postleitzahlen mehrere Orte.
Ich würde gerne, nachdem der User einen Eintrag ausgewählt hat, den Ortsnamen aus dem Text der Combobox weglöschen und den entsprechenden Text ins darunter liegende Edit-Feld Ort eintragen. Letzteres funktioniert sowohl im Onselect als auch im Oncloseup problemlos, aber ich schaffe es nicht, dem Combobox.text den gekürzten Text mit nur der Postleitzahl zu füttern. Dieses zeigt überhaut keine Wirkung, weder im Onselect noch im oncloseup:
Delphi-Quellcode:
offenbar wird der Text der Combobox erst nach Abarbeitung meiner OnSelect Routine gesetzt.
TCombobox(sender).text:=copy(TCombobox(sender).Items[TCombobox(sender).Itemindex],1,4);
Wenn ich ein
Delphi-Quellcode:
hinzufüge, dann löscht mir das Programm den Inhalt der Combobox komplett, auch dann bleibt meine Zuweisung natürlich auch wirkungslos. Ein Ereignis, das nach der Zuweisung des Textes an die Combobox durch das Programm zur Vefügung stehen würde, und in dem ich dann den Text ändern könnte, finde ich nicht.
TCombobox(sender).Itemindex:=-1
Ich habe jetzt schon daran gedacht, mit einem Timer 200ms nach dem Schliessen der Combobox den Ortsnamen herauszulöschen, aber irgendwie erscheint mir das doch recht russisch. |
AW: Combobox: im Onselect Text ändern geht nicht
Warum nicht erst im OnExit?
Was ist, wenn man noch garnicht fertig ist, sondern erstmal gemütlich durch die Inhalte steppt? Aber eigentlich wäre sowas, wie eine LookupComboBox auch ganz praktisch, wo man parallel zum Anzeigetext intern den eigentlichen Arbeitstext hat. |
AW: Combobox: im Onselect Text ändern geht nicht
Provisorisch hab ich es ins OnExit verfrachtet.
Aber ich finde, es wäre für den User klarer, wenn im Textfeld der Combobox selbst von vorneherein immer nur die Postleitzahl angezeigt würde. So erscheint jetzt der Ortsname im Plz-Feld, wo er nicht hingehört, während der User durch die Dropdownliste scrollt, und verschwindet wie von Geisterhand erst dann, wenn der Focus zu einer anderen Komponente wechselt. Irgendwie taugt mir das überhaut nicht. |
AW: Combobox: im Onselect Text ändern geht nicht
Hier eine Methode die ich gelegentlich nutze. Müsste auch mit Combobox funktionieren:
Delphi-Quellcode:
Button1 läd den Inhalt des Windows-Ordners als Liste. Jeder Eintrag enthält den Pfad und Dateinamen, also etwa: "c:\windows\calc.exe".
procedure GetAllFiles(Path: String; List: TStrings);
var Search: TSearchRec; begin if FindFirst(Path + '*.*', faAnyFile, Search) = 0 then repeat List.Add(Path + Search.Name); until FindNext(Search) <> 0; FindClose(Search); end; procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var TopDiff: Integer; //zentriert Text vertikal FileName: String; begin with (Control as TListbox) do begin FileName := ExtractFileName(Items[Index]); TopDiff := (ItemHeight div 2) - (Canvas.TextHeight(Items[Index]) div 2); Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + TopDiff, FileName; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Clear; ListBox1.Style := lbOwnerDrawFixed; GetAllFiles('C:\Windows\', ListBox1.Items); end; In der ListBox befindet sich im Item der ganze Pfad, angezeigt wird aber nur der Dateiname "calc.exe". Es wird also etwas anderes angezeigt als drin ist. Wie das? Hier wird das Item einfach selbst gezeichnet. Statt des ganzen Textes wird nur der Dateiname ausgegeben. Auf diese Weise kann der ganze Pfad für weitere Nutzung im Item bleiben, aber nur der Dateiname wie gewünscht angezeigt werden. |
AW: Combobox: im Onselect Text ändern geht nicht
Die Steuerung per Pfeil hoch und runter machst du damit halt kaputt.
Wenn nicht im OnExit, dann halt im OnCloseUp. Allerdings wäre es dann nur repariert, wenn Hoch/Runter bei geöffnetem DropDown richtig funktioniert und bei geschlossenem DropDown nicht. Also müsste es sowohl im OnCloseUp, als auch im OnExit erfolgen. IMHO wäre hier dennoch eine LookupComboBox hier besser, aber da du im Edit ja nicht den LookupText (DisplayValue) anzeigen willst, sondern den internen Text, wirst du dir da wohl eine eigene Komponente basteln müssen, bzw. du könntest von einer LookupComboBox ableiten und das CustomDraw des Edits überschreiben. |
AW: Combobox: im Onselect Text ändern geht nicht
@Popov
Das ist eine interssante Variante - blöderweise hilft sie mir nicht weiter, weil ich in der Combobox selbst ja die Einträge ausgeben will, wie sie sind, und nur das Textfeld anders haben will - Jetzt gibt es zwar auch für die Kombobox ein Ereignis OnDrawItem, mit dem ich die Items der Dropdownliste zeichnen kann, aber um nur das Textfeld der Combobox selbst zu zeichnen, habe ich nichts gefunden. Ich habe jetzt die Lösung mit dem Timer implementiert, und das funktioniert eigentlich sehr gut (und erstaunlich einfach):
Delphi-Quellcode:
// Ereignisbehandlungsroutine für OnSelect
procedure TPdfMain.PlzSelect(Sender: TObject); begin tmCheckPlz.Enabled:=true; // Timer starten end; // Timer Routine (100 ms) procedure TPdfMain.tmCheckPlzTimer(Sender: TObject); begin tmCheckPlz.enabled:=false; faOrt.Text:=ltrim(copy(faplz.Text,6)); faplz.Text:=rtrim(copy(faplz.Text,1,5)); end; So funktionieren auch die Pfeiltasten wie sie sollen, weil ich den Itemindex selbst nicht anrühre. Eine LookupCombo braucht doch eine Datenbankanbindung, oder? |
AW: Combobox: im Onselect Text ändern geht nicht
Eine Möglichkeit, um beim Beispiel zu bleiben:
Delphi-Quellcode:
Anhängig ob Dropdown-Liste unten ist oder nicht, wird entweder das eine oder das andere gezeigt.
procedure GetAllFiles(Path: String; List: TStrings);
var Search: TSearchRec; begin if FindFirst(Path + '*.*', faAnyFile, Search) = 0 then repeat List.Add(Path + Search.Name); until FindNext(Search) <> 0; FindClose(Search); end; procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var TopDiff: Integer; //zentriert Text vertikal FileName: String; begin with (Control as TComboBox) do begin if DroppedDown then //<<<<<<<<<<<<<< FileName := Items[Index] else FileName := ExtractFileName(Items[Index]); TopDiff := (ItemHeight div 2) - (Canvas.TextHeight(Items[Index]) div 2); Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + TopDiff, FileName); end; end; procedure TForm1.Button1Click(Sender: TObject); begin ComboBox1.Clear; ComboBox1.Style := csOwnerDrawFixed; GetAllFiles('C:\Windows\', ComboBox1.Items); end; Hier jetzt ein Beispiel mit ComboBox. |
AW: Combobox: im Onselect Text ändern geht nicht
Also ich mache das nicht mit einer ComboBox, sondern verwalte die PLZ-Stadt-Land-Beziehungen direkt in der Datenbank. Das hat den Vorteil, daß ich z.B. beim OnChange der PLZ-TDbLookUpComboBox mehr oder weniger sofort die damit verbundenen Städte in der Städe-ComboBox zur Verfügung habe. PLZ und Stadt sind natürlich auch bei mir nicht in der allerletzten Normalform, sondern befinden sich redundant im selben Record - alles andere würde die Datenbank zu langsam machen, weil es zu viel Rechenzeit benötigt. Eine dritte DBLookUpCombo läßt mich das Land auswählen. Bei allen drei Auswahlmöglichkeiten wird gefiltert. Wird das Land geändert, werden der Filter für Stadt oder PLZ (je nachdem, welcher gerade gesetzt ist) aufgehoben. Wird die PLZ geändert, wird der Filter für Städte aufgehoben und wird die Städte-Combo geändertt, wird der Filter für PLZ aufgehoben. Funktioniert tadellos.
Wenn du keine DB hast, machst du das ganze mit einem ClientDataset. |
AW: Combobox: im Onselect Text ändern geht nicht
Wenn du nachträglich den Text der ComboBox veränderst, könnte das natürlich auch komisch auf den Benutzer wirken. Die Alternative hierzu wäre, dass du die Postleitzahl und den Ort getrennt in einem Object hälst, dass du der ComboBox mit TComboBox.Items.AddObject() hinterlegst. Somit wärst du auch für alle anderen Dinge offen. Dann könntest du dir auch überlegen, als Caption des Items immer nur die PLZ anzuzeigen und den Ort hintendran zu malen wie es auch hier schon beschrieben wurde.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz