Autor Beitrag
TheEquinox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.09.11 18:53 
Versuch mal OnClick, sonst müsste ich zu Hause mal schauen...
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mi 14.09.11 19:05 
user profile iconTheEquinox hat folgendes geschrieben Zum zitierten Posting springen:
Kann es damit zusammenhängen, dass die Combobox auf einem TFrame liegt ?

Bei mir funktioniert das unter Delphi2009 auch auf einem Frame einwandfrei. :gruebel:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 02.01.13 12:38 
Hallo,

ich habe gerade das gleiche Problem wie user profile iconTheEquinox. 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)

ausblenden 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:

ausblenden 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:

ausblenden 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 = -1Then
            fEDCombo.ItemIndex := 0;
          fActiveEditor := fEDCombo;
        End;
      If Assigned(fActiveEditor) Then
        Begin
          Perform(WM_CANCELMODE, 00);
          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 user profile iconTheEquinox 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 02.01.13 15:54 
Hallo,

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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