file save ederken tspeedbutton nasil kullanilabilir

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kazimates
Üye
Mesajlar: 332
Kayıt: 01 Tem 2005 12:40
Konum: Kıbrıs
İletişim:

file save ederken tspeedbutton nasil kullanilabilir

Mesaj gönderen kazimates »

merhabalar,
bir stringgridde buyuk bir verim var ve bunu en son savedialog componenti ile dosyaya excel olarak save ediyorum. Fakat excel dosyasi yaratilip ici doldurulurken bayagi bir bekleme surem oluyor. buda bazen beni acaba sistemde bir kilitlenme mi oldu sorusuna goturuyor. Oysa zaman alan bir is. Bu zaman alan save etme esnasinda %sukadari bitti gibi bir component varmi. sanirim tspeedbutton bu is icin ama bu butonu bu tip bir ornekde nasil kullanirim. buna uygun bir kod varmi veya bu ornegi yapan bir site ornegi biliyormusunuz.

simdiden tesekkur ederim...
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: file save ederken tspeedbutton nasil kullanilabilir

Mesaj gönderen conari »

tspeedbutton bu işe yaramaz en azından ben öyle biliyorum.

3. parti Savedialoglarda işlem hacmi ve kayıt durumunu gösterenler olabilir.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: file save ederken tspeedbutton nasil kullanilabilir

Mesaj gönderen aslangeri »

s.a.
bunun için hazır bir bileşen yok. kendiniz yapacaksınız.
forma bir panel içinede bir progressbar (veya gauge) koy.
excele aktarma işlemi başladığı zaman progres barın max valuesini strgingridin satır sayısını ata. her satır işleminden sonrada progress ini bir arttır.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
kazimates
Üye
Mesajlar: 332
Kayıt: 01 Tem 2005 12:40
Konum: Kıbrıs
İletişim:

Re: file save ederken tspeedbutton nasil kullanilabilir

Mesaj gönderen kazimates »

peki bu durumda forumda bir panel1 ve uzerinde progressbar1 olusturdum. ama bunu asagida ki kodlarda cagiramiyorum sebep ise ben excele sg2 stringgridini doldururken bunu function cagirarak yapmistim. sayet function icerisinde bir yerde progressbar1.max demeye calistigim anda zaten delphi bana bunu function icerisinde tanimlayamadigindan oturu hata veriyor. bunu sizce nasil duzeltebilirim?

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
   savedlg1.Execute();
   panel1.Visible:=True;
   Progressbar1.Visible:=True;
   If SaveAsExcelFile(sg2,savedlg1.FileName) then
      ShowMessage('StringGrid saved!');
end;

Kod: Tümünü seç

  //to excel
function SaveAsExcelFile(StringGrid: TStringGrid; FileName: string):boolean;
const
   xlWBATWorksheet = -4167;
var
   Row, Col: integer;
   GridPrevFile: string;
   XLApp, Sheet: OLEVariant;
begin
   Result := false;
   XLApp := CreateOleObject('Excel.Application');
   try
      XLApp.Visible := False;
      XLApp.Workbooks.Add(xlWBatWorkSheet);
      Sheet := XLApp.Workbooks[1].WorkSheets[1];
      Sheet.Name := 'My Sheet Name';
      for col := 0 to StringGrid.ColCount - 1 do
         for row := 0 to StringGrid.RowCount - 1 do
            Sheet.Cells[row + 1,col + 1] := StringGrid.Cells[col, row];
         try
         XLApp.Workbooks[1].SaveAs(FileName);
         Result := True;
      except
      // Error ?
      end;
      finally
      if not VarIsEmpty(XLApp) then
      begin
         XLApp.DisplayAlerts := False;
         XLApp.Quit;
         XLAPP := Unassigned;
         Sheet := Unassigned;
      end;
   end;
end;

  // finished to excell
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: file save ederken tspeedbutton nasil kullanilabilir

Mesaj gönderen unicorn64 »

SaveAsExcelFile fonksiyonunun tanımını TForm1 içinde yaparsanız form1de bulunan nesnelere fonksiyondan erişebilirsiniz...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: file save ederken tspeedbutton nasil kullanilabilir

Mesaj gönderen csunguray »

İşin sırrı Application.ProcessMessages komutunda. Siz bir döngü içerisinde işi yaptırırken program windows mesajlarına yani mouse tıklaması, görüntüsü değişen progressbar ın görüntüsünün güncellenmesi gibi eyemlere cevap vermeyi durdurur. Kuyrukta biriken mesajlara cevap vermesi için Application.ProcessMessages komutunu kullanmanız gerekir. Şimdi kodumuzu biraz gözden geçirelim.

Kod: Tümünü seç

  //to excel
//Öncelikle SaveAsExcelFile fonksiyonu Form1'in bir methodu olmalı. Aynı başlığı Form1 in 
// private bölüme eklemeyi unutmayın. Veya otomaik eklenmesini istiyorsanız SaveAsExcelFile
// in başına Form1. ekledikten sonra Ctrl + Shift + C tuşlarına basın. 
function Form1.SaveAsExcelFile(StringGrid: TStringGrid; FileName: string):
  boolean;
const
  xlWBATWorksheet = -4167;
var
  Row, Col: integer;
  GridPrevFile: string;
  XLApp, Sheet: OLEVariant;
begin
  if Tag = 1 then // Zaten işlem içindeysek ve tuşa 2. kez basıldıysa.
  begin
    Tag = 0;
    Exit;
  end;
  Tag := 1; // işlemin içindeyiz.

  Result := false;
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := False;
    XLApp.Workbooks.Add(xlWBatWorkSheet);
    Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet.Name := 'My Sheet Name';
    for col := 0 to StringGrid.ColCount - 1 do
    begin
      for row := 0 to StringGrid.RowCount - 1 do
      begin
        Sheet.Cells[row + 1, col + 1] := StringGrid.Cells[col, row];
        // Bu komutu program donmasın mouse a cevap versn diye koyoyoruz.
        Application.ProcessMessages;
      end;
      // Butona 2. kez basılmış ve bunun sonucunda işlem
      // durdurulmuşsa döngüyü durdur.
      if Tag = 0 then Break;
    end;
    try
      if Tag = 0 then // yapılabilir veya yapılmayabilir.
      XLApp.Workbooks[1].SaveAs(FileName);
      Result := True;
    except
      // Error ?
    end;
  finally
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
    end;
  end;
  Tag := 0; // işlemin bitti.
end;

  // finished to excell
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Cevapla