[gelöst] ComboBox in StringGrid

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

[gelöst] ComboBox in StringGrid

Beitrag von Michl »

Hallo Allerseits,

folgendes Problem:

habe ein StringGrid, in dessen Zelle ich eine Combobox aufrufe. Dies funktioniert soweit auch.

Leider wird nach der Wahl eines Inhalts der ComboBox eine erneute Zelle im Stringgrid aufgerufen. Wie kann ich dem Program sagen, dass nach dem ComboBoxaufruf keine Zelle im StringGrid erneut geklickt wurde???

Habe den ganzen Tag das Forum durchsucht und bin leider nicht fündig geworden. Denke, es muss nur eine Variable zurückgesetzt werden wie >ComboBox1.hide< oder so?!

Bsp:

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    StringGrid1: TStringGrid;
    procedure ComboBox1Select(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
      var CanSelect: Boolean);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
var
  R:TRect;
  org:TPoint;
  b:byte;
begin
  if (ACol>1) and (ARow>1) then begin
    ComboBox1.Parent := StringGrid1;
    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);
      Clear;
      for b:=0 to 5 do items.Add('Wahl'+inttostr(b));
      ItemIndex:=Items.IndexOf(StringGrid1.Cells[ACol, ARow]);
      Show;
//        BringToFront;
//        SetFocus;
      DroppedDown := true;
    end;
  end;
end;
 
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:=ComboBox1.Items[ComboBox1.Itemindex];
 
  ComboBox1.Hide;              //funktioniert nicht
  ComboBox1.Visible:=false; //funktioniert nicht
  StringGrid1.BringToFront; //funktioniert nicht
  StringGrid1.Refresh;        //funktioniert nicht
  StringGrid1.Repaint;        //funktioniert nicht
end;
 
 
end.
 
 
Danke für Eure Hilfe!
Zuletzt geändert von Michl am Sa 15. Dez 2012, 13:43, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: ComboBox in StringGrid

Beitrag von Thomas B. »

Wenn Du eine neuere Lazarus-Version nutzt (ich glaube >0.9.30), dann nicht die ComboBox separat definieren, sondern
beim StringGrid im Objektinspektor per Rechtsklick neue Spalten erzeugen ("Eintrag hinzufügen") und den ButtonStyle auf cbsPickList setzen.
siehe auch http://wiki.freepascal.org/Grids_Refere ... ll_Editors

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ComboBox in StringGrid

Beitrag von Michl »

Hallo Thomas,

danke für die Antwort!

habe das mit der PickList schon in http://www.lazarusforum.de/viewtopic.php?f=18&t=2361 gelesen und versucht dies zu nutzen. Da die PickList immer nicht angezeigt wurde hatte ich diesen Versuch aufgegeben.

Jetzt habe ich auf Dein Anraten hin dies nochmals probiert und jetzt funktioniert es auch. Mein Anfängerfehler :oops: war, dass ich vergessen habe im meinem Versuchsprogram den Stringgrid schreibbar zu machen: StringRid -> Eigenschaften -> Options -> goEditing=true

Da die Inhalte in meinem StringGrid nicht nur ausgewählt werden können, sondern auch in einigen Feldern manuell eingetragen werden müssen, erstelle ich die ComboBox im Quelltext, was jetzt auch prima funktioniert:

Code: Alles auswählen

 
procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
  var Editor: TWinControl);
begin
  if aCol=1 then begin
    Editor := StringGrid1.EditorByStyle(cbsPickList);
    TCustomComboBox(Editor).Items.CommaText := 'A,B,C,D';
  end;
end;
Vielen Dank nochmals!!!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten