Html Table get Id/Name hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Html Table get Id/Name hakkında

Mesaj gönderen adelphiforumz »

Selamlar

Browser üzerinden açtığım bir sayfadaki tabloyu IHTMLTable olarak alıyorum
bir satırdaki hücrenin Id yada Name özelliğine nasıl ulaşabilirim.

.getatribube('Id') olarak denedim değer boş geliyor
HTML üzerinden baktığımda her hücrenein bir ID ve Name özelliği var

Bu konuda yardımcı olabilieceklere şimdiden
teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Html Table get Id/Name hakkında

Mesaj gönderen Lord_Ares »

hücrelerin id veya name varsa, getelementbyid veya name kullanarak ulaşabilirsiniz.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Html Table get Id/Name hakkında

Mesaj gönderen adelphiforumz »

Lord_Ares yazdı:hücrelerin id veya name varsa, getelementbyid veya name kullanarak ulaşabilirsiniz.
Amacım zaten o hücrenin Id yada Name bilgisini almak
Bu nedenle ID ve Name elimde yok
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Html Table get Id/Name hakkında

Mesaj gönderen Lord_Ares »

HTML üzerinden baktığımda her hücrenein bir ID ve Name özelliği var
Amacım zaten o hücrenin Id yada Name bilgisini almak Bu nedenle ID ve Name elimde yok
Elinizde Var mı yokmu inan şuan ben bile şaşırdım :D ilk mesajına bakarak getelementbyid veya name yine önericem.Eğer elinizde yoksa (yani her hücre sadece id siz div ile yapılmışsa ) ozaman html parse yöntemi ile almanız gerekecek. Sayfa yapısını paylaşırsanız yardım etmek isteyenler sizi daha net anlayabilir.
Kolay gelsin
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Html Table get Id/Name hakkında

Mesaj gönderen adelphiforumz »

Lord_Ares yazdı:
HTML üzerinden baktığımda her hücrenein bir ID ve Name özelliği var
Amacım zaten o hücrenin Id yada Name bilgisini almak Bu nedenle ID ve Name elimde yok
Elinizde Var mı yokmu inan şuan ben bile şaşırdım :D ilk mesajına bakarak getelementbyid veya name yine önericem.Eğer elinizde yoksa (yani her hücre sadece id siz div ile yapılmışsa ) ozaman html parse yöntemi ile almanız gerekecek. Sayfa yapısını paylaşırsanız yardım etmek isteyenler sizi daha net anlayabilir.
Kolay gelsin
Selamlar
Runtimeda ulaştığım tablonun içerisinde her hücrenin bir ID ve Bir Name özelliği var
fakat kodu yazarken ben o hücrenin ID yada Name'ini bilmiyorum

Zaten amaçta hücreye verilen ID'sini ve Name'mini almaya çalışıyorum.
Yani elde etmek istediğim sonuç hücrenin ID ve Name'ini alabilmek.

Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
loaded
Üye
Mesajlar: 122
Kayıt: 12 Eki 2010 09:45
Konum: Konya
İletişim:

Re: Html Table get Id/Name hakkında

Mesaj gönderen loaded »

Selam
Form içerisindeki elementlere ulaşan javascript kodu delphiye kendiniz uyarlayabilirsiniz.

Kod: Tümünü seç

var dede='input'; // Form elemanlarının ortak adı input,button,select,textarea gibi ...
if (document.getElementsByTagName(dede).length!=0){
for (i = 0; i < document.getElementsByTagName(dede).length; i++) {
   console.log('Name Değeri :' + document.getElementsByTagName(dede)[i].name + ' İd Değeri :' + document.getElementsByTagName(dede)[i].id);
}
}
Kalk ve işe yarar bir şey yap! Çünkü Allah (c.c.) yeniden başlayanların yardımcısıdır.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Html Table get Id/Name hakkında

Mesaj gönderen Lord_Ares »

Paşam sanırım kafanız epey yoğun ki beni anlamadın :))
Zaten siz bunu daha önce şu konuda yapmışsınız "if iE.tagName <> 'TABLE' then continue;" continue yerine edit1.text:= ie.element.name derseniz adına ulaşmış olursunuz. getElementsByTagName('Table') size table bulmanızda kolaylık sağlayacaktır onuda araştırabilirsiniz.
viewtopic.php?f=2&t=35306&p=190647&hili ... nt#p190647

