Hmm... Beeindruckend kurz, aber ich glaube, es ist nicht richtig, wenn du in EditorGetValue einen Typecast zum TCustomEdit machst - ich könnte mir vorstellen, dass der Editor auch ein ganz anderer Typ sein könnte, z.B. eine Combobox, die nicht TWinControl, aber nicht von TCustomEdit abstammt, TDateTimePicker, der von TCustomControl abgeleitet ist, etc.
Ich hatte so eine ähnliche Situation mal und konnte mir helfen, indem ich mir ein Interface deklariert habe, das in diesem Fall den Edit-Text annehmen bzw. zurückgeben muss. Jeder Editor muss eine Methode für dieses Interface zur Verfügung stellen. Dann sollte es gehen ohne Type-Cast:
Code: Alles auswählen
const
GUID_GridEditor = '{1EE4FE54-BD68-4BD9-9B6D-9C1151698DA0}'; // Wert mit SHIFT+CTRL+G erzeugen
type
IGridEditor = interface [GUID_GridEditor]
function GetEditValue: String;
procedure SetEditValue(AValue: String);
end;
TStringCellEditor = class(TCustomMaskEdit, IGridEditor)
...
function GetEditValue: String;
procedure SetEditValue(AValue: String);
end;
TPickListCellEditor = class(TCustomCombobox, IGridEditor)
...
function GetEditValue: String;
procedure SetEditValue(AValue: String);
end;
// ... genauso auch mit den anderen
function TStringCellEditor.GetEditValue: String;
begin
Result := Text;
end;
procedure TStringCellEditor.SetEditValue(AValue: String);
begin
Text := AValue;
end;
function TPickListCellEditor.GetEditValue: String;
begin
Result := Text;
end;
procedure TPickListCellEditor.SetEditValue(AValue: String);
var
idx: Integer;
begin
idx := Items.IndexOf(AValue);
if idx <> -1 then ItemIndex := idx else Text := AValue;
end;
// etc. -- mir ist nicht ganz klar, wie das beim TButtonCellEditor zu machen ist...
procedure TCustomGrid.KeyDown(...);
begin
...
VK_ESCAPE:
begin
Editor.SetEditvalue(FEditorOldValue);
EditorHide;
Key := 0;
end;
...
end;
function TCustomGrid.EditorGetValue(validate:boolean=false): boolean;
begin
if validate then begin
CurValue := Editor.GetEditValue;
...
end;
Danke für den Hinweis auf FEditorOldValue.
[EDIT]
Wobei... Bei dem TButtoncellEditor sieht man, dass ein String vielleicht nicht die richtige Übergabegröße ist. Was ist, wenn der Editor eine Checkbox ist? Die naheliegende Größe wäre da ein boolean. Oder eine ColorBox? Da wäre ein TColor auf jeden Fall besser geeignet als ein String. Vielleicht muss man den Code oben so umschreiben, dass das GridEditor-Interface mit Hilfe von variants kommuniziert. Aber dann kommt das nächste Problem: ValidateEntry vergleicht die Eingabe, also den Rückgabewert des Interfaces, mit einem String! Das wird der tiefere Grund sein, warum das ValidateEntry nur für das StringGrid existiert. Ich fürchte fast, das alles führt zu einem massiven Umbau der Grid-Komponente, was der Betreuer des Grids nicht mitmachen wird... Natülich können diese Spezial-Editoren auch mit Strings arbeiten, aber wiegesagt, das erscheint mir etwas unsauber. Vielleicht solltest du dein Vorhaben zuerst in der Mailing-Liste mit den Entwicklern diskutieren.