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

понедельник, 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;


суббота, 26 января 2013 г.

SQLite и Delphi 7: работа с БД с помощью DISQLite

Для тех, кто случайно наткнулся на эту статью. Я хочу провести эксперимент с продвижением в социальной сети VK.com, используя автоматизацию. Для этого я пишу (пусть и очень медленно, в свободное время) свое приложение и частично освещаю ход работ на этом блоге.

В предыдущей серии я рассказала про компонент для браузера, который буду использовать. Настало время определиться с данными.

Сначала хотела вообще обойтись без БД, а заодним и описать работу с XML, но, подумав, решила, что без базы будет сложно (и неудобно, если пользователей заведется много). Особенно, если разрабатывать с перспективами. Поэтому сегодня речь пойдет о SQLite.

Чем руководствовалась при выборе БД?
  • Максимальная простота и легкость.
  • Минимум телодвижений для работы приложения на другой машине: надо просто скопировать все содержимое папки к себе (кроме файлов БД нужна только dll).

понедельник, 14 января 2013 г.

Компонент TChromium: начало работы, установка

Сегодня речь пойдет о компоненте TChromium (dcef3). Что это за компонент и в чем его преимущества перед стандартным TWebbrowser?

Я могу назвать 2 главных преимущества, например, в привязке к разработке утилиты для Вконтакта. Во-первых, он пошустрее будет. Во-вторых, в нем очень удобная и простая работа с cookies.

Поясню второй пункт. Например, нам надо, чтобы через одну форму можно было работать с несколькими аккаунтами vk.com без постоянного "перелогинивания". В Webbrowser-е это можно организовать только шаманскими методами, а вот в Chromium-e решение выглядит очень красиво и просто.

Установка DCEF3 в Delphi7 (компонент TChromium)

На Googlecode можно найти 2 версии: старую (http://code.google.com/p/delphichromiumembedded/) и поновее (http://code.google.com/p/dcef3/). Рекомендую вторую.
  1. Скачиваем свежий дистрибутив с помощью SVN в папку c:\Program Files\Borland\Delphi7\Lib\dcef3.
  2. Загружаем Delphi, выбираем через "Open" пакет для D7, компилируем и инсталлируем. Если все хорошо, покажут TChromium в списке доступных компонентов на отдельной новой вкладке.
  3. Закрываем пакет, не сохраняя изменения в проекте.
  4. Проверяем Chromium в работе.

Тестирование работы компонента

Для теста создадим на форме 2 браузера, которые будут работать с независимыми друг от друга кукисами. С компонентом TWebbrowser такого так просто не добиться.

Размещаем на форме компонент TChromium и 2 кнопки.

В папку с проектом (или туда, куда компиллируется программа) копируем dll-ки из c:\Program Files\Borland\Delphi7\Lib\dcef3\bin\Win32\.

В uses дописываем библиотеку ceflib.

В обработчиках нажатия кнопок пишем:

const
  DefaultCookiesDir = 'Cookies/';
...
procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
  CookiesPath  : String;
begin
  CookiesPath := ExtractFilePath(Application.ExeName) + DefaultCookiesDir + 'User1';
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.SetStoragePath(CookiesPath);
  Chromium1.Load('vk.com');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
  CookiesPath  : String;
begin
  CookiesPath := ExtractFilePath(Application.ExeName) + DefaultCookiesDir + 'User2';
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.SetStoragePath(CookiesPath);
  Chromium1.Load('vk.com');
end;

Не ждите, что это уже получилось супер-приложение :) Я просто привожу пример, как для TChromium можно с легкостью переключать папки, в которых браузер хранит кукисы.

Нажимаем на первую кнопку, логинимся:
Нажимаем на вторую кнопку. Второй раз браузер будет использовать совсем другие кукисы, поэтому загружается главная страница.
При этом автоматически создаются подкаталоги в папке Cookies.


Если после этого снова нажать на первую кнопку, то загрузится страница пользователя, под которым логинились вначале.

