Поиск по блогу

понедельник, 8 июля 2013 г.

Как отобразить данные SQLite в DBGrid

TSQLMonitor поддерживает SQLite, начиная с версии RAD Studio XE3 (использовать его, естественно, вместе с TSQLConnection). У меня Delphi старенькие, поэтому покажу, как старыми дедовскими методами отобразить выборку данных в DBGrid (с помощью обертки DISQLite, о которой я писала тут).

Пример работает как в Delphi 7, так и в Delphi 2010. В других версиях просто не пробовала.

Следуя шаг за шагом инструкции, приведенной ниже, вы добьетесь желаемого результата — отобразите данные из запроса к БД SQLite в стандартной таблице DBGrid.

1. Разместите на форме:
- DBGrid
- ClientDataSet
- DataSetProvider
- DataSource
Если используете визуальные компоненты, то: DISQLite3Database и DISQLite3UniDirQuery. Если визуальными компонентами от DISQLite не пользуетесь, то экземпляры этих классов создадите динамически.

2. У DISQLite3UniDirQuery в поле Database := DISQLite3Database. И заполните SelectSQL.

3. У DataSetProvider: DataSet := DISQLite3UniDirQuery.

4. У ClientDataSet: ProviderName := DataSetProvider.

5. У DataSource: DataSet := ClientDataSet.

6. У DBGrid: DataSource := DataSource. Соответственно, заполните Columns, которые бы хотели видеть отображенными в таблице.

Вот и все.

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

четверг, 21 февраля 2013 г.

TChromium: заполнение и сабмит формы

Опишу самый простой способ заполнения и отправки формы с использованием компонента TChromium. С доступом к DOM-элементам по id в нем дела обстоят не так хорошо, как в Webbrowser-е, но зато очень просто исполнять любые java-скрипты.

JavaScript может пригодится не только для заполнения форм, он вообще достаточно широко используется.

Исполнение скрипта осуществляется с помощью ExecuteJavaScript. При этом обязательно проверять, чтобы Chromium.Browser и Chromium.Browser.Mainframe были отличны от nil.

Вот как будет выглядеть заполнение и сабмит формы логина на сайте vk.com.

procedure TfrmMain.btnLoginClick(Sender: TObject);
var
  CodeStr : string;
begin
  if Assigned(Chromium.Browser) and Assigned(Chromium.Browser.Mainframe) then
    begin
      CodeStr := 'document.forms[0].quick_email.value="UserEmail";';
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
      CodeStr := 'document.forms[0].quick_pass.value="UserPass";';
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
      CodeStr := 'document.forms[0].submit();';
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
    end;
end;

На практике столкнулась с необъяснимой ситуацией: если этот код попробовать запустить в Delphi 7, то Chromium.Browser.Mainframe почему-то будет равен nil (а если проверку убрать, то вываливается ошибка доступа). На каком-то форуме нашла, что это общая проблема для Семерки. В 2010 все работает отлично.

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

суббота, 9 февраля 2013 г.

Как удалить кукисы (cookies) в TChromium

В комментариях к статье о начале работы с TChromium спросили, как удалить в нем кукисы? Скажу сразу, решение не мое, нашла в свое время на СтэкОверфлоу, скопировала и с тех пор удачно использую.

Сначала надо отметить, что у интерфейса ICefCookieManager есть метод DeleteCookies, но он почему-то не работает. То есть в результате выполнения кода:

procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  if not CookieManager.DeleteCookies('', '') then
    ShowMessage('Кукисы не удалены!');
end;

заведомо появится сообщение, что удаление кукисов провалилось. Не знаю, может, это только у меня так...

Решение же таково: надо обойти все хранящиеся кукисы с помощью VisitAllCookiesProc и внутри visitor-а установить их свойство deleteCookie равным True (1).

procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  CookieManager.VisitAllCookiesProc(
    function(const name, value, domain, path: ustring; secure, httponly,
      hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
      count, total: Integer; out deleteCookie: Boolean): Boolean
    begin
      deleteCookie := True;
      ShowMessage('Кукисы для домена ' + domain + ' удалены!');
    end
  );
end;


Поделиться