Как и обещала, о некоторых моментах.
1. Зная, что придется работать с однотипными структурами, объявляем класс:
TRSSAgregator = class
url,
field_url,
field_rss_url,
field_rss_name,
field_dsc,
field_keys,
field_email,
key_delimiter : string;
end;
Про значения полей я упоминала в прошлом посте. При загрузке программы считываем данные из ini-файла. В ini-файле данные разбиты на секции, каждая секция соответствует одному ресурсу. Вот процедура чтения секций с однотипными данными:
procedure TfrmMain.actINILoadExecute(Sender: TObject);
var
IniFile : TIniFile;
Sections : TStringList;
SecParams: TStringList;
RSSAgr : TRSSAgregator;
i : integer;
sVal : string;
begin
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'/'+IniFileName);
try
Sections := TStringList.Create();
try
// читаем имена всех секций
IniFile.ReadSections(Sections);
// перебираем имена всех секций, и для секций с именами
// вида SITEnn создаем объекты
SecParams := TStringList.Create();
try
for i:=1 to Sections.Count do
begin
sVal := Sections[i-1];
if (Pos('SITE', sVal) = 1) and
(StrToIntDef(Copy(sVal, 5, Length(sVal)-4), -1)>0) then
begin
// читаем параметры секции
IniFile.ReadSectionValues(sVal, SecParams);
if SecParams.Count > 0 then
begin
RSSAgr := TRSSAgregator.Create;
RSSAgr.url := SecParams.Values['url'];
RSSAgr.field_url := SecParams.Values['field_url'];
RSSAgr.field_rss_url := SecParams.Values['field_rss_url'];
RSSAgr.field_rss_name := SecParams.Values['field_rss_name'];
RSSAgr.field_dsc := SecParams.Values['field_dsc'];
RSSAgr.field_keys := SecParams.Values['field_keys'];
RSSAgr.field_email := SecParams.Values['field_email'];
RSSAgr.key_delimiter := SecParams.Values['key_delimiter'];
RSSAgregators.Add(RSSAgr);
end
end;
end;
finally
SecParams.Free();
end;
finally
Sections.Free();
end;
finally
IniFile.Free();
end;
end;
RSSAgregators — TList, в котором хранятся указатели на объекты типа TRSSAgregator. Он создается при создании формы, при закрытии формы - очищаем память.
После загрузки данных из ini-файла помещаем их в Grid.
2. Вот, в принципе, и все. Осталось только обработать двойной клик по ячейке грида. На него мы повесим экшн:
procedure TfrmMain.actGoToSiteExecute(Sender: TObject);
var
i : integer;
url : string;
tmpURL : TRSSAgregator;
strKeys : string;
begin
url := vRSS.DataController.Values[vRSS.DataController.FocusedRecordIndex,vRSSUrl.Index];
for i := 0 to RSSAgregators.Count-1 do
begin
if TRSSAgregator(RSSAgregators[i]).url = url then
tmpURL := RSSAgregators[i];
end;
PageLoaded := false;
WebBrowser.Navigate(tmpURL.url);
while PageLoaded = false do
Application.ProcessMessages;
try
// заполнение полей
if tmpURL.field_url <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_url).Value := edtURL.Text;
if tmpURL.field_rss_url <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_rss_url).Value := edtRSSURL.Text;
if tmpURL.field_rss_name <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_rss_name).Value := edtTitle.Text;
if tmpURL.field_dsc <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_dsc).Value := edtDSC.Text;
if tmpURL.field_email <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_email).Value := edtEmail.Text;
// ключевики
strKeys := edtKeys.Text;
if (tmpURL.key_delimiter <> '') and (edtKeys.Text <> '') then
begin
strKeys := StringReplace(edtKeys.Text,',',tmpURL.key_delimiter,[rfReplaceAll]);
WebBrowser.OleObject.document.getElementById(tmpURL.field_keys).Value := strKeys;
end;
except
end;
end;
PageLoaded становится true по событию OnDocumentComplete объекта TWebBrowser.
Вот сейчас точно все. :)
____
Update: новая версия RSSAdder-а.
____
Итак, краткий курс автоматизации работы с формами пройден и даже приведен пример создания полезной утилиты. В следующих постах планирую все-таки начать рассказ о том, что ближе к теме блога, — непосредственно о создании парсера. В уме я уже прикинула, создание каких типов парсеров я буду приводить в пример. Но если вы хотите, чтобы я разобрала парсинг информации на вашем примере — пишите, рассмотрю все пожелания (это могут быть интернет-магазин, новостной ресурс, форум и т.д.).
Был бы очень благодарен за 1 но очень подробный пост о том как можно на лету определить кодировку страницы и конвертировать текст в удобоваримый вид для Delphi 2009.
ОтветитьУдалитьЕсть вариант читать мета-тег и исходя из этого делать какие-то шаги, но может есть другой, более красивый вариант?