Delphi'de CGI programlama hakkında yardım !

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

mrmcop çok teşekkürler yardımların için
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

mrmcop teşekkür ederim ama benim sorumu tam yanıtlamamışsın havalarda kalmış soru :)
Benim sorum şu delphi içinden elimdeki dosyakontrol.cgi programına nasıl bilgi işlerim? ve okuturum Neler gerekli?

#dosyakontrol.cgi eleman içeriği
#edit1 - string
#edit2 - date
#edit3 - string (WebSite)
#memo1 - Açıklama
benim tam olarak istediğim şey şu

bu cgi scriptin HTML arayüzü gibi bir form hazırlayacağım.
3 tane edit 1 memo bir de düğme koyup kayıt ekleyebileceğim.

component kullanmadan olmaz mı? (olması lazım da :lol: )
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhabalar....
webaytek yazdı:component kullanmadan olmaz mı? (olması lazım da )
- TNMHttp ve TIdHttp dediğim nesneler zaten TEdit ve TMemo gibi Delphi'nin bünyesindeki nesneler.... Yani üçüncü parti bişi kullanmayacaksınız... :)

- Bileşen olmadan ısrarınız üzerine aşağıdaki çözümü öneriyorum...

- Uses satırına WinInet ekleyip aşağıdaki fonksiyonu copy/paste yapın...

Kod: Tümünü seç

function TForm1.GetInetFile(const fileURL, FileName: String): boolean;
const
  BufferSize = 1024;
var
  hSession,
  hURL      : HInternet;
  Buffer    : array[1..BufferSize] of Byte;
  BufferLen : DWORD;
  f         : File;
  sAppName  : string;
begin
  Result   := False;
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession,
              PChar(fileURL),
              nil,0,0,0);
  try
    AssignFile(f, FileName);
    Rewrite(f,1);
    repeat
      InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
      BlockWrite(f, Buffer, BufferLen)
    until BufferLen = 0;
    CloseFile(f);
    Result:=True;
  finally
    InternetCloseHandle(hURL)
  end
  finally
    InternetCloseHandle(hSession)
  end
end;
- Kullanmak için de bir buton koyup altına şunu kopyala/yapıştır yapın..

Kod: Tümünü seç

Var
  Dosya, URL : String;
begin
  Dosya := ExtractFilePath(Application.ExeName)+'GELEN.TXT';
  Url   := 'http://www.url.com/dosyakontrol.cgi?edit1=string&edit2=date&edit3=string&memo1=Açıklama';
  If GetInetFile(Url, Dosya)
    then ShowMessage('Dosya Geldi')
    else ShowMessage('Sorun Var');
end;
- Şeklinde bir deneyip görüşünüzü bildirin...
- string, date, string, açıklama yazan alanları Edit ve Memo kutularını yönlendirmeyi unutmayın... Ama önce bu şekilde bir dene bakalım bu veriler ASP'ye sorunsuz iş gördürecek mi ?

- Bakınız bileşen falan kullanmadık.... :wink:
Resim
Resim ....Resim
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Benim anladıgım kadarıyla Muharrem Bey @webaytek arkadas
gorsel olarak delphi ile cgi programları nasıl yazılabilir diye soruyor.
eger buysa soru malesef html ve perl ile pasa pasa yazacaksınız.
Delphiyi ise bulastırırsanız isapi uygulaması seklinde yazacaksınız, buda web server da yayınlanması icin html kodları gonderecek.
aslında cok basit ama biraz karısık gibi oldu
Yanlıs anladıysam afwola
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

gkimirti ilgin için saol benim asıl sorum dediğim gibi elimdeki bir cgi dosyasına sadece yazı aktarmak

dosyakontrol.cgi dosyasını ben bir siteden ziyaretci defteri olarak aldım kendi kendime düzelttim ve kendi notlarımı falan işlemek için kullanıyorum zaten (apache saolsun :wink: ) benim istediğim şey de bu dosyaya önceden de belirttiğim gibi :

3 edit ve 1 memo üzerine bilgi giremek suretiyle gönder tuşuna bastığımda dosyakontrol.cgi vasıtasıyla log.htm üzerine kayıt etmek

yani browserım yerine delphi kullanmak istiyorum (aman WebBrowser componenti kullan falan demeyin :lol: )

Resim
http://www.geocities.com/webdeppo2/cgi.jpg
################## CGI Böyle görünüyo
Resim
http://www.geocities.com/webdeppo2/exe.jpg
################## EXE de böyle görünüyor
Göder dediğimde cgi de bilgileri işliyor exe de de işlesin istiyorum
(dosyanın bulunduğu IP:127.0.0.1 olsun ya da bir internet adresi :) )
heh işte ben de bir cgi ye ulaşabilmem için gerekli kodları istiyorum #uzun mu oldu ne :wink:
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

o zaman muharrem beyin anlattıgı yontem ile yapacaksın
gayet acık ve net ifade etmis.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

