Witam,
Muszę dodać zdarzenie do oryginalnego komponentu czy można to zrobić jakoś inaczej?
Może ktoś podesłać kod dodania zdarzenia?
Pozdrawiam
Witam,
Muszę dodać zdarzenie do oryginalnego komponentu czy można to zrobić jakoś inaczej?
Może ktoś podesłać kod dodania zdarzenia?
Pozdrawiam
SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);
Jak z Value mam wyciągnąć informację że edycja się zakończyła?
dasej napisał(a):
Muszę dodać zdarzenie do oryginalnego komponentu czy można to zrobić jakoś inaczej?
Bez pełnych źródeł komponentu nie dodasz takiego zdarzenia. Ehh, patrz niżej. O subclassingu zapomniałem. :D
dasej napisał(a):
Jak z Value mam wyciągnąć informację że edycja się zakończyła?
To zależy co konkretnie chcesz zrobić. Argument Value
zawsze posiada nową wartość wprowadzoną przez użytkownika, dzięki czemu możesz ją na bieżąco modyfikować, jeśli wprowadzono niepoprawne dane.
Może i wydaje się trochę przekombinowane ale działa:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;
type
TOnSetEditMode = procedure(Sender: TObject; Row, Col: Integer; EditMode: Boolean) of object;
TStringGrid = class(Vcl.Grids.TStringGrid)
private
fEditMode: Boolean;
fLastRow, fLastCol: Integer;
fOnSetEditMode: TOnSetEditMode;
procedure DoSetEditMode;
protected
procedure WMSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Msg: TWMKillFocus); message WM_KILLFOCUS;
procedure WMLButtonDblClk(var Msg: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
procedure WMLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMKeyDown(var Msg: TWMKeyDown); message WM_KEYDOWN;
public
property OnSetEditMode: TOnSetEditMode read fOnSetEditMode write fOnSetEditMode;
end;
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure OnSetEditMode(Sender: TObject; Row, Col: Integer; EditMode: Boolean);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TStringGrid.DoSetEditMode;
begin
if (fEditMode <> Self.EditorMode) and (Assigned(fOnSetEditMode)) then
fOnSetEditMode(Self, fLastRow, fLastCol, Self.EditorMode);
fEditMode:= Self.EditorMode;
end;
procedure TStringGrid.WMLButtonDown(var Msg: TWMLButtonDown);
begin
inherited;
DoSetEditMode;
end;
procedure TStringGrid.WMLButtonDblClk(var Msg: TWMLButtonDblClk);
begin
inherited;
DoSetEditMode;
end;
procedure TStringGrid.WMSetFocus(var Msg: TWMSetFocus);
begin
inherited;
fLastRow:= Self.Row;
fLastCol:= Self.Col;
DoSetEditMode;
end;
procedure TStringGrid.WMKillFocus(var Msg: TWMKillFocus);
begin
inherited;
fLastRow:= Self.Row;
fLastCol:= Self.Col;
DoSetEditMode;
end;
procedure TStringGrid.WMKeyDown(var Msg: TWMKeyDown);
begin
inherited;
DoSetEditMode;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Clear;
StringGrid1.OnSetEditMode:= OnSetEditMode;
end;
procedure TForm1.OnSetEditMode(Sender: TObject; Row, Col: Integer; EditMode: Boolean);
const
EDIT_MODES: array [Boolean] of string = ('Po Edycji ', 'Edycja ');
begin
Memo1.Lines.Add(EDIT_MODES[EditMode] + Format('%0:d X %1:d', [Row, Col]));
end;
end.
Dzięki** kAzek.**
abrakadaber jak obsłużyć to zdarzenie?
Dobrze by było wiedzieć, co konkretnie chcesz zrobić. Bo na pytanie „jak obsłużyć to zdarzenie” można jedynie odpowiedzieć „normalnie, wygenerować je i napisać w nim swój kod”. Co konkretnie potrzebujesz zrobić? Filtrować dane podczas wprowadzania i/lub po jego zakończeniu, czy tylko przechwycić moment zakończenia wprowadzania?
Witam furious programming,
Odpowiedź na Twoje pytanie jest zawarta w temacie.
"Jak wykryć zakończenie edycji Cells w StringGrid"
Chcę wiedzieć kiedy użytkownik zakończył edycje w Cells.
ale po co chcesz to wiedzieć albo inaczej - co chcesz z tą wiedzą zrobić? Od odpowiedzi na to pytanie zależy czy OnSetEditText
wystarczy czy nie a jak wystarczy to jak to obsłużyć.
@furious programming: Odpowiedź nie jest taka banalna bo "skończył edycję" to takie trochę niejasne określenie i chyba trzeba to rozbić na części pierwsze.
Najbliższa prawdy jest chyba podpowiedź od @kAzek ale faktycznie dość zagmatwana. Nigdy się nad tym nie zastanawiałem a nawet jeśli kiedyś to już nie pamiętam jednak bym poszedł drogą obsłużenia:
Jednak wracają do pytania. Kiedy jest koniec edycji?
Zakładam, że autor wraz z końcem edycji chciałby to co wpisano zapisać np. do bazy lub pliku... W takim przypadku możliwości jest sporo bo czy kliknięcie w czasie pisania w innej komórce jest oczekiwanym zakończeniem edycji czy nieumyślnym błędem, czy wyjście z komórki przez zamknięcie całego formularza jest oczekiwanym zakończeniem edycji itd...