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

Вниз

Сообщение TStringGrid что закончили редактировать ячейку, есть?   Найти похожие ветки 

 
Kolan ©   (2007-06-16 09:56) [0]

OnSetEditText неподходит, так как возникает при редактировании постоянно(на каждое нажатие кнопки).
Можно ли как-то получить сообщение(событие) что редактирование закончено?


 
sniknik ©   (2007-06-16 10:13) [1]

вряд ли... попробуй сам придумать (и выразить словами) когда считать что редактирование закончилось. (???) ну например если ничего не нажимали 3 мин, так чтоли? а автор отошел покурить (вот он, еще один неявный вред курения ;о))), вернулся через полчаса и продолжил набивать с половины слова.

в общем давай, предлагай, какая должна быть логика возникновения этого события?


 
Kolan ©   (2007-06-16 13:31) [2]

> и выразить словами

1. Вот я выбрал ячейку и еще не начал редактировать. Ячейка выбрана но не могу редактировать.
2. Жму на нее еще раз текст становится доступным для редактирования.
3. Редактирую сколько влезит.
4. Нажимаю Enter/перехожу на другую ячейку(те в текст снова стал НЕ доступен для редактирования). И вот тут мне и нужно об этом узнать&#133


 
{RASkov} ©   (2007-06-16 13:54) [3]

> [2] Kolan ©   (16.06.07 13:31)

В таких случаях, когда не совсем понятен какой обработчик мне нужен, я поступаю так:
Создаю "подозреваемые" обработчики типа так

procedure TForm.StringGridSetEditText();
begin
 ShowMessage("StringGridSetEditText");
end;

И вылавливаю потом нужные
:)


 
Kolan ©   (2007-06-16 14:00) [4]

> SetEditText

Не годится он. И имхо нужного вообще нет, я спрашиваю как можно достич нужного.

Смысл необходимости вот в чем:
Есть строка. S1 — это модель.
Её отображаю в ячейке StringGrid — это view.

Если ячейку изменяют, то изменяется и строка S1.
И когда изменяется S1, то она говорит я изменилась — рисуйте меня и её рисуют в ячейки грида.

Так вот если использовать SetEditText такая синхронизация происходит постоянно, на каждом нажатии клавиши.


 
Kolan ©   (2007-06-16 14:03) [5]

> {RASkov} ©  

ЗЫ 0 версия готова почти показать? Куда слать?


 
{RASkov} ©   (2007-06-16 14:06) [6]

> [5] Kolan ©   (16.06.07 14:03)


 
Kolan ©   (2007-06-16 14:14) [7]

> [6] {RASkov} ©   (16.06.07 14:06)
> > [5] Kolan ©   (16.06.07 14:03)

Ок, шас вот эту проблему победу, а то редактировать противно.


 
Kolan ©   (2007-06-16 14:35) [8]

> {RASkov}

Отослал&#133


 
Loginov Dmitry ©   (2007-06-16 14:46) [9]

Подставляй TEdit. Об окончании редактирования будет сигнализировать его событие OnExit;


 
Kolan ©   (2007-06-16 14:47) [10]

> Подставляй TEdit.

Хех еще посоветуй сделать сетку из N эдитов :)&#133 Есть же возможность редактировать прям ячейку&#133


 
Loginov Dmitry ©   (2007-06-16 14:54) [11]

> Есть же возможность редактировать прям ячейку


Ну она редактируется с помощью InplaceEditor"a - тот же TEdit, только гибкости - 0. А если хочется чего-то путного, то приемлемый выход - подстановка контролов.


 
Kolan ©   (2007-06-16 15:00) [12]

> InplaceEditor"a — тот же TEdit

Да, незнал&#133

Тогда подробнее можно.
Когда показывать Edit и как вычислить его кординаты?


 
sniknik ©   (2007-06-16 15:14) [13]

> Нажимаю Enter/перехожу на другую ячейку
так тебе получается нужно событие выхода из ячейки?, а вовсе не завершение редактирования.

такого тоже вроде нет, но можно сделать..., возможно, посмотреть как тот самый InplaceEditor работает, и использовать его события, уничтожения (если он на каждое редактирование создается/уничтожается), либо другое если там както по другому организовано.
подставлять свой эдит тоже можно, но не так интересно...


 
Loginov Dmitry ©   (2007-06-16 15:19) [14]

