Döngü Hatası !!!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Döngü Hatası !!!

Mesaj gönderen Trial_Cooder »

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
 s: Integer;
begin
 for s := 0 to Memo2.Lines.Count - 1 do
 WebBrowser1.Navigate(Memo2.Lines[s] + ComboBox1.Text);
end;
" ..... Project1.exe Read Adress ..... " Hatası Veriyor, F7 İle Devam Ederken WebBrowser1.Navigate(Memo2.Lines[s] + ComboBox1.Text);
Satırına Geliyor Ordan Geri Dönmesi Gerekirken Hata Sesi Çıkıyor Ve Başka Bir Yere Atlıyor. Neden Olabilir?
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Bize gösterdiğin yerde hata yok. Denedim, bende çalışıyor. Başka bir yerde olmalı. Ama mantığı anlayamadım. Çünkü yaptığınız kodda memo'nun en son satırında ne varsa onu yükleyecektir. Öncekilerinin bir önemi olmayacaktır.
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

s := 0;
WebBrowser1.Navigate(ComboBox1.Text + Memo2.Lines[s]);

Böyle Kullandığımda Hata Vermiyor, Döngü İle Kullandığımda Veriyor !
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Kodu aşağıdaki gibi deneyin.

Kod: Tümünü seç

WebBrowser1.Navigate(Memo2.Lines.Strings[s] + ComboBox1.Text);
Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

opt2000 Verdiğiniz Çözüm İşe Yaramadı :(

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
SAYFA : variant;
begin
WebBrowser1.Document._Release;
SAYFA := WebBrowser1.Document;
if Webbrowser1.LocationURL <> '' then
begin
memoSource.text := SAYFA.Body.OuterHTML;
end;
//Button2.Click; (Enable Yapıpta Denedim Bişey Değişmedi)
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
for s := 0 to Memo2.Lines.Count - 1 do
WebBrowser1.Navigate(ComboBox1.Text + Memo2.Lines[s]);
end;

Benim Kullandığım Üstteki Kodda, Her Seferinde Memo2'nin Bir Alt Satırına Geçmek,

WebBrowser'a İşlem Gönderdiğimde Webbrowser Ondocumentcomplete'ten Sonra Tekrar Memo'nun Alt Satırına Geçmesi Gerek !
Bunun Başka Bir Yolu Varmı ?
Kullanıcı avatarı
kara_kule06
Üye
Mesajlar: 150
Kayıt: 18 Nis 2006 02:15
Konum: ankara/polatlı
İletişim:

Mesaj gönderen kara_kule06 »

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject); 
var 
 s: Integer; 
begin 
 for s := 0 to Memo2.Lines.Count - 1 do 
 begin
 WebBrowser1.Navigate(Memo2.Lines[s] + ComboBox1.Text); 
 end;
end;
Kardeş senin kodunda bi eksiklik var sanırım. böyle dene olacaktır.Kolay Gelsin.
İlim öğrenmek akıntıya karşı yüzmek gibidir. Ara verildiği zaman gerilenir...
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

Benim Kodun Aynısı Bir Fark Yok
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Trial_Cooder yazdı:Benim Kodun Aynısı Bir Fark Yok
Fark şu
kara_kule06 yazdı:var
s: Integer;
s, global değilse; bu prosedür içinde de tanımlanması lazım.
Bir de yanlış hatırlamıyorsam; butonların click prosedürlerinin işlemesi için Button2Click(Form1) gibi kullanılması gerekiyor; Button2.Click şeklinde değil.
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

s: Integer Zaten Var

Kod: Tümünü seç

var
  Form1: TForm1;
  s: Integer;
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Sanırım asıl sorunun nerede olduğunu buldum.

Kod: Tümünü seç

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
   SAYFA : variant;
