Word belgesinin istenilen satırına bilgi yazmak.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen NewMember »

Arkadaşlar;
Bir programda şöyle bir özellik gördüm ama nasıl yapılacağı hakkında bir fikrim yok.

Tarif etmeye çalışayım.Program kamu kurumları için hazırlanmış bir satın alma programı.
Konu ile ilgilenen arkadaşlar varsa bilirler.kamu ihalelerinde hazırlanan idari şartnameler vardır.
.
Bu idari şartnameler Kamu İhale Kurumunun hazırladığı Tip İdari Şartnameye göre düzenlenir.Bu tip idari şartname Aşağıdaki linkten indirilebilir.

http://www.kik.gov.tr/mevzuat23062004/y ... al/Ek2.doc

Kamu kurumları ihalenin durumuna göre bu idari şartnamenin belli başlı yerlerini kendileri değiştirirler.Örnek Ödeme Durumu maddesini, Kurumun ad adresi vb., geçici teminat durumu, ihaleye katılabilmek için gerekli şartlar v.b. gibi bölümleri.Yani 30-40 sayfalık word belgesinin belli başlı yerlerini kendi isteklerine göre değiştiririler.

Program bu aşamada şu olayı yapıyor.Aynen bir adres defteri gibi bazı bilgileri veritabanında ki fieldlere yazdırıyor.Yani kendi arayüzü var.
İşte
İdarenin Adı
Tel:
Adresi:
İstenen belgeler 1:
İstenen belgeler 2:
İstenen belgeler 3:
İstenen belgeler 4:
…..
….
….
Ödeme Yeri ve Zamanı:
…..
….
Bilimum değiştirilecek bölümler.
Sonra kullanıcı idari şartnameyi oluştur butona tıklayınca program kendi arayüzü içerisinde bu tip idari şartnameyi açıyor.Ve kullanıcının girdiği bilgiler o word sayfasında hangi sayfada hangi satıra yazılacaksa hepsi yerli yerine yazılmış oluyor.Kullanıcı bu idari şartnameyi program içinde düzenlyor.Wordun tüm menüleri buraya geliyor.Gerçi olayın bu aşaması çok ta önemli değil.yani MS Word aracılığı ile düzenlense de olur.Olay asıl generate aşamasında yani.
Acaba bu olayı hangi kontrolle yapabiliriz.
Bu acaba bir componentlemi yapılıyor.Yoksa XML ile falanmı yapılıyor.
Component ile ise component tavsiye edebilirmisiniz.?[/url]
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...

- Bu işlem için birden fazla metod mevcut. Ben size en rantable bulduğum çözümü önericem.

- MSWord dökümanlarında "Ekle" menüsü altındaki "Yer İmleri" seçeneğiyle gelen ekrandan akılda kalıcı başlıklar kullanarak, Metin üzerinde yer belirleyici gizli işaretler oluşturabilir, Delphi'den de direkt bu işaret edilen yere atlayıp gereken bilgiyi yazabilirsiniz. Ben TeklifSunulacakYer şeklinde isimlendirdim.

- Bahsi geçen WORD dökümanını açın, sonra da nokta nokta olan ilk yere mesela
a) Tekliflerin sunulacağı yer: .....................................................................................................
satırında iki nokta üst üste olan yerden sonra Delphi ile otomatik yazı ekleyeceğiniz yere gelin ve MSWord ana menüden "Ekle" / "Yer İşareti" seçince gelen ekrandan hatırlatıcı bir isim verin. Resimde görüleceği gibi bir işaret gelir. (Bu işaret görünmüyorsa Araçlar / Seçenekler menüsünden gelinden formdan GENEL sayfasındaki YER İŞARETLERİ onay kutusunu işaretlerseniz görünür.)

Resim

- Diğer alan başlıklarını da benzer şekilde imledikten sonra bu belgeyi delphi projenizden ulaşabileceğiniz şekilde kaydedip kapatın. Örneğimizde proje dizininde Teklif.DOC diyelim

- Projenizden aşağıdaki kod benzeri bir kurgu ile "TeklifSunulacakYer" imine konumlanıp bir şey yazılmasını sağlamak mümkündür.

Kod: Tümünü seç

Uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
Var
  R,
  YerimiAdi,
  Word,
  Doc   : OleVariant;
  Sayac : Integer;
begin
  Word := CreateOleObject('Word.Application');
  Word.Documents.Open(ExtractFilePath(Application.ExeName)+'teklif.doc');
  Doc := Word.ActiveDocument;
    YerimiAdi := 'TeklifSunulacakYer';
    if Doc.Bookmarks.Exists( YerimiAdi ) then
    begin
      R := Doc.Bookmarks.Item(YerimiAdi).Range;
      R.InsertAfter( 'Delphi Türkiye Forum' );
      R.Font.Color := clBlue;
    end;
  Word.Visible := True;
  Word         := UnAssigned;
end;
Hepsi bu bakar. Diğer türlü arama bulma değiştirme vs. işlemleri daha sancılı bir işlemdir.

Başarılar...
Resim
Resim ....Resim
danaci
Üye
Mesajlar: 178
Kayıt: 24 May 2005 01:45

Mesaj gönderen danaci »

mrmarman arkadaş,
söylediğiniz şekilde uygulama çok pratik. Ancak yer imi olarak işaretlediğimiz yerde .... şeklindeki harfleri de kaldırmak gerekecek. Bu .... ların üzerine yazdırma imkanı varmı acaba. Birde comobj kütüphanesinin diğer properties ve eventlarını nasıl inceleyebilirim. comobj libde r.insertafter diye bir procedure bulamadım.
iyi çalışmalar.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Noktalara ihtiyacın olduğunu düşünüyorsan, yani yazacak veri varsa aktarılsın yoksa boşluk değil nokta nokta olsun diyorsan noktaları kaldır ama Delphi Projenden veri yoksa sonradan ekle.

ComObj harici bir kütüphanedir. Sorduğun soru OleAutomation ile ilgili. ComObj ile bağlantı kurulan Word.Application'a ait.

Bu soruyu bana yöneltmekteki gayeni OleVariant tipinde atanmış R değişkeninin yanına nokta koyduğunda neden insertafter çıkmıyor şeklinde değerlendirdim. Kodu deneseydin hata olmaksızın sonuç aldığını görürdün.

Hemen komşu bir diğer başlıkta dediğim gibi burada da yineleyim. Yapmak istediğin her ne ise onu MSWord macro olarak kaydederek Macro Basic kodlarını elde et. Bu kodları rahatlıkla Delphi'ye dönüştürebilirsin.
Resim
Resim ....Resim
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

@mrmarman çok teşekkürler.En kısa zamanda deneyip sonucu yazacağım.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

fast report içindeki richeditle bunu dahada zahmetsiz çözmeniz mümkün. sadece ilgili yerlere vt den gelen alanları koyarsınız.

Öte yandan bunu kullanmak istemezseniz eğer mrmarmanın üstadın önerisi biçilmiş kaftandır.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
danaci
Üye
Mesajlar: 178
Kayıt: 24 May 2005 01:45

Mesaj gönderen danaci »

mrmarman arkadaş değiniz doğru.
yapmak istedğim şu idi.

Kurum adı: ............... şeklinde bir cümleye
Kurum adı: merkez bankası yazdırmak istiyorum diyelim. Ama merkez bankasını yazdırınca ..... ların kaybolması gerekecek. Aksi halde kullanıcı her defasında bu .... ları kaldırmak için uğraşacak
Yani bu .... ların üzerine yazdırabilirmiyiz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Word'de bunu elle nasıl yapardınız ? cevaba oradan başlamak lazım.

Ben olsam noktaları bildiğimiz noktalama işareti ile değil de TAB ayarlarından boşlukları otomatik nokta olarak doldurmak şeklide ayarlardım.

Şimdi MSWord kullanıcısı olarak bilginizi sınamak istemiyorum ama bilmeyenler vardır diye yazıyorum; yatay cetvel üzerinde mouse ile tıklamak suretiyle TAB boşlukları oluşturulabilmektedir. Daha sonra bu tablardan herhangi birisi üzerinde çift mouse tıklaması yapıldığında bu ayarların elle metrik rakamlar olarak görüntülendiği veya elle değişiklik yapılabildiği bir form karşınıza gelir. Bu her bir rakam bir TAB adımıdır ki, seçtiğiniz tab ile bir önceki arasında otomatik noktalarla doldurma özelliği verilebilmektedir.

