AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Combobox: im Onselect Text ändern geht nicht

Ein Thema von idefix2 · begonnen am 15. Mai 2015 · letzter Beitrag vom 16. Mai 2015
Antwort Antwort
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Combobox: im Onselect Text ändern geht nicht

  Alt 15. Mai 2015, 22:22
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:
TCombobox(sender).text:=copy(TCombobox(sender).Items[TCombobox(sender).Itemindex],1,4); offenbar wird der Text der Combobox erst nach Abarbeitung meiner OnSelect Routine gesetzt.

Wenn ich ein
TCombobox(sender).Itemindex:=-1 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.
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 15. Mai 2015, 22:53
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (15. Mai 2015 um 22:56 Uhr)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 15. Mai 2015, 23:07
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 16. Mai 2015, 00:27
Hier eine Methode die ich gelegentlich nutze. Müsste auch mit Combobox funktionieren:
Delphi-Quellcode:
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;
Button1 läd den Inhalt des Windows-Ordners als Liste. Jeder Eintrag enthält den Pfad und Dateinamen, also etwa: "c:\windows\calc.exe".

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.

Geändert von Popov (16. Mai 2015 um 01:40 Uhr) Grund: Kleinen Fehler im Code beseitigt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 16. Mai 2015, 01:06
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#6

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 16. Mai 2015, 01:20
@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?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 16. Mai 2015, 01:38
Eine Möglichkeit, um beim Beispiel zu bleiben:
Delphi-Quellcode:
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;
Anhängig ob Dropdown-Liste unten ist oder nicht, wird entweder das eine oder das andere gezeigt.

Hier jetzt ein Beispiel mit ComboBox.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 16. Mai 2015, 08:25
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Combobox: im Onselect Text ändern geht nicht

  Alt 16. Mai 2015, 10:48
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:45 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