1

Тема: Object в String (Delphi)

Добрий вечір. Є робоча програмка, але не виходить зробити вивід результату.
Програмка підключається до списку користувачів нашого форуму і проводить пошук по заданому Edit1.

Питання лише одне, як вивести результат пошуку, наскільки я зрозумів він типу Object. Як можна перетворити його для виводу в Memo?

Ось код програми:

Прихований текст
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, Gauges;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    WebBrowser1: TWebBrowser;
    Edit2: TEdit;
    Button2: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://replace.org.ua/users/'); 
end;

procedure TForm1.Button1Click(Sender: TObject);
var A:Variant;
    C:Variant;
begin 
  A := WebBrowser1.OleObject.Document.getElementById('username');
  A.Value := Edit1.Text;

  C := WebBrowser1.OleObject.Document.getElementById('search');
  C.Click;
end;

procedure TForm1.Button2Click(Sender: TObject);
var B:Variant;
begin
   B := WebBrowser1.OleObject.Document.getElementById('tc1');
   //Edit2.Text := AnsiString ( pointer ( B.Value ));
   Memo1.Lines.Add(string(B.Value));
end;

end.

2

Re: Object в String (Delphi)

Про гармату і горобців чули?
Просто запитати http://replace.org.ua/userlist.php?username=Oleg за допомогою idHTTP значно легше, як на мене.
І що, VarToStr не працює?

Подякували: DOP1

3 Востаннє редагувалося Logans (24.11.2013 17:51:22)

Re: Object в String (Delphi)

koala написав:

Про гармату і горобців чули?
Просто запитати http://replace.org.ua/userlist.php?username=Oleg за допомогою idHTTP значно легше, як на мене.
І що, VarToStr не працює?

1. Потрібно спробувати, я навіть не думав за нього, тому що не знав про таку компоненту.
2. VarToStr не працює.

4

Re: Object в String (Delphi)

Ви вибираєте Document.getElementById('tc1') - можете викласти фрагмент того html-файлу, де ви його шукаєте?

5 Востаннє редагувалося Logans (24.11.2013 18:03:43)

Re: Object в String (Delphi)

koala написав:

Ви вибираєте Document.getElementById('tc1') - можете викласти фрагмент того html-файлу, де ви його шукаєте?

Це приклад для "Replace". Замінивши "tc1" на "tc5" помилка не зникла.

Код "Replace"
<tr class="odd row1">
                    <td class="tc5"><span class="group_color_1"><a href="http://replace.org.ua/user/2/">Replace</a></span></td>
                        <td class="tc1">Replace Team</td>
                        <td class="tc2">1 705</td>
                        <td class="tc3">761</td>
                        <td class="tc4">06.04.2012</td>
                </tr>
Код "Oleg"
<tr class="odd row1">
                    <td class="tc5"><span class="group_color_3"><a href="http://replace.org.ua/user/223/">Oleg</a></span></td>
                        <td class="tc1">Користувач</td>
                        <td class="tc2">36</td>
                        <td class="tc3">7</td>
                        <td class="tc4">04.11.2012</td>
                </tr>

6

Re: Object в String (Delphi)

Згідно з MSDN, функція getElementById повертає IHTMLElement. В нього відсутнє поле Value, але є інші, які можуть вас зацікавити.

Подякували: Logans1

7

Re: Object в String (Delphi)

В жодному з наведених фрагментів немає жодного елемента з id="tc1".
І беріть не Value, а InnerHTML.

Подякували: Logans1

8 Востаннє редагувалося Logans (24.11.2013 20:18:10)

Re: Object в String (Delphi)

Torbins написав:

Згідно з MSDN, функція getElementById повертає IHTMLElement. В нього відсутнє поле Value, але є інші, які можуть вас зацікавити.

Я звісно вибачаюсь, але я перепробував декілька з приведених полів (близько половини) і ні одне не підійшло.

koala написав:

В жодному з наведених фрагментів немає жодного елемента з id="tc1".
І беріть не Value, а InnerHTML.

InnerHTML також не підходить.

9 Востаннє редагувалося DOP (24.11.2013 22:07:19)

Re: Object в String (Delphi)

Я би вам радив заюзати все ж Indy Components(а саме, TIdHTTP).
Спочатку просніферіть усі запити та необхідні параметри, це все зробіть аналогічно програмно за допомогою компонента(idHTTPN.Get('запит і параметри одразу')).
У відповідь отримаєте текст, який зпарсите(ф-ї парсингу по тегам можна знайти).
Для прикладу, можете парсити по таким тегам імена: "/user/" i "</a>" + обрізка непотрібних символів. І так аналогічно з іншими даними.
Десь бачив процедуру, яка всі пошуки поміщає у TStringList - досить зручно :)

InnerHTML також не підходить.

можна і його зпарсити...а чому не підходить?

P.S. Або заюзайте регулярки(правда я у них зовсім не шарю...).

10

Re: Object в String (Delphi)

Oleg написав:
koala написав:

В жодному з наведених фрагментів немає жодного елемента з id="tc1".
І беріть не Value, а InnerHTML.

InnerHTML також не підходить.

Як це у вас виходить - побачити рівно третину з написаного?

11 Востаннє редагувалося Logans (24.11.2013 23:56:31)

Re: Object в String (Delphi)

koala написав:
Oleg написав:
koala написав:

В жодному з наведених фрагментів немає жодного елемента з id="tc1".
І беріть не Value, а InnerHTML.

InnerHTML також не підходить.

Як це у вас виходить - побачити рівно третину з написаного?

Бачив я все, зрозумів тільки третину. Підскажіть тоді, будь-ласка, як звертатися до цього запису, а не по id?

12 Востаннє редагувалося koala (25.11.2013 07:07:05)

Re: Object в String (Delphi)

getElementsById шукає елементи по id (ваш К.О.)
Як шукати потрібний тег, коли немає id? getElementsByTagName, наприклад. Зверніть увагу, що Elements у множині, ця функція повертає масив з усіх елементів з потрібним вам тегом. У Мозилі ще є getElementsByClassName, але в інших браузерах його нема.
А взагалі ваша проблема в тому, що ви застосовуєте повномасштабний браузер для того, щоб отримати рядок з тексту. Тобто браузер ініціює купу з'єднань, запитує всі малюнки і скрипти, будує DOM, хешує/кешує/оптимізує/рендерить... і все заради того, щоб в файлі (доступному, щоправда, через мережу, але ж є idHTTP) знайти один рядок, одна з перших лабораторних задач!

Подякували: Torbins, Logans2