Вопрос по TStringGrid
От: Vsim  
Дата: 22.02.03 15:52
Оценка:
Каким образом можно в текущей ячейке выделить необходимое число символов с произвольной позиции, как это можно делать например в TEdit. Очень нужно. Может использовать SendMessage только непонятно с какими параметрами?
Re: Ответ по TStringGrid
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 22.02.03 17:00
Оценка:
Здравствуйте, Vsim, Вы писали:

V>Каким образом можно в текущей ячейке выделить необходимое число символов с произвольной позиции, как это можно делать например в TEdit. Очень нужно. Может использовать SendMessage только непонятно с какими параметрами?


Предлагаю отнаследовать от TStringGrid свой класс; все решение будет выглядеть примерно так:

type
TMyStringGrid=class(TStringGrid)
public
property InplaceEditor; //Меняем область видимости с protected на Public
end;

TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
public
SG:TMyStringGrid;
end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ActiveControl:=SG;
SG.ShowEditor; //Привяжем редактор ячейки к текущей ячейке
SG.InplaceEditor.SelStart:=1;
SG.InplaceEditor.SelLength:=2; //и выбрались, например, два средних 'a' из 'aaaa' для ячейки (1,1)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SG:=TMyStringGrid.Create(self);
SG.parent:=self;
SG.Options:=SG.Options+[goEditing];
SG.Align:=alClient;
SG.SendToBack; //У меня кнопка уже лежит на форме, так что ее надо поверх сетки вытащить
SG.Cells[1,1]:='aaaa';
end;
Специалист — это варвар, невежество которого не всесторонне :)
Re[2]: Ответ по TStringGrid
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 23.02.03 10:31
Оценка: 3 (1)
А можно и менее болезненно, без наследования.
Правда, здесь возможны накладки (если кто-то со стороны добавит еще один дочерний TInplaceEdit к StringGrid'у). Но в рамках обычной VCL таких желающих, вроде бы, нет.

  ActiveControl:=SG;
  SG.EditorMode:=true; //Показываем редактор
  for i:=0 to SG.ControlCount-1 do //Для всех дочерних Control'ов
    if SG.Controls[i] is TInplaceEdit   //Если это TInplaceEdit или его потомок
      then SG.Controls[i].Perform(EM_SETSEL,1,3); //Выбираем символы с 1 (включительно) по 3 (не включая)
  //Нумерация символов - с 0
Специалист — это варвар, невежество которого не всесторонне :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.