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/)
-   -   Delphi Text in Combobox nach Auswahl ändern (https://www.delphipraxis.net/105314-text-combobox-nach-auswahl-aendern.html)

oki 19. Dez 2007 17:22


Text in Combobox nach Auswahl ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry für den doofen Titel. Mir fällt im Moment kein besserer ein.

Folgende Aufgabenstellung:

Ich habe eine Eingabemaske für Adressdaten. Hier soll ein Anzeigename automatisch generiert werden. Folgende Möglichkeiten stehen zur Auswahl:
Delphi-Quellcode:
type
  (* Typ zur automatischen Bildung des Anzeigenamens *)
  TVisibleNameBuild = (
                       vnb_Free,               // freier Eintrag für Anzeigename
                       vnb_Vorname_Name,       // Anzeigename aus Vorname Name zusammensetzen
                       vnb_Name_Vorname,       // Anzeigename aus Name, Vorname zusammensetzen
                       vnb_Firma,              // Anzeigename aus Firma bilden
                       vnb_Name_Firma,         // Anzeigename aus Name, Firma zusammensetzen
                       vnb_Firma_Name          // Anzeigename aus Firma, Name zusammensetzen
                       );
In der verwendeten Combobox sind dann für die Items folgende Einträge gesetzt:

Zitat:

freier Eintrag
Vorname Name
Name, Vorname
Firma
Name, Firma
Firma, Name
Das ganze soll folgendermaßen funzen. Wählt der Benutzer einen Eintrag aus der Combobox aus, so soll der Text der Anzeige der Combobox aus den entsprechenden EditFeldern für Name, Vorname und Firma der Eingabemaske gebildet werden. Also Click auf Eintrag "Name, Vorname" und im Edit-Bereich der Combobox erscheint "Mustermann, Klaus".

nun klappt das aber gar nicht so wie ich es möchte. Wenn ich im OnChange oder OnClick ereignis folgenden Code aufrufe wird nicht mein neuer Text gesetzt, sondern der Item-Eintrag der Combobox.

Folgender Code:
Delphi-Quellcode:
procedure TAddressEntryForm.BuildVisibleName(BuildMode: TVisibleNameBuild);
begin
  case BuildMode of
    vnb_Free: ;
    vnb_Vorname_Name: ComboAnzeigename.Text := Format('%s %s', [EditVorname.Text, EditName.Text]);
    vnb_Name_Vorname: ComboAnzeigename.Text := Format('%s, %s', [EditName.Text, EditVorname.Text]);
    vnb_Firma: ComboAnzeigename.Text := EditFirma.Text;
    vnb_Name_Firma: ComboAnzeigename.Text := Format('%s, %s', [EditName.Text, EditFirma.Text]);
    vnb_Firma_Name: ComboAnzeigename.Text := Format('%s, %s', [EditFirma.Text, EditName.Text]);
  end;
end;

procedure TAddressEntryForm.ComboAnzeigenameChange(Sender: TObject);
begin
  FVisibleNameBuild := TVisibleNameBuild(ComboAnzeigename.ItemIndex);
  ComboAnzeigename.ItemIndex := -1;
  BuildVisibleName(FVisibleNameBuild);
  FOldComboEntry := Comboanzeigename.Text;
end;
Ich habe in den Anhang noch schnell einen Screenshot meiner Eingabemaske gelegt. Vielleicht wird es damit noch etwas verständlicher.

Wenn mir einer den rechten Weg weisen kann, würd mich freuen.

Ach ja, erst mal suche ich einen einfachen Weg, eine eigene abgeleitete Komponente ist immer noch möglich wenn ich nichts passendes höre.

Dank und Gruß

oki

[edit] Ups, Anhang vergessen. oki [edit]

DeddyH 19. Dez 2007 17:47

Re: Text in Combobox nach Auswahl ändern
 
Außer, dass Du nicht gegen ItemIndex - 1 prüfst, fällt mir persönlich jetzt nichts auf :gruebel:

Die Muhkuh 19. Dez 2007 17:53

Re: Text in Combobox nach Auswahl ändern
 
Zitat:

Zitat von DeddyH
Außer, dass Du nicht gegen ItemIndex - 1 prüfst, fällt mir persönlich jetzt nichts auf :gruebel:

Da hast Du Recht, aber es scheint partout nicht gehen zu wollen. Steck das mal in OnClick, OnSelect, OnCloseUp, OnChange rein. Entweder steht nichts drin oder das alte.

Sharky 19. Dez 2007 17:54

Re: Text in Combobox nach Auswahl ändern
 
Hai oki,

ich würde da anders dranngehen. Also so ähnlich wie bei den Kontakten im Outlook (Speicher unter). Also die Items der ComboBox erst beim öffnen erzeugen. Dann kannst Du einfach die Möglichkeiten anzeigen lassen die aufgrund der Einträge in den Editfeldern möglich sind.

DeddyH 19. Dez 2007 18:00

Re: Text in Combobox nach Auswahl ändern
 
Könnte es sein, dass OnChange auch bei Textänderung eintritt? Dann würde IMHO die Prüfng gegen ItemIndex -1 das Problem lösen.

oki 19. Dez 2007 18:18

Re: Text in Combobox nach Auswahl ändern
 
Hi all,

erstmal herzlichen Dank für die vielen Antworten. Sharky's Idee find ich richtig triky. Das gefällt mir so gut, dass ich das nehmen werd.

@DeddyH: Die Prüfung auf -1 hatte ich in meinem Post entfernt. Original sieht es etwas anders aus. Aber das tut ja nichts zur Sache. Den Effekt habt ihr glaub ich gesehen. OnChange tritt nur bei Benutzeränderungen auf. Wird der Text per Code gesetzt, wird das Event nicht ausgelöst.

@Die Muhkuh: Ich habs in OnClick, OnCloseUp, OnChange getestet. Gleicher Effekt.

Also, wie gesagt, ich versuchs mit Sharky's Variante und poste dann mal das Ergebnis.

Dank und Gruß oki

oki 20. Dez 2007 07:19

Re: Text in Combobox nach Auswahl ändern
 
Moin Leute,

ich möchte hier jetzt noch mein Ergebnis posten. Ich war doch recht überrascht, wie viel Zeit ich in die Umsetzung dieser simplen funktion investieren mußte. Sicher deshalb, da mich das eingangs beschriebene verhalten der Combobox doch etwas verwirrt hatte (und wohl nicht nur mich). Ob es für meine Lösungsidee einen einfachen Weg gibt ohne eine abgeleitete Komponente von TCombobox zu erstellen hab ich nicht weiter erforscht. Sharky's Ansatz erscheint mir aber sinnvoll und hier auch umsetzbar.

Folgende Funktionsweise habe ich realisiert:

In der Combobox kann für den Anzeigenamen eine freier Eintrag (Direktes Schreiben in das Edit-Feld der Combobox) oder eine Kombination aus den Feldern Vorname, Name und Firma durch Auswahl im Auswahlfeld der Combobox gewählt werden. die auszuwählenden Einträge werden zur Laufzeit im OnDropDown-Ereignis erstellt. Der ausgewählte Kombinationstyp wird in FVisibleNameBuild gespeichert. Das macht Sinn, da bei Änderungen der entsprechenden edits für Vorname, Name oder Firma dann der anzeigename in der Combobox automatisch aktualisiert wird. Man muß also nach Änderung des Namens etc. nicht noch mal die gleiche auswahl in der Combobox wiederholen.

der passende Code sieht wie folgt aus:
Delphi-Quellcode:
  (* Typ zur automatischen Bildung des Anzeigenamens *)
  TVisibleNameBuild = (
                       vnb_Free,               // freier Eintrag für Anzeigename
                       vnb_Vorname_Name,       // Anzeigename aus Vorname Name zusammensetzen
                       vnb_Name_Vorname,       // Anzeigename aus Name, Vorname zusammensetzen
                       vnb_Firma,              // Anzeigename aus Firma bilden
                       vnb_Name_Firma,         // Anzeigename aus Name, Firma zusammensetzen
                       vnb_Firma_Name          // Anzeigename aus Firma, Name zusammensetzen
                       );


  TAddressEntryForm = class(TPTBaseForm)
  .......
  private
    FVisibleNameBuild : TVisibleNameBuild;
    procedure BuildVisibleName;
  .......
  end;


procedure TAddressEntryForm.BuildVisibleName;
begin
  ComboAnzeigename.Items[0] := ComboAnzeigename.Text;
  ComboAnzeigename.Items[1] := Format('%s %s', [EditVorname.Text, EditName.Text]);
  ComboAnzeigename.Items[2] := Format('%s, %s', [EditName.Text, EditVorname.Text]);
  ComboAnzeigename.Items[3] := EditFirma.Text;
  ComboAnzeigename.Items[4] := Format('%s, %s', [EditName.Text, EditFirma.Text]);
  ComboAnzeigename.Items[5] := Format('%s, %s', [EditFirma.Text, EditName.Text]);
end;

procedure TAddressEntryForm.ComboAnzeigenameChange(Sender: TObject);
begin
  if Comboanzeigename.ItemIndex = -1 then
    FVisibleNameBuild := vnb_Free
  else
    FVisibleNameBuild := TVisibleNameBuild(ComboAnzeigename.ItemIndex);
end;

procedure TAddressEntryForm.ComboAnzeigenameDropDown(Sender: TObject);
begin
  BuildVisibleName;
end;

procedure TAddressEntryForm.ComboAnzeigenameSelect(Sender: TObject);
begin
  if Comboanzeigename.ItemIndex = -1 then
    FVisibleNameBuild := vnb_Free
  else
    FVisibleNameBuild := TVisibleNameBuild(ComboAnzeigename.ItemIndex);
end;

procedure TAddressEntryForm.EditFirmaChange(Sender: TObject);
begin
  BuildVisibleName;
  ComboAnzeigename.ItemIndex := Integer(FVisibleNameBuild);
end;

procedure TAddressEntryForm.EditNameChange(Sender: TObject);
begin
  BuildVisibleName;
  ComboAnzeigename.ItemIndex := Integer(FVisibleNameBuild);
end;

procedure TAddressEntryForm.EditVornameChange(Sender: TObject);
begin
  BuildVisibleName;
  ComboAnzeigename.ItemIndex := Integer(FVisibleNameBuild);
end;
Mit dieser Lösung kann ich gut leben. Es macht auf jeden Fall Sinn in der Procedure BuildVisibleName zu prüfen, ob Einträge Leer sind. So kann man bei Bedarf noch ein überflüssiges Kommata unterdrücken (für z.B. Firma, Name ",Mustermann" wenn Firma leer ist).

Wer den Code gebrauchen kann, der kann da aber selber kreativ werden.

dank an alle und Gruß

oki

Sharky 20. Dez 2007 08:08

Re: Text in Combobox nach Auswahl ändern
 
Hai oki,

freut mich das Dir meine Idee gefallen hat :-D

Einen Vorschlag hätte ich dann noch. Ich würde die ComboBox an einer anderen Stelle platzieren. Eine Auswahl macht ja erst Sinn nachdem man etwas in die Edit-Felder eingetragen hat.

oki 20. Dez 2007 08:22

Re: Text in Combobox nach Auswahl ändern
 
Zitat:

Zitat von Sharky
Hai oki,

freut mich das Dir meine Idee gefallen hat :-D

Einen Vorschlag hätte ich dann noch. Ich würde die ComboBox an einer anderen Stelle platzieren. Eine Auswahl macht ja erst Sinn nachdem man etwas in die Edit-Felder eingetragen hat.

Seh ich auch so. Du wirst es nicht glauben, ich hab die hin und her geschoben und nichts hat mir richtig gefallen. Also hab ich's mit der Position der Combobox vertagt :mrgreen:

Am Design werden eh noch andere Leute rummecken. Da wart ich mal ab.

Weil wir grad so schön OT sind, alle finden meine Titelleiste mit dem Gradienten doof. Und ich find die so toll :( . Wie findest Du das Fensterdesign?

Dank und Gruß oki


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