Autor |
Beitrag |
TheEquinox
      
Beiträge: 16
|
Verfasst: Mi 14.09.11 17:39
Hallo,
ich habe eine Combobox mit Style CSDropDownList. Ich würde jetzt gerne darauf reagieren wenn sich der Wert ändert, z.B. wenn der Benutzer einen anderen Eintrag aus der Liste wählt. Leider wird das OnChange Event aber niemals aufgerufen, egal wie wild ich in der Dropdownliste Items anklicke.
Was mache ich falsch ? Kann es damit zusammenhängen, dass die Combobox auf einem TFrame liegt ?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 14.09.11 18:53
Versuch mal OnClick, sonst müsste ich zu Hause mal schauen...
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mi 14.09.11 19:05
TheEquinox hat folgendes geschrieben : | Kann es damit zusammenhängen, dass die Combobox auf einem TFrame liegt ? |
Bei mir funktioniert das unter Delphi2009 auch auf einem Frame einwandfrei.
Welche Delphi-Version hast du denn? Wie sieht denn dein Code innerhalb von OnChange aus? Hast du mehrere Comboboxen und reagierst auf die falsche?
|
|
TheEquinox 
      
Beiträge: 16
|
Verfasst: Mi 14.09.11 20:02
Hallo, ich benutze Delphi 7.
Der Code im OnChange Event ist denke ich egal, da er schon die erste Zeile, in der ich einen Breakpoint setze, nicht anspringt, was das eigentlich Problem ist.
Die Combobox ist auch die einzige Combobox in der ganzen Anwendung. Diese wird eingeblendet, wenn der Benutzer in einem Stringgrid eine editierbare Spalte anklickt. Dann soll aus der Combobox, bzw. Dropdown-Liste ein Eintrag gewählt werden und dieser Eintrag dann ins Stringgrid geschrieben werden.
OnClick, OnExit etc. funktionieren auch alle. Derzeit mache ich das Ganze auch notgedrungen über OnExit, aber es ist etwas blöd, dass man erst irgendwo anders aufs Formular klicken muss, damit der ausgewählte Eintrag übernommen wird. Deswegen würde ich das Ganze gerne gleich machen, wenn sich der ausgewählte Eintrag in der Combobox ändert.
Bin für weitere Ideen dankbar...
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 14.09.11 20:50
Ich weiß nicht was du machst, aber ich habe es gerade im virtuellen PC mit Delphi 7 ausprobiert. Es funktioniert problemlos. Siehe Anhang.
Einloggen, um Attachments anzusehen!
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 02.01.13 12:38
Hallo,
ich habe gerade das gleiche Problem wie TheEquinox. Auch ich nutze die ComboBox um in einem StringGrid Eingaben entgegenzunehmen. Das StringGrid wird bei mir Dynamisch erzeugt, aber liegt aber nicht auf einem Frame.
Hierbei werden weder OnChange, OnCloseUp oder OnClick aufgerufen, mit einer Ausnahme. Treffe ich meine Auswahl per Texteingabe (drücke also t in der ComboBox um dein Eintrag "test" zu wählen) so wird onChange ausgelöst. Wähle ich den Eintrag per Maus geschieht nichts.
Hierbei wird die ComboBox im Constructor meiner StringGrid Ableitung angelegt und mit den Events verknüft (eigentlich will ich nur OnChange)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| fEDCombo := tComboBox.Create(nil); fEdCombo.Visible := False; fEDCombo.Parent := Self; fEDCombo.Style := csDropDownList; fEDCombo.OnChange := ComboChange; fEDCombo.OnCloseUp := ComboChange; fEDCombo.OnClick := ComboChange; |
Wobei ComboChage recht einfach gestaltet ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Procedure tMyGrid.ComboChange(Sender: tObject); Begin Cells[Col, Row] := fEDCombo.Text; If Assigned(OnSetEditText) Then OnSetEditText(self, Col, Row, fEDCombo.Text); End; |
Aufgerufen wird die Box im CanEditShow:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| Function tMyGrid.CanEditShow: tBool; Var ColData : pSimpleColumnData; R: TRect; org: TPoint; Begin Result := inherited CanEditShow; If Result Then Begin If (ComboBoxBedingungErfüllt) Then Begin fEDCombo.Items.Assign(NachschlageListe); fEDCombo.ItemIndex := fEDCombo.Items.IndexOf(Cells[Col, Row]); If (fEDCombo.ItemIndex = -1) Then fEDCombo.ItemIndex := 0; fActiveEditor := fEDCombo; End; If Assigned(fActiveEditor) Then Begin Perform(WM_CANCELMODE, 0, 0); R := CellRect(Col, Row); org := self.ScreenToClient(self.ClientToScreen(R.TopLeft)); fActiveEditor.SetBounds(org.X, org.Y, R.Right-R.Left, Height); fActiveEditor.Show; fActiveEditor.BringToFront; Result := False; End; End; End; |
Jetzt würde mich natürlich brennend interessieren ob TheEquinox eine Lösung gefunden hat, oder jemand anderes eine Idee zu diesem Phänomen hat.
Gruß
Klabautermann
PS: Verwendet wird hier übrigens Delphi 2007
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 02.01.13 14:28
Da kann ich das nachvollziehen, ja. Ich nehme mal an das hast du selbst schon gesehen, da kommt von Windows ja in TCustomCombo.CNCommand ein CBN_SELENDCANCEL gefolgt von einem CBN_KILLFOCUS rein. msdn.microsoft.com/d...775823(v=vs.85).aspx hat folgendes geschrieben: | Sent when the user selects an item, but then selects another control or closes the dialog box. It indicates the user's initial selection is to be ignored. The parent window of the combo box receives this notification code through the WM_COMMAND message. |
Leider behandelt Delphi dieses Beenden aber nicht, so dass die ComboBox ohne Funktion sichtbar bleibt...
Was da genau schief geht, weiß ich aber nicht. Irgendwie wird der Fokus geklaut, vermutlich von der weiteren Behandlung des Edit-Events. Vielleicht geht es, wenn du dir dort eine Message schickst oder so.
Einfacher wäre, wenn du einfach eine TVirtualStringTree nimmst, dann hast du das Problem nicht. Die benutzen wir unter anderem genau für solche Zwecke und das funktioniert mit den mitgelieferten Editoren (hier eben TComboEditLink für die ComboBox) problemlos.
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 02.01.13 15:54
Hallo,
jaenicke hat folgendes geschrieben : | Einfacher wäre, wenn du einfach eine TVirtualStringTree nimmst, dann hast du das Problem nicht. Die benutzen wir unter anderem genau für solche Zwecke und das funktioniert mit den mitgelieferten Editoren (hier eben TComboEditLink für die ComboBox) problemlos. |
ja, wahrscheinlich ist es wirklich an der Zeit das Gitter mal auf den VirtualTree umzustellen. Den nutze ich (auch in diesem Projekt) sehr gerne, habe das Grid hier aber "geerbt" und es hat noch ein paar andere Spezialitäten welche ich ebenfalls umheben müsste, deshalb scheue ich mich schon eine weile davor. Aber irgendwie komme ich immer, wenn irgendwo ein StringGrid eingesetzt wird an den Punkt, an den ich es auf Mike Lischkes Tree umbaue, warum sollte es hier anders sein?
Danke für den den Hinweis auf das nicht behandelte Command,
Klabautermann
|
|
|