Форум: "Основная";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];
ВнизDBGrid -> OnKeyDown Найти похожие ветки
← →
opoloxai (2008-01-14 15:44) [0]Добрый день. Такая ситуация:
Редактируются данные в ячейке DBGrid. Находясь (к примеру) в середине текста ячейки пользователь нажимает "Alt-G". В это место нужно вставить символ "градус".
If Shift=[ssAlt] then begin
{Alt-G} If Key=71 then
TDbGrid(Sender). { ... ??? ....}
end;
Подскажите, как это сделать?
Дело в том, что мне в разных полях данной таблицы при редактировании мне нужно вставить "градус".
← →
Leonid Troyanovsky © (2008-01-14 23:39) [1]
> opoloxai (14.01.08 15:44)
> в середине текста ячейки пользователь нажимает "Alt-G".
Почему, собс-но, "Alt-G".
--
Regards, LVT.
← →
Германн © (2008-01-15 00:37) [2]
> Почему, собс-но, "Alt-G".
Вот именно. Должно быkо быть Alt-D.
← →
ЮЮ © (2008-01-15 09:41) [3]Если вопрос именно по символу °, то для обычного TEDit можно сделать так:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var msg: TWMKey;
begin
if (Shift = [ssAlt]) and (Key = 71) then begin
// alt-G
//делаем вид, что нажали клавишу, на которой стоит вполне печатный символ °
msg.Msg := WM_CHAR;
msg.CharCode := Ord("°");
TWinControl(Sender).Perform(WM_CHAR, TMessage(msg).WParam, TMessage(msg).LParam);
Key := 0;
end
end;
Если же речь по обработке OnKeyDown InplaceEdit-а Grid-а, то это уже отдельный вопрос :)
Например, можно установить у формы KeyPreview в true и уже в ёё обработчике написатьprocedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var msg: TWMKey;
begin
if (Shift = [ssAlt]) and (Key = 71) then begin
//делаем вид, что нажали клавишу, на которой стоит вполне печатный символ °
msg.Msg := WM_CHAR;
msg.CharCode := Ord("°");
TForm(Sender).ActiveControl.Perform(WM_CHAR, TMessage(msg).WParam, TMessage(msg).LParam);
Key := 0;
end
end;
Теперь это будет срабатывать на всех WinControl-ах формы
← →
Царев Евгений © (2008-01-15 10:08) [4]Я не знаю насчет DBGrid"a , но просто кинул StringGrid на форму
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ( (ssAlt in Shift) and (Key = 71) ) then
begin
TInplaceEdit(StringGrid1).SetFocus;
//символ °
SendMessage(TInplaceEdit(StringGrid1).Handle,WM_Char, word(176), 0);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Options:= StringGrid1.Options + [goEditing,goAlwaysShowEditor];
end;
в DB гриде же так же TInplaceEdit
кинул Edit(простой) и DBEdit, KeyPreview = True = False
Результат один все вроде работает.
← →
Царев Евгений © (2008-01-15 10:42) [5]Попробывал на ..\Demos\DB\Filter\Filter.dpr
добавил в DBGrid1 событие OnKeyDown с тем же кодом заменив StringGrid1 на DbGrid1
Работает, вроде без сбоев.
← →
Leonid Troyanovsky © (2008-01-16 12:36) [6]
> Царев Евгений © (15.01.08 10:08) [4]
> TInplaceEdit(StringGrid1).SetFocus;
Эк загнул.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-01-16 12:52) [7]
> ЮЮ © (15.01.08 09:41) [3]
> Например, можно установить у формы KeyPreview в true и
Лучше TAction. А чтоб не к всем эдитам, то проверять
класс контрола с фокусом (только не TForm(Sender) :)
А высший пилотаж - снабдить InplaceEdit своим контекст меню.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-01-16 12:54) [8]
> Германн © (15.01.08 00:37) [2]
> Вот именно. Должно быkо быть Alt-D.
Alt - менюшный префикс.
--
Regards, LVT.
← →
Царев Евгений © (2008-01-16 13:14) [9]
> Leonid Troyanovsky © (16.01.08 12:36) [6]
> > Царев Евгений © (15.01.08 10:08) [4] > TInplaceEdit(StringGrid1).
> SetFocus;Эк загнул.
Это перегнул :)if ( (ssAlt in Shift) and (Key = 71) ) then
//А вот здесь загнул
← →
Царев Евгений © (2008-01-16 13:47) [10]
> А высший пилотаж - снабдить InplaceEdit своим контекст меню.unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Menus, AppEvnts, StdCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
ApplicationEvents1: TApplicationEvents;
StringGrid2: TStringGrid;
Button1: TButton;
procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
procedure N1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure PasteSymbolT;
public
{ Public declarations }
end;
var
Form1: TForm1;
const
VK_Gradus = 176;
VK_G = 71;
implementation
{$R *.dfm}
procedure TForm1.PasteSymbolT;
begin
with TInplaceEdit(StringGrid1) do
begin
SendMessage(Handle,WM_CHAR, Word(VK_Gradus), 0); // ýìóëèðîâàòü ñèìâîë °
end;
end;
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ( (Shift =[ssAlt]) and (Key = VK_G) ) then // Alt + G
begin
PasteSymBolT;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PopupMenu1.Items[0].Caption:= "Äîáàâèòü ñèìâîë °";
StringGrid1.Options:= StringGrid1.Options + [goEditing];
StringGrid1.Options:= StringGrid1.Options + [goEditing];
end;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
TempClass: array[0..49] of Char;
CurPos : TPoint;
begin
With Msg Do Begin
Case message Of
WM_RBUTTONDOWN:
Begin
GetClassName(hwnd,TempClass,50);
if (StrPas(TempClass) = "TInplaceEdit") and (ActiveControl = StringGrid1) then
begin
GetCursorPos(CurPos);
PopupMenu1.Popup(CurPos.X, CurPos.Y);
//Handled:= False;
end;
End; // WM_RBUTTONDOWN
End; // Case
End; //With
end;
procedure TForm1.N1Click(Sender: TObject);
begin
PasteSymbolT;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
end.
:)
← →
Leonid Troyanovsky © (2008-01-16 15:57) [11]
> Царев Евгений © (16.01.08 13:47) [10]
> unit Unit1;
Нет, не совсем то.
Вечером покажу как, если время будет.
> TInplaceEdit(StringGrid1)
Дык, нельзя ж так делать.
--
Regards, LVT.
← →
Царев Евгений © (2008-01-16 16:22) [12]
> Дык, нельзя ж так делать.
Скорее лучше ненадо :)
procedure TForm1.PasteSymbolT(Sender: TObject);
with TInplaceEdit(Sender) do
.....
тогда в OnKeyDown
PasteSymBolT(Sender);
а в N1Click
PasteSymbolT(StringGrid1);
← →
{RASkov} © (2008-01-16 16:29) [13]> [12] Царев Евгений © (16.01.08 16:22)
Сделай вот так:
if Sender is TInplaceEdit then
with TInplaceEdit(Sender) do
и печалься....
> procedure TForm1.PasteSymbolT(Sender: TObject);
Тебе не об этом говорят, а о несовместимости типов...
← →
Царев Евгений © (2008-01-16 16:51) [14]
> {RASkov} © (16.01.08 16:29) [13]
и печалься....
да проверки на Sender нет
И в [10] она нужна?
Где несовместимость типов, при такой ошибке либо не скомпилось, либо вылетало с AV
← →
Царев Евгений © (2008-01-16 17:29) [15]А вообще к [13] притензии принимаю, писать нужно изначално правильно,чтоб потом не думать "Как же так O_o",
и действительно не понял сразу [11].
← →
Leonid Troyanovsky © (2008-01-16 21:55) [16]
> Leonid Troyanovsky © (16.01.08 15:57) [11]
> Вечером покажу как, если время будет.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Menus, StdCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
PopupMenu1: TPopupMenu;
N11: TMenuItem;
Button1: TButton;
procedure N11Click(Sender: TObject);
procedure StringGrid1Enter(Sender: TObject);
private
{ Private declarations }
FInplaceEdit: TInplaceEdit;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
THackGrid = class(TStringGrid);
THackEdit = class(TCustomEdit);
procedure TForm1.N11Click(Sender: TObject);
begin
FInplaceEdit.SelText := "*";
end;
procedure TForm1.StringGrid1Enter(Sender: TObject);
begin
if not Assigned(FInplaceEdit) then
with THackGrid(StringGrid1) do
begin
Options := Options + [goEditing];
ShowEditor;
FInplaceEdit := FindControl(GetFocus) as TInplaceEdit;
THackEdit(FInplaceEdit).PopupMenu := PopupMenu1; // вот наше меню
end;
end;
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.039 c