Пример показывает как добавить содержимое каждой ячейки в TMemo

Пример показывает как добавить содержимое каждой ячейки в TMemo:

procedure TForm1.Button1Click(Sender: TObject); var i, j: integer; ovTable: OleVariant; begin // Я использовал первую таблицу на странице в качестве примера ovTable := WebBrowser1.OleObject.Document.all.tags(‘TABLE’).item(0); for i := 0 to (ovTable.Rows.Length — 1) do begin for j := 0 to (ovTable.Rows.Item(i).Cells.Length — 1) do begin Memo1.Lines.Add(ovTable.Rows.Item(i).Cells.Item(j).InnerText; end; end; end;

Вопрос: Paste работает отлично, но Cut и Copy отказываются работать.

В чём проблема?

Ответ: Вам нужно добавить следующие строки в начало unit:

initialization OleInitialize(nil); finalization OleUninitialize;

Вопрос: Кобинации клавиш Ctrl-C, Ctrl-O, и т.д. не срабатывают. В чём проблема?

Ответ: Это не ошибка. Информацию по данному вопросу можно найти на сайте Microsoft KnowledgeBase статья Q168777. Приведённый ниже код, устраняет данную проблему:

… var Form1: TForm1; FOleInPlaceActiveObject: IOleInPlaceActiveObject; SaveMessageHandler: TMessageEvent; … implementation … procedure TForm1.FormActivate(Sender: TObject); begin SaveMessageHandler := Application.OnMessage; Application.OnMessage := MyMessageHandler; end; procedure TForm1.FormDeactivate(Sender: TObject); begin Application.OnMessage := SaveMessageHandler; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Application.OnMessage := SaveMessageHandler; FOleInPlaceActiveObject := nil; end; procedure TForm1.MyMessageHandler(var Msg: TMsg; var Handled: Boolean); var iOIPAO: IOleInPlaceActiveObject; Dispatch: IDispatch; begin { exit if we don’t get back a webbrowser object } if WebBrowser = nil then begin Handled := False; Exit; end; Handled:=(IsDialogMessage(WebBrowser.Handle, Msg) = True); if (Handled) and (not WebBrowser.Busy) then begin if FOleInPlaceActiveObject = nil then begin Dispatch := WebBrowser.Application; if Dispatch nil then begin Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO); if iOIPAO nil then FOleInPlaceActiveObject := iOIPAO; end; end; if FOleInPlaceActiveObject nil then if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)) then //nothing — do not pass on Backspace, Left or Right arrows else FOleInPlaceActiveObject.TranslateAccelerator(Msg); end; end;

Понравилась статья? Поделиться с друзьями: