Also, das Problem dürfte ja bekannt sein, ne ComboBox in einem StringGrid einzubetten...
Gibt da auch bestimmt mehrere Lösungsvorschläge, aber die SuFu stellt mich hier leider nicht zufrieden...
Ich mache das Ganze erstmal so:
Delphi-Quellcode:
procedure TEditF.SG_SprachenSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
CRect:TRect;
begin
if(ACol=0)then
begin
CRect:=SG_Sprachen.CellRect(ACol, ARow);
inc(CRect.Left, SG_Sprachen.Left+2);
inc(CRect.Right, SG_Sprachen.Left+2);
inc(CRect.Top, SG_Sprachen.Top+2);
inc(CRect.Bottom, SG_Sprachen.Top+2);
CB_Sprachen.BoundsRect:=CRect;
CB_Sprachen.Visible:=true;
CB_Sprachen.ItemIndex:=integer(SG_Sprachen.Objects[ACol, ARow])-1;
end else CB_Sprachen.Visible:=false;
end;
procedure TEditF.SG_SprachenExit(Sender: TObject);
begin
if not(ActiveControl=CB_Sprachen)then
begin
CB_Sprachen.Visible:=false;
SG_Sprachen.Selection:=TGridRect(Rect(1, 1, 1, 1));
end;
end;
procedure TEditF.CB_SprachenExit(Sender: TObject);
begin
if not(ActiveControl=SG_Sprachen)then
begin
CB_Sprachen.Visible:=false;
SG_Sprachen.Selection:=TGridRect(Rect(1, 1, 1, 1));
end;
end;
Also immer dann, wenn eine Zelle aus Spalte 0 selektiert wird, kommt stattdessen meine CB_Sprachen da rein. wunderbar.
Auch die Kommunikation zwischen Combobox und StringGrid hab ich hingekriegt.
Problematisch wirds nun erst, wenn ich scrollen will: Immer wenn ich in Spalte 0 (per Mausrad oder Tastatur, habe die Balken deaktiviert, ich mag die nicht
) über den Rand hinaus runterscrolle, "rutscht" meine Combobox aus dem StringGrid raus (weil da das CellRect von der nächsten Zelle is).
Wenn ich dann nach oben zurückscrolle, wird die Combobox nich angezeigt, weil die Zelle ja vorher nicht sichtbar ist.
Eigentlich bräuchte ich also eine Art verzögertes StringGrid, das das OnSelectCell-Ereignis erst dann wirft, wenn der Rest aufgebaut ist, sodass man beim Aufruf von CellRect den wirklich AKTUELLEN Wert hat.
Hat jemand eine Idee, wie ich das implementiere?
Danke schonmal!
Euer LDer.
P.S.: Ich will die Combobox ERST DANN sichtbar haben, wenn ich in die Zelle reingehe. Deshalb setze ich die immer wieder um und zeichne sie nicht in die Zelle. Ich lasse mich da aber gern eines Besseren belehren!
P.P.S.: Angehängt habe ich mal ein schnell gecodetes Demoprogramm, das allein zur Reproduktion des Fehlers dient! Hier auch MIT Scrollbars im StringGrid
{Mein Originalprogramm enthält vertrauliche Daten, deshalb die abgespeckte Variante}