AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ComboBox in Stringgrid verwenden

Ein Thema von I.A · begonnen am 29. Jan 2009 · letzter Beitrag vom 29. Jan 2009
Antwort Antwort
I.A

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

ComboBox in Stringgrid verwenden

  Alt 29. Jan 2009, 13:33
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?
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#2

Re: ComboBox in Stringgrid verwenden

  Alt 29. Jan 2009, 13:58
Verwendest du OnDrawCell() und überschreibst mit deiner eigenen Ausgabeoperation die ComboBox?
Ralph
  Mit Zitat antworten Zitat
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
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#4

Re: ComboBox in Stringgrid verwenden

  Alt 29. Jan 2009, 19:04
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;
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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