Kod: Tümünü seç

function TfrmHtmTest.fn_HtmlFindTable(_hDoc : IHtmlDocument2; _hIdName : String): IHTMLTable;
var
  hAllCollectin: IHTMLElementCollection;
  I,
  Len: Integer;
  E: OleVariant;
  iE : IHTMLElement;
  hTable : IHTMLTable;
begin
  Result := nil;
  hTable := nil;
  hAllCollectin := _hDoc.All;
  if hAllCollectin = Nil then Exit;
  Len := hAllCollectin.Length;

  for I := 0 to Len - 1 do begin
    E := hAllCollectin.Item(I, varEmpty);
    iE := IDispatch(E) as IHTMLElement;
    if iE.tagName <> 'TABLE' then continue;
    if iE.id <> _hIdName then Continue;
    hTable := (iE as IHTMLTable);
    break;
  end;
  Result := hTable;
end;

Ayrıca farklı olarakta aşağıda Mrman üstadımızın çok güzel bir kod örneği var.
Formuna bir adet memo ve webbrowser ekle. Aşağıdaki kod sayfadaki elementlerin namelerini id nolarını ekleyecektir.
uses mshtml eklemeyi unutma.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  i,j : Integer;
begin
  WebBrowser1.Navigate('http://divxplanet.com/');
  while WebBrowser1.ReadyState <> ReadyState_Complete do Application.ProcessMessages;
  Memo1.Lines.Clear;
  if WebBrowser1.OleObject.Document.Frames.Length > 0 then begin
    Memo1.Lines.Add('');
    Memo1.Lines.Add('-----------------------------');
    Memo1.Lines.Add('FRAMES bilgileri');
    Memo1.Lines.Add('-----------------------------');
    for i := 0 to WebBrowser1.OleObject.Document.Frames.Length - 1 do
    begin
      Memo1.Lines.Add( Format('WebBrowser1.OleObject.Document.Frames.Item(%d)', [i]) );
    end;
  end;

  if WebBrowser1.OleObject.Document.Forms.Length > 0 then begin
    Memo1.Lines.Add('');
    Memo1.Lines.Add('-----------------------------');
    Memo1.Lines.Add('FORMS bilgileri');
    Memo1.Lines.Add('-----------------------------');
    for i := 0 to WebBrowser1.OleObject.Document.Forms.Length - 1 do
    begin
      Memo1.Lines.Add( Format('WebBrowser1.OleObject.Document.Forms.Item(%d).Document.Body.InnerHTML', [i]) );
      for j := 0 to WebBrowser1.OleObject.Document.Forms.Item(i).Elements.Length - 1 do begin
        Memo1.Lines.Add( Format('  WebBrowser1.OleObject.Document.Forms.Item(%d).Elements.Item(%d).Name -> ''%s'' ', [i, j, WebBrowser1.OleObject.Document.Forms.Item(i).Elements.Item(j).Name ]) );
      end;
    end;
  end;
  ShowMessage('Bitti');
end;
Veya bu örnekteki gibi

Kod: Tümünü seç

var
  Document: IHTMLDocument2;
  Body: IHTMLElement2;
  aList: IHTMLElementCollection;
  a: IHTMLElement;
  I: Integer;
  link: string;
begin
  if Supports(WebBrowser1.Document, IHTMLDocument2, Document) then
    if Supports(Document.body, IHTMLElement2, Body) then
    begin
      aList := Body.getElementsByTagName('a');
      for I := 0 to Pred(aList.length) do
      begin
        a := aList.item(I, EmptyParam) as IHTMLElement;
        link := a.getAttribute('href', 0);
        //...
      end;
    end;
end;
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Html Table get Id/Name hakkında

Mesaj gönderen adelphiforumz »

Selamlar

Dediğiniz gibi biraz yoğunum ve uykusuzum bu nedenle kafamı toplayıp çözemedim bir türlü
belkide yapmak istediğimi tam olarakta anlatamamış olabilirim
ilginiz ve sabrınız için teşekkürler

