Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];

Вниз

Сообщение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.041 c
9-1156415887
B-on
2006-08-24 14:38
2007.07.08
текстуры


3-1176199544
Micke_2007
2007-04-10 14:05
2007.07.08
linked server


2-1181880453
Max_
2007-06-15 08:07
2007.07.08
MySQL


15-1181412506
Prefd
2007-06-09 22:08
2007.07.08
Вопрос по Word у


15-1180475224
No_Dead
2007-05-30 01:47
2007.07.08
Криптосистемы теряют стойкость





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский