1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

نحوه مقداردهي به كنترلهاي يك فرم وب از طريق دلفي

شروع موضوع توسط hector2141 ‏11/9/12 در انجمن Delphi

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    اگه شما روي فرمتون در دلفي يك كنترل WebBrowser داشته باشيد و در اون يك صفحه رو باز كرده باشيد، و اون فرم وب شامل يك يا چند فرم باشه، با كدهاي زير مي‌تونيد كنترلهاي اون فرم وب رو مقدار دهي و همچنين اون فرم وب رو Submit كنيد:

    با اين پروسيجر مي‌تونيد يك كنترل (فيلد) خاص رو از يك فرم مقداردهي كنيد:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [/TD]
    [TD="class: code"]procedure WebFormSetFieldValue(const document: IHTMLDocument2;
    const formNumber: integer;
    const fieldName, newValue: string) ;
    var
    form : IHTMLFormElement;
    field: IHTMLElement;
    begin
    form := WebFormGet(formNumber, document) ;
    field := form.Item(fieldName,'') as IHTMLElement;
    if field = nil then Exit;

    if field.tagName = 'INPUT' then
    (field as IHTMLInputElement).value := newValue
    else
    if field.tagName = 'SELECT' then
    (field as IHTMLSelectElement).value := newValue
    else
    if field.tagName = 'TEXTAREA' then
    (field as IHTMLTextAreaElement).value := newValue;
    end;

    [/TD]
    [/TR]
    [/TABLE]


    البته تابع WebFormGet كه در پروسيجر بالا به كار برده شده، اين شكليه:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    [/TD]
    [TD="class: code"]function WebFormGet(const formNumber: Integer;
    const document: IHTMLDocument2): IHTMLFormElement;
    var
    forms: IHTMLElementCollection;
    begin
    forms := document.forms as IHTMLElementCollection;
    Result := forms.item(formNumber, '') as IHTMLFormElement;
    end;

    [/TD]
    [/TR]
    [/TABLE]


    و نحوه استفاده:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    [/TD]
    [TD="class: code"]WebFormSetFieldValue((WebBrowser1.Document as IHTMLDocument2), 0, 'q', 'test');

    [/TD]
    [/TR]
    [/TABLE]


    پارامتر اول كه Document كنترل WeBrowserتون رو ارسال مي‌كنه، پارامتر دوم شماره فرم وب هست، اگه صفحه باز شده در WebBrowser فقط يك فرم داشته باشه شماره‌اش صفره و اگه بيشتر شماره‌اش هم بيشتر مي‌شه (از صفر شروع مي‌شه).
    پارامتر سوم، اسم كنترل هست. مثلاً در فرم صفحه اول سايت گوگل، كنترلي كه داخلش متن رو براي جستجو تايپ مي‌كنيد اسمش q است.
    و پارامتر آخر مقداريه كه بايد داخل اون كنترل قرار بگيره.

    اما نحوه Submit كردن فرم:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    [/TD]
    [TD="class: code"]form := WebFormGet(0, WebBrowser1.Document AS IHTMLDocument2);
    form.submit;

    [/TD]
    [/TR]
    [/TABLE]



    مشخصه كه اون صفر شماره فرمه، (يعني اگه بيشتر از يك فرم داشتيد بايد شماره فرم مورد نظر رو به جاي صفر قرار بديد).
    ضمن اينكه اين متغير form از نوع IHTMLFormElement هست.
    اما يك تابع براي اينكه اسم كنترلهاي فرم وب رو بتونيد بدست بياريد:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    [/TD]
    [TD="class: code"]function WebFormFields(wBrowser: TWebBrowser;
    const formNo: Integer): TStringList;
    var
    form: IHTMLFormElement;
    field: IHTMLElement;
    fName: string;
    idx : integer;
    begin
    form := WebFormGet(formNo, wBrowser.Document as IHTMLDocument2);
    Result := TStringList.Create;
    for idx := 0 to form.length - 1 do
    begin
    field := form.item(idx, '') as IHTMLElement;
    if field = nil then
    Continue;
    fName := field.id;
    if field.tagName = 'INPUT' then
    fName := (field as IHTMLInputElement).name
    else
    if field.tagName = 'SELECT' then
    fName := (field as IHTMLSelectElement).name
    else
    if field.tagName = 'TEXTAREA' then
    fName := (field as IHTMLTextAreaElement).name;
    Result.Add(fName);
    end;
    end;

    [/TD]
    [/TR]
    [/TABLE]




    و البته حتماً مي‌خواهيد كه اسامي فرمهاي داخل صفحه وب رو هم داشته باشيد. شايد اون صفحه بيشتر از يك فرم داشته باشه:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [/TD]
    [TD="class: code"]function WebFormNames(const document: IHTMLDocument2): TStringList;
    var
    forms: IHTMLElementCollection;
    form: IHTMLFormElement;
    idx: Integer;
    begin
    forms := document.forms as IHTMLElementCollection;
    Result := TStringList.Create;
    for idx := 0 to forms.length - 1 do
    begin
    form := forms.item(idx, 0) as IHTMLFormElement;
    Result.Add(form.name);
    end;
    end;

    [/TD]
    [/TR]
    [/TABLE]



    همون طور كه مي‌بينيد كه مقداري كه دو تابع آخر برمي‌گردونن از نوع TStringList هست، مي‌تونيد اونها رو به شكل زير به Memo نسبت بديد:
    ابتدا در قسمت var يك متغير از نوع TStringList تعريف كنيد:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    [/TD]
    [TD="class: code"]Str: TStringList;

    [/TD]
    [/TR]
    [/TABLE]



    حال در يك پروسيجر مثلاً در OnClick يك Button بنويسيد:
    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    [/TD]
    [TD="class: code"]Str := WebFormFields(WebBrowser1, 0);
    Memo1.Lines.Assign(Str);

    [/TD]
    [/TR]
    [/TABLE]



    منبع: delphi.about.com