Aşağıda yapmak istediğimi ve ulaşmak istediğimi detaylı bir şeklide nasıl yapmaya
çalıştığımı ve takıldığım noktayı kodla anlatmaya çalıştım

Somut ve net olan tek şey sayfanın yüklenme sonrasında Tablo adının sabit olması
bu gelen ekranda bazen 8-10 farklı tablo olabiliyor benim ise derdim tek bir tablonun içerisindeki işlemler

Tekrardan teşekkürler

Kod: Tümünü seç

  function fn_HtmlFindTable(_hDoc : IHtmlDocument2; _hIdName : String; Const _sClassName : String = ''; const _sIcerik:String = ''): IHTMLTable;
  var
    hAllCollectin: IHTMLElementCollection;
    I,
    Len: Integer;
    E: OleVariant;
    iE : IHTMLElement;
    hTable : IHTMLTable;
  begin
    Result := nil;
    hTable := nil;
    hAllCollectin := _hDoc.All;
    if hAllCollectin = Nil then Exit;
    Len := hAllCollectin.Length;

    for I := 0 to Len - 1 do
    begin
      E := hAllCollectin.Item(I, varEmpty);
      iE := IDispatch(E) as IHTMLElement;

      if iE.tagName <> 'TABLE' then continue;

      if _sClassName <> '' then
          if iE._className <> _sClassName then
            continue;

      if _sIcerik <> '' then
          if AnsiContainsStr(iE.innerHTML, _sIcerik) = False Then
              continue;

      if iE.id <> _hIdName then
          Continue;

      hTable := (iE as IHTMLTable);
      break;
    end;
    Result := hTable;
  end;
 .....
 .....
 .....
procedure TfrmTest.Button4Click(Sender: TObject);
var
   htmdoc : IHTMLDocument2;
   Rows : IHTMLElementCollection;
   Cells : IHTMLElementCollection;
   Table : IHTMLTable;
   Row : IHTMLTableRow;
   Cell : IHTMLTableCell;
   All : IHTMLElementCollection;
   I, T, R, C : integer;
   ov : OleVariant;

begin
    Table := fn_HtmlFindTable((WB.Document as IHTMLDocument2), 'IdUrunTablosu');

{ ***** benim uyguladığım yöntem
    ovTable := Table;
    if Table <> nil then
    begin
        for R := 1 to (ovTable.Rows.Length - 2) do
        begin
            for C := 1 to (ovTable.Rows.Item(R).Cells.Length - 2) do
            begin
                Memo1.lines.add('Index->' + IntToStr(R)+':'+IntToStr(C) + '->'+ ovTable.Rows.Item(R).Cells.Item(C).innerHTML);
                **** bu yöntemle yalnızc Id alabiliyorum Name'e ulaşamıyorum
            end;
        end;
    end;
}

// ***** yapmaya çalıştığım yöntem
    if Table <> nil then
    begin
        Rows := (Table.Rows as IHTMLElementCollection);
        for R := 0 to Rows.length - 1 do
        begin
            Row := Rows.Item(ovR, R ) as IHTMLTableRow;
            Cells := (Row.Cells as IHTMLElementCollection);
            for C := 0 to Cells.length - 1 do
            begin
               Cell := Cells.Item(ovC, C ) as IHTMLTableCell;
*********   Ben bu noktada Cell elemanının name yada Id değerine direkt ulaşmaya çalışıyorum
*********   başaramadığım nokta burda 
*********  her satırın her hücresinin id ve name'i farklı verilmiş
*********  name içerisinde bir kodlama şekli kullanılmış bu kodlama şeklini pars ederek isim içerisinden 
*********  başka bir veri elde ederek alt bir rutine yönelmeye çalışıyorum
*********  Name kısmı SabitKod:SatirNo:DeğişkenDeğer:SabitKod:UrunId:SabitKod 
*********  Id kısmı SabitKod:SatirNo:DeğişkenGrupId:SabitKod:DegiskenAltGrupKod:SabitKod 
********* şeklinde bölümlenmiş.

            end;
        end;
    end;
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Cevapla