Delphi'de CGI programlama hakkında yardım !
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
mrmcop teşekkür ederim ama benim sorumu tam yanıtlamamışsın havalarda kalmış soru
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
)

benim tam olarak istediğim şey şuBenim 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
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

Merhabalar....
- 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...
- Kullanmak için de bir buton koyup altına şunu kopyala/yapıştır yapın..
- Ş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....
- TNMHttp ve TIdHttp dediğim nesneler zaten TEdit ve TMemo gibi Delphi'nin bünyesindeki nesneler.... Yani üçüncü parti bişi kullanmayacaksınız...webaytek yazdı:component kullanmadan olmaz mı? (olması lazım da )

- 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;
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;
- 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....

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
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
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
) 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
)

http://www.geocities.com/webdeppo2/cgi.jpg
################## CGI Böyle görünüyo

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
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

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


http://www.geocities.com/webdeppo2/cgi.jpg
################## CGI Böyle görünüyo

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

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


ELİNİZDEN GELENİ YAPTIĞINIZDAN EMİNİM

İYİ ÇALIŞMALAR

Merhaba...
- CGI dosya içindeki değişkenleri aşağıdaki gibi tanımlandığını bildirmiştiniz...
- 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...
ş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...
- 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...

- 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
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!
- 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
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

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
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

Merhabalar...
- Beni kesinlikle yanlış anlamışsınız...
- 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...
- Ş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...
- Beni kesinlikle yanlış anlamışsınız...

- 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;
- Takıldığınız yer olursa bu başlık altına devam edin...
- Başarılar...
mrmcop ellerine sağlık
galiba aramızda bi anlaşmazlık oldu galiba

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




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

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 ...
Alacağınız sonuç ise şu şekilde...
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...
- 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);
Kod: Tümünü seç
TCKNO:12345678901
ADSOY:ALİ VELİ KONYA
BABAD:BABAALİ
TM_PU:658.765
MF_PU:652.245
SONUÇ:KAZANAMADINIZ.
- 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;