Bu ayarlama index vb. yapımında konu başlıkları ile sayfa numaraları arasında gözle takip edilebilir bir hat oluşturmak için kullanılan bir özellik olmasının yanında burada yazı ile yazılan alanlardaki noktalar kendiliğinden yok olacak, geriye kalan yerler noktalı kalacaktır.

Bu tarif ettiğim özellik hakkında bilginiz yoksa araştırın olmadı yine resimlerle yardımcı olurum.
Resim
Resim ....Resim
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen ALUCARD »

konuya buradan devam edeceğim;

hocam yönteminiz için çok teşekkür ederim çok mantıklı. Allah'tan bi aksilik olmassa deneyeceğim.

yanlız merak ettiğim birşey daha var. ekte gönderdiğim word belgesini piyasada kullanılan bir ticari programdan aldım. içinde gri renkte işaretlenmiş bazı alanlar var. bunlar acaba ne ve acaba buralara nasıl veri gönderiliyor.
Dosya ekleri
319.zip
(24.84 KiB) 111 kere indirildi
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen mrmarman »

Verdiğin dökümanı inceledim. Orada da aynı verdiğim örnekteki gibi "YER İMLERİ" olarak isimlendirilmiş alanlar var.
Bu alanlara veri girmene bir engel yok, sadece başlıklar ve tablo şekillerine müdahale etmeden önce engel kilidini açman lazım. :idea:

Sana bir trük vereyim, WORD ile açtığın bu belgeyi SaveAs (Farklı Kaydet) ile XML dosyası formatında kaydet. Sonra bu XML içerisinden ffData olan başlıkları incele. Bunlar YER İMİ başlıkları. :bravo:

Ek Bilgi : Kilidi açmak için "enforcement" olan yerde "1" yazar bunu "0" yazıp kaydedersen ve WORD ile bu XML dosyasını açarsan edit edilebilir şekilde kilidi çözülmüş olacaktır. :idea:

Gönderdiğin dosyanın yer imlerinin isimlerini inceledim, Text1'den Text111'e kadar sıralı gidiyor.
Şimdi sıra sende deneyip sonucu buradan yorumla.

başarılar. :)
Resim
Resim ....Resim
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen ALUCARD »

mrmarman yazdı: Şimdi sıra sende deneyip sonucu buradan yorumla.
hocam ilginize çok teşekkür ediyorum. denemelerime bu akşam başlayacağım. ve mutlaka tecrubelerimi buradan paylaşacağım. :bravo:
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen ALUCARD »

bunla ilgili kucuk bir örnek hazırladım. gerçekten çok teşekkür ediyorum.

projeyi xe7 ile test ettim. sıkıntısız çalışıyor. şimdi bunu projeme ekliyorum
Dosya ekleri
WORD TEST.rar
(72.13 KiB) 132 kere indirildi
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen ALUCARD »

hocam şöyle bişey yapabilirmiyiz.

word dokumanını delphide açıp sürükle bırak yöntemi ile alan seçsek sonra oralara kesme oluşturabilirmiyiz.
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen mrmarman »

Clipboard operasyonlarını araştırabilirsin.
Resim
Resim ....Resim
asc
Üye
Mesajlar: 1
Kayıt: 08 Ara 2015 08:14

Re: Word belgesinin istenilen satırına bilgi yazmak.

Mesaj gönderen asc »

Yer imleri hazırlanmış Word Formunu/Belgesini doldurma örneği

procedure TFrmKisiler.SatinAlma(Sender: TObject);
var
Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y10,Y11,Y12,Y13,Y14,Y15,Y16,Y17,Y18,Y19,Y20, R,Word, Doc:OleVariant;

begin
Word := CreateOleObject('Word.Application');
Word.Documents.Add(GetCurrentDir+'\SAB.DOC'); //Yeni kopya oluşturur.
//Word.Documents.Open(GetCurrentDir+'\SAB.DOC'); Var olan belgeyi açar
Doc := Word.ActiveDocument;
Y0:='KAYITNO';
Y1:='ADISOYADI';
Y2:='TCKIMLIK';
Y3:='ADI';
Y4:='SOYADI';
Y5:='BABAADI';
Y6:='MESLEK';
Y7:='DYERI';
Y8:='DTARIHI';
Y9:='ADRES';
Y10:='ILI';
Y11:='ILCESI';
Y12:='KOYMAH';
Y13:='CILT';
Y14:='ASN';
Y15:='BSN';
Y16:='RTARIH';
Y17:='RSAYI';
Y18:='KAYMAKAM';
Y19:='MEMUR';
Y20:='AMIR';