Пример с использованием TEdit:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   StringGrid1: TStringGrid;
   procedure StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
     var Value: String);
   procedure Edit1Exit(Sender: TObject);
   procedure Edit1KeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol,
 ARow: Integer; var Value: String);
var
 ARect: TRect;
begin
 ARect := StringGrid1.CellRect(ACol, ARow);
 ARect.TopLeft := ScreenToClient(StringGrid1.ClientToScreen(ARect.TopLeft));
 ARect.BottomRight := ScreenToClient(StringGrid1.ClientToScreen(ARect.BottomRight));

 Edit1.BoundsRect := ARect;
 Edit1.Text := StringGrid1.Cells[ACol, ARow];
 Edit1.Visible := True;
 Edit1.BringToFront;
 Edit1.SetFocus;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
 StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := Edit1.Text;
 Edit1.Visible := False;
 StringGrid1.SetFocus;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key = VK_RETURN then
 begin
   Edit1.OnExit(nil);
   Key := 0;
 end;
end;

end.


 
Kolan ©   (2007-06-16 15:25) [15]

> а вовсе не завершение редактирования

Ну как я закончил редактировать, но остался в той же ячейке.


> посмотреть как тот самый InplaceEditor

А хде его смотреть?

> Пример с использованием TEdit:

Щас поглядим&#133 :)


 
sniknik ©   (2007-06-16 15:30) [16]

> Ну как я закончил редактировать, но остался в той же ячейке.
значит не закончил раз остался, тк и через полчаса случайно нажатая кнопка это продолжение редактирования...
либо приводи логику для "остался", т.к. то что в [2] это выход.  

> А хде его смотреть?
дельфи поставляется с исходниками VCL.


 
Kolan ©   (2007-06-16 15:34) [17]

> значит не закончил раз остался, тк и через полчаса случайно
> нажатая кнопка это продолжение редактирования&#133

Нет. У вас СтрингГрид не перед глазами просто. Когда жму Enter, то из редактирования выхожу, но ячейка ТАЖЕ САМАЯ отсается. Мне по логике нужно именно ОКОНЧАНИЕ РЕДАКТИРОВАНИЯ, а не смена ячейки.


> дельфи поставляется с исходниками VCL.

И впрям&#133 :)


 
sniknik ©   (2007-06-16 16:25) [18]

> Когда жму Enter, то из редактирования выхожу
вызывается TInplaceEdit.Hide;, ты выходишь из ячейки редактирования, фокус передается гриду.

т.е. можно просто определить (если делать свой компонент на замену) свойство типа onEndEdit (которому будет присваиваться процедура события), и в нем его вызывать (как обычно у компонент и сделано).


 
Kolan ©   (2007-06-16 16:32) [19]

> sniknik ©

Шас буду делать :)


 
Kolan ©   (2007-06-16 17:08) [20]

> и в нем его вызывать

Посмотрел метод Hide, и HideEdit — они не виртуальные.


> и в нем его вызывать

Вот это я не поял что вызывать в нем?


 
sniknik ©   (2007-06-16 17:09) [21]

в обшем получается так (без оформления в компонент, и без "красоты" с оформлением собственно события onEndEdit), т.е. только смысл, но уже рабочий...

type
 TMyInpEdit = class(TInplaceEdit)
 protected
   procedure WndProc(var Message: TMessage); override;
 end;

 TMyStrGrid = class(TStringGrid)
 protected
   function CreateEditor: TInplaceEdit; override;
 end;

 TStringGrid = class(TMyStrGrid); //это чтобы использовать "стандартный" но уже с нашими включениями

 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   ...
 end;

implementation

procedure TMyInpEdit.WndProc(var Message: TMessage);
begin
 if Message.Msg = WM_KILLFOCUS then
     Form1.Memo1.Lines.Add(IntToStr(Message.Msg)); //это вместо if assigned(Grid.onEndEdit) then Grid.onEndEdit(Grid); просто показать наше событие
 inherited WndProc(Message);
end;

function TMyStrGrid.CreateEditor: TInplaceEdit;
begin
 Result:= TMyInpEdit.Create(Self);
end;


все в общем то.


 
sniknik ©   (2007-06-16 17:11) [22]

> Посмотрел метод Hide, и HideEdit — они не виртуальные.
ну так это если переписывать (просто скопировать модуль грида к себе в проект, прям там и писать)

но зато там видно что вызывается смена фокуса... см. up. для другого варианта.


 
{RASkov} ©   (2007-06-16 17:11) [23]