hepinizden tekrar tekrar özürdiliyorum
webaytek yazdı: delphi içinden elimdeki dosyakontrol.cgi programına nasıl bilgi işlerim
yani ben dosyayı direkt internetteki serverıma ya da evde isem localhostdan c:\windows\desktop\dosyakontrol\log.htm altına işliicem
yani asıl sorun log.htm yle ilgili diil (ona zaten cgi karar veriyor)

:?: edit1.text içine yazdığım bilgiyi http://localhost/cgi-bin/dosyakontrol/dosyakontrol.cgi programı içindeki edit1 ile edit1.text (delphi)yi nasıl ilişkilendireceğim

:?: Gönder tuşuna ne gibi bi procedure yazmalıyım.

ELİNİZDEN GELENİ YAPTIĞINIZDAN EMİNİM :)
İYİ ÇALIŞMALAR :wink:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...

- CGI dosya içindeki değişkenleri aşağıdaki gibi tanımlandığını bildirmiştiniz...

Kod: Tümünü seç

#dosyakontrol.cgi eleman içeriği 
#edit1 - string 
#edit2 - date 
#edit3 - string (WebSite) 
#memo1 - Açıklama 
- Bu şartlar altında Delphi kullanmadan buraya veri kaydetmek için gerekli Internet Explorer Adres satırı, daha önce de açıklamaya çalıştığım şu şekilde olacaktır...

Kod: Tümünü seç

http://localhost/cgi-bin/dosyakontrol/dosyakontrol.cgi?edit1=log.htm&edit2=22.07.2004&edit3=c:\widnows\desktop\dosyakontrol&memo1=açıklama+goes+here+meen!
şeklinde giriş yaptığınızda belirttiğiniz şekilde bir sonuç almanız sözkonusudur...

- Siz yine de daha önce bildirdiğim şekilde noktalama olmaksızın sade bir deneme yapıp sonucu teyid edin.... Aşağıdaki yazdığım kodu Internet Explorer Adres satırına yazıp sonucun veritabanına işlendiğini teyid edin... Delphi aşamasına bu işlemin sounsuz çalıştığına emin olduktan sanra girişilecektir...

Kod: Tümünü seç

http://localhost/cgi-bin/dosyakontrol/dosyakontrol.cgi?edit1=string&edit2=date&edit3=string&memo1=Açıklama
- Noktalama ve işaretlemeler olmaksızın deneme yapın, çünkü yukardaki şekilde giriş yaptığınızda Explorer otomatik olarak kodlama yaparak aşağıdaki şekle dönüştürürken, siz bunu manuel yapmak durumundasınız... Dilerseniz ShellApi ile Explorer adres satırına gönderi yaprak bu işlemi IE'ye yıkabilirsiniz...

Kod: Tümünü seç

http%3A%2F%2Flocalhost%2Fcgi-bin%2Fdosyakontrol%2Fdosyakontrol.cgi%3Fedit1%3Dlog.htm%26edit2%3D22.07.2004%26edit3%3Dc%3A%5Cwidnows%5Cdesktop%5Cdosyakontrol%26memo1%3Da%C3%A7%C4%B1klama%2Bgoes%2Bhere%2Bmeen%21
Resim
Resim
Resim ....Resim
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

mrmcop ilginiz için teşekkür ederim saygılar sunarak birşeyi de açıklığa kavuşturmam gerektiğini düşünüyorum
benim elimdeki cgi script bu şekilde çalışmıyor yani ? sonrasını algılamıyor yani daha açık olmak gerekirse browser üzerinden kullanılamaması için böyle bir satır içeriyor ben bu satırın hangisi olduğunu biliyorum - sizin dediğiniz forma dönüştürülünce script kullanılmaz oluyor. parametreler saçmalıyor benim derdim de bu zaten yoksa hiç uğraştırmam sizi ben de WebBrowser comp. i ile yapabiliyorum. Benim isteğim elimdeki program yardımıyla bu işi yapabilmek yoksa ne gerek war delphiye ben bunu internet explorerla da yapabiliyorum :cry:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhabalar...

- Beni kesinlikle yanlış anlamışsınız... :oops:
- Burada Internet Explorer ile yapılan deneyin Delphi ile işe başlamadan önce CGI sistemin adres satırındaki gibi GET methodu ile doğru çalışıp çalışmadığını ortaya koyarak, doğru çalışıyorsa daha kestirme yoldan basit bir fonksiyonla bunu başarmanın mümkün olduğunu belirtmek içindi...

- Sadece TWebBrowser ile bu iş gerçekleştirebiliyorum dediğinizde göre, ilk olarak TWebBrowser'deki HTML bilgiyi parse edilmek üzere TMemo, TStringList veya TRichedit gibi yığın text saklayabileceğiniz bir ortama almak gerekecek...

- Bunu için TWebBrowser'in Navigasyon işleminin sona erip ermediğinin takibi gerekli... Aşağıdaki kodu buna örnek olarak verebilirim...