begin
   WebBrowser1.Document._Release;
   SAYFA := WebBrowser1.Document;
   if Webbrowser1.LocationURL <> '' then
   begin
      memoSource.text := SAYFA.Body.OuterHTML;
   end;
   //Button2.Click; (Enable Yapıpta Denedim Bişey Değişmedi)
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
   for s := 0 to Memo2.Lines.Count - 1 do
      WebBrowser1.Navigate(ComboBox1.Text + Memo2.Lines[s]);
end;
Öncelikle Button2Click'de s'i integer olarak tanımlaman gerekiyor. Bundan kesinlikle eminiz. Sanırım buraya kopyalarken bir hata oldu (Eski sürümde var).

Button2Click kodunu şu şekle çevir

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
   for s := 0 to Memo2.Lines.Count - 1 do
      WebBrowser1.Navigate(Memo2.Lines.Strings[s] ComboBox1.Text);
end;
Sanırım en büyük sorun burası değil. Asıl sorun onDocumentComplete kısmında. TWebBrowser, COM arabirimi kullanarak Internet Explorer'a bağlanır. Ve COM arabiriminde Smart Pointer'lar kullanılır. Yani bir nesneyi bellekten silmek için Free, Release vs gibi komutlar kullanmazsın, sadece ona referans olan değişkeni Nil (NULL) olarak atarsın. COM arabirimi onu otomatik olarak release eder, çünkü COM arabirimi RefCount üzerinden çalışır.

Bu yüzden kodundaki OnDocumentComplete fonksiyonundaki

Kod: Tümünü seç

WebBrowser1.Document._Release; 
satırını sil. Büyük ihtimalle sorun kalmayacaktır.

Kolay gelsin,
Bahadır Alkaç[/code]
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Yapmak istediğiniz şeyi şimdi anladım :oops:

WebBrowser1.Navigate(ComboBox1.Text + Memo2.Lines[0]);

işlenecek, sonra

WebBrowser1.Navigate(ComboBox1.Text + Memo2.Lines[1]);

işlenecek; bu böyle son satıra kadar devam edecek, değil mi?
Bunu yapmak için for kullanmamalısınız.
Öncelikle global bir değişkeniniz olmalı (s: Integer demişsiniz zaten).
Önce SonrakiSatir adında bir prosedür oluşturun.

Kod: Tümünü seç

procedure SonrakiSatir();
begin
  WebBrowser1.Navigate(Memo2.Lines.Strings[s] + ComboBox1.Text);
  s := s+1;
end;
Sonra bu işlemleri ilk başlatacağınız yere(button2.onclick) şunu yazın

Kod: Tümünü seç

s := 0;
SonrakiSatir;
ve son olarak

Kod: Tümünü seç

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
  var
    Sayfa : Variant;
begin
  WebBrowser1.Document._Release;
  Sayfa := WebBrowser1.Document;
  if Webbrowser1.LocationURL <> '' then
     memoSource.text := SAYFA.Body.OuterHTML;
  
  if s< Memo2.Lines.Count then
    SonrakiSatir;
end;
Kolay Gelsin
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

Opt2000, Söylediklerinizin Hepsini Denedim Olmadı :(

Ulucoder,
procedure SonrakiSatir();
begin
WebBrowser1.Navigate(Memo2.Lines.Strings[LineNumber] + ComboBox1.Text);
s := s+1;
end;

Prosedür'de WebBrowser1 Nesnesinde Hata Veriyor.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Düzelttim orayı.
LineNumber yerine s yazacaksınız.

Cevabı yazarken Global değişken olarak LineNumber kullanıyordum.
Sonra 's zaten global' şeklinde mesaj attınız.
LineNumber'ları s olarak değiştirdim, onu atlamışım.
Özür...
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

Resim
Onu Ben Anladım "s" Yaptım Zaten Hatayı WebBrowser1'da Veriyor !
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

aynı resimde webBrowser'ı free ettiğin de görülüyor.
web browser'ın oluşturulmuş olduğuna emin ol.

Düzeltme:fduman +1
En son ulu coder tarafından 27 Haz 2006 01:56 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Cevapla