Hallo,
ich hab ein kleines optisches Problem.
In einer StringGrid wird beim klick auf bestimmte Zellen (bzw. Spalten) eine Combobox in der Zelle angezeigt.
In den Spalten 1 und 2 wird die Combobox mit "csDropDownList" angezeigt, in der 3. Spalte mit "csOwnerDrawFixed". Bei den ersten zwei Spalten bleibt kein "Rest" mehr übrig, wenn die Combobox wieder ausgeblendet wird, bei "csOwnerDrawFixed" aber schon.
(siehe Bilder).
Das gleiche passiert mir auch in der letzten Spalte, in der ein SpinEdit angezeigt wird.
Wie kann ich verhindern, dass noch ein "Rest" übrig bleibt?
Hier noch ein bischen Code zum Anzeigen der Combobox und des SpinEdits:
Delphi-Quellcode:
procedure TMainForm.StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
const
Diff = 2;
var
S : String;
i : Integer;
Min : Integer;
Max : Integer;
Rect: TRect;
begin
//aktuelle Zeile größer der ersten (fixen) Zeile?
If ARow > 0 then
begin
//Zellen-Rect auslesen
Rect := StringGrid.CellRect(ACol, ARow);
//Zellen-Text auslesen
S := StringGrid.Cells[ACol, ARow];
If ACol in [1, 2, 3] then
begin
//ComboBox positionieren
ComboBox.SetBounds(Rect.Left + StringGrid.Left + Diff,
Rect.Top + StringGrid.Top + Diff, Rect.Width, Rect.Height - Diff);
//je nach Spalte die dementsprechende StringList in die ComboBox laden
//und den Style der ComboBox setzen
case ACol of
1: begin //Spalte: "Linie"
ComboBox.Items.Assign(StringList_Linien);
ComboBox.Style := csDropDownList;
end;
2: begin //Spalte: "Ziele"
ComboBox.Items.Assign(StringList_Ziele);
ComboBox.Style := csDropDownList;
end;
3: begin //Spalte: "Länge"
ComboBox.Items.Assign(StringList_Laenge);
ComboBox.Style := csOwnerDrawFixed;
end;
end;
//Index des aktuellen Zellen-Text in der ComboBox ermitteln
ComboBox.ItemIndex := ComboBox.Items.IndexOf(S);
//ComboBox anzeigen und fokusieren
ComboBox.Visible := true;
ComboBox.SetFocus;
end;
If ACol in [4] then
begin
//SpinEdit positionieren
SpinEdit.SetBounds(Rect.Left + StringGrid.Left + Diff,
Rect.Top + StringGrid.Top + Diff, Rect.Width, Rect.Height - Diff);
//Wert der Zelle eine Zeile drüber auslesen und als Min-Wert für
//das SpinEdit verwenden
Min := 0;
If ARow > 1 then
Min := StrToIntDef(StringGrid.Cells[ACol, Pred(ARow)], 0) + 1;
//Wert der Zelle drüber auslesen und als Max-Wert für das SpinEdit
//setzen (wenn der Wert größer null ist)
Max := 60;
If ARow < StringGrid.RowCount then
begin
i := StrToIntDef(StringGrid.Cells[ACol, Succ(ARow)], 0) - 1;
If i > 0 then
Max := i;
end;
//Min- und Max-Werte setzen
SpinEdit.MinValue := Min;
SpinEdit.MaxValue := Max;
//Zahl des aktuellen Zellen-Text in SpinEdit laden
SpinEdit.Value := StrToIntDef(S, 1);
//SpinEdit anzeigen und fokusieren
SpinEdit.Visible := true;
SpinEdit.SetFocus;
end;
end;
//
CanSelect := true;
end;