Тут видно еще один плюс для приложения, работающего с множеством юзеров. Кукисы сохраняются, поэтому в течение их срока жизни каждый раз логиниться не надо — достаточно просто проверять, что залогинены.

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

Тенденции применения парсинга и автоматизации в вебмастеринге и SEO

Думаю, все уже отошли от праздников и вовсю трудятся на свое собственное материальное благо. Вот и мне удается немного посидеть за компьютером.

Изучила некоторые тенденции, чего же интересно народу в интернете. В ряде следующих статей хочу приводить примеры программирования именно в тех областях, которые могут представлять интерес.

Vk.com

Началось с того, что посмотрела небольшое видео по продвижению пабликов в Vkontakte. Оказывается, уже немало софта написано для автоматизации постинга, парсинга чужих пабликов, проставления лайков и т.д..
Отступление: если есть хороший софт с нужными функциями и поддержкой, то я предпочитаю заплатить. Так гораздо проще, чем самой писать с нуля. Именно поэтому я уже давно не занимаюсь парсингом выдачи, а использую KeyCollector. Для работы с социальной сетью vkontakte.ru многие используют Viking Botovod (я не тестировала, рекомендовать не могу, но видела промо-ролик).

Наполнение сайтов

Как ни странно, но доргены до сих пор пользуются некоторой популярностью в узких кругах. Используются также и обычные парсеры: берется статья, проставляется ссылка на источник, и такая комбинация порой даже может стоять в выдаче выше оригинала.

Я сама против подобного наполнения сайтов. К тому же есть множество альтернатив использования автоматизации при их создании. Ведь если подумать хорошенько, можно найти варианты гораздо лучше, чем тырить чужие статьи. Тем более, что в этом случае и совесть спокойна, и конфликты с недовольными владельцами ресурсов исключены.

Мои эксперименты и их освещение на этом блоге

Всем вебмастерам, кто только начинает заниматься своими проектами, хочется найти заветную кнопку "Бабло". Кнопки такой не существует, но есть масса способов, которые могут сработать и принести хоть какую-никакую, но прибыль.

Скажу честно, я читала о всяких вариантах, но никогда их не пробовала реализовывать — всегда находились дела поважнее и, как большинство фрилансеров, испытывала нехватку свободного времени. Но сейчас решила немного себя перебороть и сделать что-нибудь "новенькое" для себя. Конечно же, нехватка времени в настоящий момент тоже остро стоит, но что делать...

Эксперимент №1

Программка для работы с Vkontakt-ом. С функционалом пока точно не определилась, решу по ходу. Пока приблизительно буду ориентироваться на тот же Viking. Конечно, будет не точь-в-точь.

Как настоящий динозавр, буду писать ее на своем любимом Delphi7.

Эксперимент №2

В рамках эксперимента №2 хочу создать какой-нибудь сайт из разряда "сделал и забыл" или хотя бы "сделал и подзабыл".

Как можно заработать на таком сайте?
  • Контекст. Ну, это мне знакомо, с этим я работаю.
  • Сапа. Никогда не пробовала использовать, почему-то жалко 2 своих основных сайтика :) — можно попробовать.
  • Партнерские программы.
Выбор тематики
Сайт будет заточен под региональные запросы. Тематика — недвижимость. Статьи и новости — закажу рерайт. База по риэлторам, база по предложениям (с досок объявлений). За счет большого числа объявлений можно добиться большого количества страниц в выдаче. Только объявления надо будет чем-нибудь дополнить, что ли. Каждое предложение можно также сопроводить отметкой на Яндекс.Карте.

Особенности
Буду делать не на привычных CMS, а напишу свои скриптики — читала о наблюдениях, что самописные сайты лучше воспринимаются поисковиками, чем на Wordpress/Joomla!.

Работу над этими проектами буду вести неспешно (опять же, из-за невозможности долго сидеть за компьютером). Статьи будут чередоваться как попало :) Но, думаю, будет интересно. По крайней мере — мне. Если есть желание следить за ходом дел, приглашаю подписаться на RSS. :)

Поделиться