Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1219305496
Int23
2008-08-21 11:58
2008.10.12
Программа для конвертации html в word


1-1199909700
maxistent
2008-01-09 23:15
2008.10.12
Потоки и процедуры...


15-1219391037
brother
2008-08-22 11:43
2008.10.12
ручное обновление AviraAntivir


2-1218980426
demon
2008-08-17 17:40
2008.10.12
Помогите разобраться с простейшей программой на API


15-1219088046
Тимохов
2008-08-18 23:34
2008.10.12
Helpdesk и работа с пользователями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский