1

Konu: Dosya yolunu textbox'ta göstermek

merhaba arkadaşlar,
formda bir textbox ve yanında 2 adet command button var. butonlardan birisine basınca dosya seçebileceğim ekranın çıkıp dosyamı seçebilmeyi ve tamam deyince seçtiğim dosyanın yolunun da textbox'ta görünmesini istiyorum.
mesela C://Fox/belge.pdf (uzantı .doc ta olabilir) gibi
ikinci butona basınca da yolu textbox'ta görülen dosyanın açılmasını istiyorum.
fox/samples/solutions daki örneklerde hep GETFİLE kullanılmış ama ben öyle yapınca dosyayı doğrudan açmaya çalışıyor doğal olarak
kısacası üstadlara şunu sormak istiyorum:
1. beceremediğim bu işi nasıl yaparım?
2. textboxtaki dosya yolunu .dbf tablosunda saklamam için ekstra birşeyler yapmam gerekir mi?

2 Son düzenleyen, cetinbasoz (08.09.2009 16:06:42)

Re: Dosya yolunu textbox'ta göstermek

Adim adim Anadolu:)

1) Gecici bir form yarat (saklamayacagiz). Modify Form xx [enter]
2) Forma sunlari koy:
Bir label ("Dosyayi Secin" filan gibi bir baslik)
Bir textbox (adini txtDosya yap)
Bir commandbutton (cmdDosya, caption: ...)
ve son olarak Microsoft Common Dialog Control (activex - kitap iconuna tiklayip cikanlardan sececeksin, eger henuz eklemediysen once menu "Tools\options\Controls"tan ekle.
3) 2 Commandbutton'dan cmdDosya'nin click kodunu yaz:

Visual Fox Pro
#define cdlOFNFileMustExist 0x1000

#define cdlOFNHideReadOnly  0x4
#define cdlOFNNoChangeDir 0x8
#define cdlOFNPathMustExist 0x800
with This.Parent.CommDlg
  .DialogTitle = this.Parent.lblSelect.Caption
  * Set flags
  .Flags = cdlOFNPathMustExist+cdlOFNHideReadOnly+cdlOFNNoChangeDir+iif(this.Parent.lSaveAs,0,cdlOFNFileMustExist)
  * Set filters
  .Filter = this.Parent.FilterList
  * Specify default filter
  .FilterIndex = this.Parent.FilterIndexPos
  .DefaultExt = this.Parent.DefaultExtension
  * Display the Open dialog box
  .ShowOpen
  if !empty(.Filename)
      this.Parent.txtDosya.Value = .filename
  endif
endwith

4) Bu kontrolleri istedigin gibi gorsel acidan duzenle.
5) Ucunu birden sec, menu 'File\Save as class". Bir class library ve class adi ver - ornegin class adi dosyaSec olsun.
6) O classa bazi propertyler ekle:

FilterList (filtreleyecegi dosyalar)
* Default degerini istewdigin gibi yaz benimki:
All Files (*.*)|*.*|Databases (*.dbc)|*.dbc|Tables (*.dbf)|*.dbf|Forms (*.scx)|*.scx|Classes (*.vcx)|*.vcx

FilterIndexPos (baslangicta secili olan filtre indexi)
Benimki: 3 (yani dbf'ler)

lSaveAs
Default .F. Bu .T. ise o zaman dosya olmak zorunda degil. Yeni dosyayi surada su isimle sakla cinsi secimler icin.


Su ana kadar yaptigin bir adet "dosya secim" kontrolunu class olarak yapmak oldu. Artik dosya sectirecegin her yerde bunu kullanabilirsin.

Simdi bunu kullanacagin yere koy (ister surukle birak, ister toolbardan sec ...). Calistirmakta kullanacagin CommandButton'i koy (dikkat et, calistiran butonu ayri tuttuk. Dosya secme cok kullanilan bir is ama o dosyanin calistirilmasi nadir, o yuzden class'in parcasi yapmadik. Bir alt class yapabiliriz ama bence gereksiz). Caption'ini yaz ve click koduna sunu koy:

Visual Fox Pro
local lcFileName

lcFileName = trim(thisform.dosyaSec1.txtDosya.Value)
if !empty(m.lcFileName) and file(m.lcFileName)
  declare long ShellExecute in "shell32.dll" ;
    long hwnd, string lpszOp, ;
    string lpszFile, string lpszParams, ;
        string lpszDir, long nShowCmd
 
  ShellExecute(0,'Open',m.lcFileName,0,0,1)
endif

Bu kadar.

3

Re: Dosya yolunu textbox'ta göstermek

Çetin hocam,
dediklerinizi aynen yaptım veya ben öyle sanıyorum.
ancak, cmdDosya'yı çalıştırınca hatalar verdi, ilk olarak
with This.Parent.CommDlg
satırında CommDlg'u bulamıyorum dedi, ben de microsoft common dialog'un ismini CommDlg yaptım, daha sonra çalıştırınca bu kez
.DialogTitle = this.Parent.lblSelect.Caption
satırında, ben de labelın ismini lblSelect yaptım ancak sonra
  .Flags = cdlOFNPathMustExist+cdlOFNHideReadOnly+cdlOFNNoChangeDir+iif(this.Parent.lSaveAs,0,cdlOFNFileMustExist)
satırında da aynı hatayı verdi, özetle this.parent'tan sonraki kontrolleri bulamıyor anladığım kadarıyla yahut ben birşeyleri yanlış yapıyorum derken
tabi ki yanlışımı fark ettim. anladığım kadarıyla ben class'a sizin dediğiniz properties ekleme işini becerememişim.Zira cmdDosya kodundan

* Set flags
  .Flags = cdlOFNPathMustExist+cdlOFNHideReadOnly+cdlOFNNoChangeDir+iif(this.Parent.lSaveAs,0,cdlOFNFileMustExist)
  * Set filters
  .Filter = this.Parent.FilterList
  * Specify default filter
  .FilterIndex = this.Parent.FilterIndexPos
  .DefaultExt = this.Parent.DefaultExtension
  * Display the Open dialog box

kısmını çıkarınca sorunsuz çalıştı, forma eklediğimde Çalıştır butonu da txtDosya'daki dosyayı çalıştırdı.

Sonuç olarak; class'a property ekleme işini beceremedim, kodun söylediğim yerlerini çıkarıp kullanmanın sakıncası var mı?

4 Son düzenleyen, cetinbasoz (08.09.2009 22:17:49)

Re: Dosya yolunu textbox'ta göstermek

Sakincasi olmamakla beraber o zaman class olmasinin esprisi de yok. Property eklemek kolay. Bir suru yolu var, enkolaylarindan birisi menuden "Class\New Property" secip oradan bir ya da daha fazla propertyi eklemek. Eninde sonunda bunu yapmayi ogrenmen lazim.

Not: Bu arada lblSelect filan konusunda haklisin, benim hatam. Kendi classimdan kodu kopyeledim, dikkatsiz bir sekilde yazmisim yapman gerekenleri.