|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вставка текста в StringGrid
Помогите, пожалуйста, кто может!
Каким образом можно вставлять данные в StringGrid, заранее скопировав ячейки из экселя, методом Ctrl+C - Ctrl+V? |
#2
|
|||
|
|||
Если вы, скопировав диапазон в Excel, посмотрите содержимое буфера обмена, то увидите, что в буфере данные представлены как текст, в котором содержимое ячеек разделено табуляциями. Можно плясать от этого...
Вот вариант процедуры, с помощью которой можно вставить из буфера данные, скопированные из Excel. Вставка в StringGrid производится начиная от той ячейки, в которой сейчас установлен курсор. Код:
procedure TForm1.DoClipbrdPaste; var ClipbrdData: TStringList; ClipbrdRow: TStringList; i, j, RowCnt: Integer; begin if not Clipboard.HasFormat(CF_TEXT) then Exit; ClipbrdData := TStringList.Create; ClipbrdRow := TStringList.Create; try ClipbrdData.Text := Clipboard.AsText; RowCnt := ClipbrdData.Count; // если не вмещается, увеличиваем число строк в StringGrid if StringGrid1.RowCount - StringGrid1.Row < RowCnt then StringGrid1.RowCount := RowCnt + StringGrid1.Row; for i := 0 to RowCnt - 1 do begin ClipbrdData.Strings[i] := '"' + ClipbrdData.Strings[i] + '"'; ClipbrdData.Strings[i] := StringReplace(ClipbrdData.Strings[i], #9, '"'#9'"', [rfReplaceAll]); end; ClipbrdRow.Delimiter := #9; ClipbrdRow.DelimitedText := ClipbrdData.Strings[0]; // проверяем число столбцов в StringGrid. Если что, добавляем if StringGrid1.ColCount - StringGrid1.Col < ClipbrdRow.Count then StringGrid1.ColCount := ClipbrdRow.Count + StringGrid1.Col; for i := 0 to RowCnt - 1 do begin ClipbrdRow.DelimitedText := ClipbrdData.Strings[i]; for j := 0 to ClipbrdRow.Count - 1 do StringGrid1.Cells[j + StringGrid1.Col, i + StringGrid1.Row] := ClipbrdRow.Strings[j]; end; finally ClipbrdData.Free; ClipbrdRow.Free; end; end; // вставка в StringGrid по нажатию в нём Ctrl+V procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = 86) and (ssCtrl in Shift) then DoClipbrdPaste(); end; P.S. Если будете использовать, не забудьте подключить модуль Clipbrd в uses. |
#3
|
|||
|
|||
Спасибо большое, работает отлично!
Только строку Код:
if (Key = 86) and (ssCtrl in Shift) then DoClipbrdPaste(); лучше доделать следующим образом Код:
if ((Key = 86) or (Key = 112)) and (ssCtrl in Shift) then DoClipbrdPaste(); Чтобы реакция была как на маленькую букву, так и на большую. Последний раз редактировалось AIMor, 18.05.2009 в 07:06. |