- Formunuzda 1 adet TWebBrowser ve 1 adet TMemo olduğunu varsayarak aşağıdaki kod, Web Navigasyon işlemi sonuna kadar bekler, bitince de sayfayı Memo'ya aktarır. Bu durumda parse işleminin ilk ayağı olan yığın veriyi elde etme işlemi tamamlanmış olur...

Kod: Tümünü seç

    WebBrowser1.Navigate( URL,
                          EmptyParam,
                          EmptyParam,
                          PostData,
                          Headers);

    repeat
       Application.ProcessMessages;
       // ZZZZzzzz
    until ( WebBrowser1.ReadyState = READYSTATE_COMPLETE );
    Memo1.text := WebBrowser1.OleObject.Document.Body.InnerHTML;
- Şimdi bu MEMO'yu satır satır okuyup istediğimiz bilgiyi içerdiğini düşündüğümüz satır/satırları string operasyonlarla işleyip değerleri okutmak aşamasına gelindi...

- Takıldığınız yer olursa bu başlık altına devam edin...

- Başarılar...
Resim
Resim ....Resim
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

mrmcop ellerine sağlık

Mesaj gönderen webaytek »

galiba aramızda bi anlaşmazlık oldu galiba :shock: :? :roll: :-)

ama son mesajınızla herşey aydınlandı.

çok tenkiii çok tenkiii :D
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhabalar...
- Mail ile cevap veremeyeceğimden cevabımı buraya yönlendiriyorum...

2004 ORTAÖĞRETİM KURUMLARI ÖĞRENCİ SEÇME VE YERLEŞTİRME SINAVI SONUÇLARI adresini vermişsiniz... Burayı isteğiniz üzerine inceledim...

- Gelen metni bir Memo'ya nasıl atayacağınızı bildirmiştim... Şimdi bu metni nasıl parse edildiğini sunuyorum...

- Formunuza yerleştireceğini bir TListBox'a sonuçlar yönlendirilmektedir... Kullanımı şu şekilde ...

Kod: Tümünü seç

OKOSYSParse(Memo1.Lines, ListBox1.Items);
Alacağınız sonuç ise şu şekilde...

Kod: Tümünü seç

TCKNO:12345678901
ADSOY:ALİ VELİ KONYA
BABAD:BABAALİ
TM_PU:658.765
MF_PU:652.245
SONUÇ:KAZANAMADINIZ.
Not : İsimler ve TC kimlik no değiştirilmiştir... Gerçekle ilişkisi yoktur...

- Geriye bu listeyi istediğiniz şekilde kesip biçip kullanmak kalıyor... Şimdi parse kodunu vereyim...

Kod: Tümünü seç

Procedure TForm1.OKOSYSParse(Gelen, Ayiklanan: TStrings);
Var
  Sayac  : Integer;
  Aranan : String;
begin
  Sayac := -1;
  Repeat // aşağıya kadar bir sürü var ama Aranan Kelime'den sonrakiler lazım..
    Inc(Sayac);
  Until (Pos('<TBODY>', Gelen[Sayac]) > 0)
     or (Sayac > Gelen.Count);

  Repeat
    Inc(Sayac);
    Aranan := '<TD align=right><B>T.C. Kimlik No:</B></TD>';
    If (Pos(Aranan, Gelen[Sayac]) > 0) then
    begin
      Inc(Sayac); // Veri bir alt satırında...
      // TC Kimlik No.
      ListBox1.Items.Add('TCKNO:'+TaglariTemizle(Gelen[Sayac]));

      Inc(Sayac,4);
      // Adı Soyadı
      ListBox1.Items.Add('ADSOY:'+TaglariTemizle(Gelen[Sayac]));

      Inc(Sayac,4);
      // Baba Adı
      ListBox1.Items.Add('BABAD:'+TaglariTemizle(Gelen[Sayac]));

      Inc(Sayac,4);
      // TM Puan
      ListBox1.Items.Add('TM_PU:'+TaglariTemizle(Gelen[Sayac]));

      Inc(Sayac,4);
      // MF Puan
      ListBox1.Items.Add('MF_PU:'+TaglariTemizle(Gelen[Sayac]));

      Inc(Sayac,4);
      // SONUÇ
      ListBox1.Items.Add('SONUÇ:'+TaglariTemizle(Gelen[Sayac]));
      Sayac := Gelen.Count; // Beklemeksizin Fonksiyondan çıksın...
    end;
  Until (Sayac >= Gelen.Count-1);
end;

Kod: Tümünü seç

Function TForm1.TaglariTemizle(Satir : String) : String;
Var
  Basla, Bitis : Integer;
begin
  Result := '';
  Repeat
    Basla  := Pos('<', Satir );
    Bitis  := Pos('>', Satir );
    If Bitis > Basla then
    begin
      Delete(Satir, Basla, Bitis-Basla+1);
      If Pos('Res', Satir) > 0 then Satir := Trim(Copy(Satir, 1, Pos('Res', Satir)-1) );
      Result := Trim(Satir);
    end;
  Until (Basla=0) or (Bitis=0);
end;
Resim
Resim ....Resim
Cevapla