if Doc.Bookmarks.Exists(Y0) then
begin
R := Doc.Bookmarks.Item(Y0).Range;
R.Text:=(tbRuhsatlarDSIRA.AsString);
end;
if Doc.Bookmarks.Exists(Y1) then
begin
R := Doc.Bookmarks.Item(Y1).Range;
R.Text:=(tbKimliklerADI.AsString+' '+tbKimliklerSOYADI.AsString);
end;
if Doc.Bookmarks.Exists(Y2) then
begin
R := Doc.Bookmarks.Item(Y2).Range;
R.Text:=(tbKimliklerTCKIMLIK.AsString);
end;
if Doc.Bookmarks.Exists(Y3) then
begin
R := Doc.Bookmarks.Item(Y3).Range;
R.Text:=(tbKimliklerADI.AsString);
end;
if Doc.Bookmarks.Exists(Y4) then
begin
R := Doc.Bookmarks.Item(Y4).Range;
R.Text:=(tbKimliklerSOYADI.AsString);
end;
if Doc.Bookmarks.Exists(Y5) then
begin
R := Doc.Bookmarks.Item(Y5).Range;
R.Text:=(tbKimliklerBABAADI.AsString);
end;
if Doc.Bookmarks.Exists(Y6) then
begin
R := Doc.Bookmarks.Item(Y6).Range;
R.Text:=(tbKimliklerMESLEK.AsString);
end;
if Doc.Bookmarks.Exists(Y7) then
begin
R := Doc.Bookmarks.Item(Y7).Range;
R.Text:=(tbKimliklerDYERI.AsString);
end;
if Doc.Bookmarks.Exists(Y8) then
begin
R := Doc.Bookmarks.Item(Y8).Range;
R.Text:=(tbKimliklerDTARIHI.AsString);
end;
if Doc.Bookmarks.Exists(Y9) then
begin
R := Doc.Bookmarks.Item(Y9).Range;
R.Text:=(Trim(tbKimliklerADRES.AsString));
end;
if Doc.Bookmarks.Exists(Y10) then
begin
R := Doc.Bookmarks.Item(Y10).Range;
R.Text:=(tbKimliklerILI.AsString);
end;
if Doc.Bookmarks.Exists(Y11) then
begin
R := Doc.Bookmarks.Item(Y11).Range;
R.Text:=(tbKimliklerILCESI.AsString);
end;
if Doc.Bookmarks.Exists(Y12) then
begin
R := Doc.Bookmarks.Item(Y12).Range;
R.Text:=(tbKimliklerKOYMAH.AsString);
end;
if Doc.Bookmarks.Exists(Y13) then
begin
R := Doc.Bookmarks.Item(Y13).Range;
R.Text:=(tbKimliklerCILT.AsString);
end;
if Doc.Bookmarks.Exists(Y14) then
begin
R := Doc.Bookmarks.Item(Y14).Range;
R.Text:=(tbKimliklerASN.AsString);
end;
if Doc.Bookmarks.Exists(Y15) then
begin
R := Doc.Bookmarks.Item(Y15).Range;
R.Text:=(tbKimliklerBSN.AsString);
end;
if Doc.Bookmarks.Exists(Y16) then
begin
R := Doc.Bookmarks.Item(Y16).Range;
R.Text:=(tbRuhsatlarVERTARIH.Text);
end;
if Doc.Bookmarks.Exists(Y17) then
begin
R := Doc.Bookmarks.Item(Y17).Range;
R.Text:=(tbRuhsatlarBELGENO.Text);
end;
if Doc.Bookmarks.Exists(Y18) then
begin
R := Doc.Bookmarks.Item(Y18).Range;
R.Text:=(Merkez.tbSabitlerMULKIAMIR.Text);
end;
if Doc.Bookmarks.Exists(Y19) then
begin
R := Doc.Bookmarks.Item(Y19).Range;
R.Text:=(Merkez.tbSabitlerMEMURPARAF.Text);
end;
if Doc.Bookmarks.Exists(Y20) then
begin
R := Doc.Bookmarks.Item(Y20).Range;
R.Text:=(Merkez.tbSabitlerAMIRPARAF.Text);
end;
Word.Visible := True;
Word := UnAssigned;
end;
Cevapla