Einzelnen Beitrag anzeigen

I.A

Registriert seit: 14. Jan 2007
83 Beiträge
 
#3

Re: ComboBox in Stringgrid verwenden

  Alt 29. Jan 2009, 16:05
Hallo!

Ich fürchte, ich habe noch grundsätzliche Verständnisschwierigkeiten. Ich wusste nämlich schon mal nicht, das ich ich ein DrawCell-Ereignis auslösen muss. Bitte hilf mir mal weiter! Ich weiß nicht, wie ich auf den Punkt kommen soll.

Welcher Code muss dann in der Ereignisbehandlung von OnDrawCell ausgeführt werden? Wo finde ich weitere Infos. Werde mir das von Lucky geschriebene Win-API Handbuch auf jeden Fall durcharbeiten.

Ich suche eine allgemeine Lösung. Ich will statt der ComboBox auch andere Komponenten zur Dateneingabe in die Stringgrid-Zelle verwenden können.


Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    ComboBox1: TComboBox;
    procedure ComboBox1Exit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    private
      procedure CMDialogKey(var msg: TCMDialogKey); message CM_DIALOGKEY;
    public
  end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
  if ActiveControl = ComboBox1 then begin
    if msg.CharCode = VK_TAB then begin
      // setzt den Fokus zurück auf das StringGrid
      StringGrid1.SetFocus;
      //Was macht die Perform-Anweisung hier?
      StringGrid1.Perform(WM_KEYDOWN, msg.CharCode, msg.KeyData);
      msg.Result := 1;
      exit;
    end;
  end;
  inherited;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  with sender as TComboBox do begin
    hide;
    if ItemIndex >= 0 then
      with StringGrid1 do
        //Aha, hier wird also der in der Combobox ausgewählte Eintrag in die Stringgrid-Zelle
        //übertragen.
        Cells[col, row] := Items[ItemIndex];
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Combobox1.Parent := Stringgrid1;
  ComboBox1.Visible := False;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
var
  R: TRect;
  org: TPoint;
begin
  if (ACol = 2) and (ARow >= StringGrid1.FixedRows) then begin
    StringGrid1.Perform(WM_CANCELMODE, 0, 0);
    R := StringGrid1.CellRect(ACol, ARow);
    org := self.ScreenToClient(self.ClientToScreen(R.TopLeft));
    with ComboBox1 do begin
      //Ich nehme an, in der folg. Zeile wird dei Lage der Combobox berechnet
      SetBounds(org.X, org.Y, R.Right-R.Left, Stringgrid1.Height);
      //Klar, hier wird der Itemindex auf die Position in der Liste der Combobox gestellt
      ItemIndex := Items.IndexOf(StringGrid1.Cells[ACol, ARow]);
      Show; //hier steht doch Show. Trotzdem liegt mein Problem vor???
      BringToFront;
      SetFocus;
      DroppedDown := true;
    end;
  end;
end;

end.
Warum aber wird die Combobox nicht korrekt dargestellt, sondern scheint nur kurz auf, während sich die Auswahlliste öffnet. Die Combobox sollte doch erst wieder unsichtbar werden, wenn ich eine andere Zelle auswähle. Was muss da in DrawCell Event Handler stehen?

Bitte bitte helft mir. Ich studiere auch das WinAPI Handbuch.
  Mit Zitat antworten Zitat