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.

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

2

Re: Object в String (Delphi)

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

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

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

Re: Object в String (Delphi)

koala написав:

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

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

4

Re: Object в String (Delphi)

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

5 Востаннє редагувалося Logans (24.11.2013 19: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>

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

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 21:18:10)

Re: Object в String (Delphi)

Torbins написав:

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

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

koala написав:

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

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

9 Востаннє редагувалося DOP (24.11.2013 23: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 (25.11.2013 00:56:31)

Re: Object в String (Delphi)

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

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

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

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

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

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

Re: Object в String (Delphi)

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

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