Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ComboBox in Stringgrid verwenden (https://www.delphipraxis.net/128408-combobox-stringgrid-verwenden.html)

I.A 29. Jan 2009 12:33


ComboBox in Stringgrid verwenden
 
Hallo!

Habe grad mal im Forum gestöbert, ob ich was passendes finde. Habe nämlich im Forum Delphi Treff das hier gefunden:

http://www.delphi-treff.de/tipps/kom...id%20einbauen/

Habe mir das Programm mit Delphi nachgebaut. Jetzt tritt das Problem auf, das zwar die der Combobox angeschlossene Liste sichtbar wird, aber nicht die ComboBox selber. Wenn ich mit Enter die Liste schließe ist die Combobox auch nicht mehr zu sehen.

Bei Auswahl einer Zelle mit Combobox wird diese kurz sichtbar, die Liste öffnet sich, wobei die Combobox verschwindet, während die Liste sichtbar bleibt. Beim Schließen der Liste ist die Combobox nicht sichtbar. Der aus der Combobox ausgewählte Eintrag erscheint erst nach Auswahl einer anderen Zelle.

Muss ich eventuell Optionen für das Stringgrid ändern? Werd ich auf jeden Fall ausprobieren.

Wer kann mir helfen?

taaktaak 29. Jan 2009 12:58

Re: ComboBox in Stringgrid verwenden
 
Verwendest du OnDrawCell() und überschreibst mit deiner eigenen Ausgabeoperation die ComboBox?

I.A 29. Jan 2009 15:05

Re: ComboBox in Stringgrid verwenden
 
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.

taaktaak 29. Jan 2009 18:04

Re: ComboBox in Stringgrid verwenden
 
Also, ich habe das selbst noch nicht verwendet (und im Augenblick keine Lust das auszuprobieren), aber ich bin mir ziemlich sicher, dass folgender Code im OnSelect() falsch ist und wohl in das OnDraw() gehört
Delphi-Quellcode:
R := StringGrid1.CellRect(ACol, ARow);
org:= self.ScreenToClient(self.ClientToScreen(R.TopLeft));
with ComboBox1 do begin
  SetBounds(org.X, org.Y, R.Right-R.Left, Stringgrid1.Height);
  ItemIndex := Items.IndexOf(StringGrid1.Cells[ACol, ARow]);
  Show;  // oder Visible:=true
  BringToFront;


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