Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
15-1219145496
keymaster
2008-08-19 15:31
2008.10.12
Как правильнее?


15-1219070182
A1ex
2008-08-18 18:36
2008.10.12
переход по юнитам через ctrl


2-1220279317
Terasbetoni
2008-09-01 18:28
2008.10.12
Подскажите, следует ли использовать структуру MDI


1-1199993925
kilonet
2008-01-10 22:38
2008.10.12
Создание отчёта


2-1220546393
IvanIvan
2008-09-04 20:39
2008.10.12
TListView: переместить Items