procedure TForm1.DoCellAfterEdit(const S: String);
begin
 ShowMessage(S);
end;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if StringGrid1.EditorMode then
 case Key of
  VK_RETURN, VK_UP, VK_DOWN:
  DoCellAfterEdit(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]);
 end;
end;


Это если по ентеру или "стрелками".... а если мышкой, то нужно еще подумать.... :)


> [8] Kolan ©   (16.06.07 14:35)

Спасибо.... попозже гляну.... сейчас некогда (.... убегаю.


 
{RASkov} ©   (2007-06-16 17:13) [24]

Впрочем у меня тоже была мысль типа как в [21] но некогда с ней сейчас... :)
Так что лучше глянь в сторону [21], а не [23] :)


 
Kolan ©   (2007-06-16 17:14) [25]

Все, понятно пойду сделаю. Я пожалуй сделаю компонент&#133


 
Kolan ©   (2007-06-16 17:29) [26]

> [21] sniknik ©   (16.06.07 17:09)


> это вместо if assigned(Grid.onEndEdit) then Grid.onEndEdit(Grid)
> ;

Вот тут еще бы ACol и ARow в onEndEdit передать, откуда их взять?


 
sniknik ©   (2007-06-16 17:38) [27]

из грида вестимо... у тебя же есть доступ к Grid.


 
Kolan ©   (2007-06-16 17:40) [28]

Хех — работает, благодарю sniknik.


 
sniknik ©   (2007-06-16 17:48) [29]

кстати значения лучше запоминать заранее, на WM_SETFOCUS например, т.к. на момент WM_KILLFOCUS оно уже изменено на ту ячейку на которую переход (если конечно выход не ентером), проверил только что.


 
Kolan ©   (2007-06-16 17:49) [30]

Ошибочка закралась :(

Так я сделал:
procedure TExtInplaceEdit.WndProc(var Message: TMessage);
var
 TheGrid: TExtStringGrid;
begin
if Message.Msg = WM_KILLFOCUS then
begin
  TheGrid := Grid as TExtStringGrid;
  if Assigned(TheGrid.OnEndEdit) then
    TheGrid.OnEndEdit(Grid, TheGrid.Col, TheGrid.Row, Text);
end;
inherited;
end;


Если выбрана ячейка 1, я редактирую, икликаю на ячейке 2, то событие возникае два раза.
С Row = 1 b Row = 2

PS
Колонок я сделал 1&#133


 
Kolan ©   (2007-06-16 17:49) [31]

> кстати значения лучше

Решение опередило вопрос :)


 
Kolan ©   (2007-06-16 17:52) [32]

> кстати значения лучше запоминать заранее, на WM_SETFOCUS
> например

Только логику не понял. Сначала if Message.Msg = WM_SETFOCUS  then сохроняю, так?
Разве там не будет старое значение(не редактированое)?


 
sniknik ©   (2007-06-16 17:56) [33]

> TheGrid := Grid as TExtStringGrid;
>   if Assigned(TheGrid.OnEndEdit) then
>     TheGrid.OnEndEdit(Grid, TheGrid.Col, TheGrid.Row, Text);


зачем лишняя переменная?

 with TExtStringGrid(Grid) do
   if Assigned(OnEndEdit) then
     OnEndEdit(Grid, Col, Row, Text);


 
sniknik ©   (2007-06-16 17:58) [34]

> Разве там не будет старое значение(не редактированое)?
а координаты ячейки меняются в процессе редактирования?


 
Kolan ©   (2007-06-16 21:00) [35]

> а координаты ячейки меняются в процессе редактирования?

Нет ессно.


 
Kolan ©   (2007-06-16 21:20) [36]


> Разве там не будет старое значение(не редактированое)?

То есть вопрос — А когда оно возникает?
ЗЫ
 В справке сказано, что оно возникает при получении фокуса ввода&#133



Страницы: 1 вся ветка

Текущий архив: 2007.07.08;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.023 c
11-1163962193
Vladimir Kladov
2006-11-19 21:49
2007.07.08
Версия 2.43


15-1181198320
sia
2007-06-07 10:38
2007.07.08
Call-Centre (контакт-центр ) - программирование


15-1181056226
@!!ex_
2007-06-05 19:10
2007.07.08
Реально ли вернуть?


1-1178384004
vofk
2007-05-05 20:53
2007.07.08
Использование Unicode


1-1178302846
starxxx
2007-05-04 22:20
2007.07.08
Сравнение строки с маской с использованием * и ?