Autor Beitrag
delphisual
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

WIN 2000
D5 Prof
BeitragVerfasst: Mi 19.07.06 19:09 
Hallo zusammen!

Ich habe ein Problem und hoffe hier ein Paar Antworten auf meine Frage zu bekommen:

Es scheint so als ob der DBComboBox OnChange-Ereignis nicht funktioniert, laut der Borland-Hilfe ist das nur dann der Fall, wenn der Style der Komponente csDropDownList ist. Ich habe alle Styles ausprobiert und bei mir funktioniert das Ereignis überhaupt nicht!

Hat schon jemand ähnliche Erfahrungen und vielleicht bereits eine Lösung des Problems?

Vielen Dank
delphisual

_________________
(Wer ein Problem definiert, hat es schon halb gelöst.)
Arno Nym
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131



BeitragVerfasst: Mi 19.07.06 20:17 
Hi!
also ich hab das bei mir mal ausprobiert (hab allerdings Delphi 7 Prof)
Das OnChange Ereignis funktioniert bei mir für die DBCombobox (Style: CSDropDown).
Ich hab ein manuelles ändern des Inhaltes getestet also
dbcombobox1.ItemIndex := dBcombobox1.Items.Add('test');
und dann 'test' geändert, da wird das Erreingis ausgelöst.
Das Ereignis wird nicht ausgelöst, wenn eine Änderung des Eingabefeldes durch das Datenbanksystem erfolgt.
Mit freundlichen Grüßen,
Arno Nym
delphisual Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

WIN 2000
D5 Prof
BeitragVerfasst: Mi 19.07.06 20:39 
Vielen Dank Arno Nym!

Das was du beschreibst konnte ich bei mir auch erfolgreich testen und so wie es aussieht, wird das Ereignis nur dann ausgelöst, wenn der Eintrag selbst geändert wird aber nicht wenn ich den Eintrag durch einen anderen aus der Liste ersetze. Besteht denn überhaupt eine Möglichkeit, ein OnChange-Ereignis durch eine Auswahl eines anderen Elements aus der Vorgabeliste der ComboBox auszulösen?

Hat jemand eine Idee wie man das realisieren kann?

_________________
(Wer ein Problem definiert, hat es schon halb gelöst.)
Arno Nym
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131



BeitragVerfasst: Mi 19.07.06 22:26 
Hi!
was du willst ist das On_Select ereignis der normalen Combobox oder ?
Ich hab mal ein wenig rumprobiert, da man ja die normalen "WM_Irgendwas"-Messages abfangen kann dachte ich mir es wird auch mit "On_select" so gehen. Das Problem ist aber das es nicht mit der "WindowProc"-Procedure behandelbar ist sondern vorher (in TCustomCombo) mit der "CNCommand" Funktion abgefangen wird. Die Event-Code-Konstante ist dann "CBN_SELCHANGE". Vielleicht reicht dir aber auch eine der vielen anderen normalen WM-Ereignisse aus. Ich geb dir mal den Code mit dem du herausfinden kannst welche Ereignisse da so auftreten.
Du brauchst eine TDBCombobox ein TButton und ein TMemo. Im Memo werden dann die Ereigniscodes angezeigt...
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    DBComboBox1: TDBComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FDBCombobox1OldWndProc: TWndMethod;
    procedure DBCombobox1NewWndProc(var Msg: TMessage);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 FDBCombobox1OldWndProc := DBCombobox1.WindowProc;
 DBCombobox1.WindowProc := DBCombobox1NewWndProc;
end;

procedure TForm1.DBCombobox1NewWndProc(var Msg: TMessage);
begin
 Memo1.Lines.add(Inttostr(MSG.Msg));
 // if Msg.NotifyCode = CBN_SELCHANGE then begin
 // Memo1.Lines.Add('Element aus Liste gewählt');
 // end
 // else
 FDBCombobox1OldWndProc(Msg);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 DBCombobox1.WindowProc := FDBCombobox1OldWndProc;
 FDBCombobox1OldWndProc  := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 DBCombobox1.ItemIndex := DBCombobox1.Items.Add('test');
end;

end.

Der Auskommentierte Teil funktioniert nicht weil es sich wie gesagt um unterschiedliche Nachrichtentypen handelt....
Mit Freundlichen Grüßen,
Arno Nym