cxgrid ayarların kayıt edilmesi ve yüklenmesi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

cxgrid ayarların kayıt edilmesi ve yüklenmesi

Mesaj gönderen akdatilla »

s.a.
Arkadaşlar birkaç yıl önce cxgrid kullanıyor ve grid içerisindeki kolon bilgilerini diske kayıt edip yükleme işlemlerini yapabiliyordum.
Bir süre cxgrid kullanmama kararı verip daha sade listelerle çalıştım. Şimdi detaylı listelere ihtiyacım olduğu için tekra cxgrid
kullanım yoluna başvurdum. Tabi daha yeni bir versiyonu tercih ettim(6.24). Ancak şimdi daha önce kullandığım kayıt tekniğiyle kolon bilgilerini tam olarak kayıt edemedim. Kolonların alan adı, görünen adı gibi önemli özellikleri dosyaya yazılmıyor.
Kodlardan ilgili bilgi bazı bölümleri aşağıda veriyorum:

Çalışma zamanında kolon oluşturan kod bloğu:

Kod: Tümünü seç

if (fcxGrid.ActiveView as TcxGridDBTableView).ColumnCount<gci then
                         cxnc:=(fcxGrid.ActiveView as TcxGridDBTableView).CreateColumn else
                         cxnc:=(fcxGrid.ActiveView as TcxGridDBTableView).Columns[gci-1];
                         with cxnc do
                         Begin
                              Name:=fgrdn+'Item'+Inttostr(j);
                              if FColumns.Items[j].DisplayField='' then
                              DataBinding.FieldName:=FColumns.Items[j].ColField Else
                              DataBinding.FieldName:=FColumns.Items[j].DisplayField;
                              Alignment:=FColumns.Items[j].Alignment;
                              HeaderAlignmentHorz:=FColumns.Items[j].HAlignment;
                              Width:=FColumns.Items[j].Width;
                              Visible:=FColumns.Items[j].visible;
                         End;
                         titlecap:='';
                         if (FColumns.Items[j].ColLangWord<>'') and Assigned(FASCGetLangWord) then
                              titlecap:=FASCGetLangWord(FColumns.Items[j].ColLangWord);
                         if titlecap='' then
                         begin
                              if FColumns.Items[j].ColumnTitle='' then
                              begin
                                   titlecap:=nc.FieldName;
                              end else
                              titlecap:=FColumns.Items[j].ColumnTitle;
                         end;
                         FColumns.Items[j].ColumnTitle:=titlecap;
                         if FColumns.Items[j].Order=1 Then sbstr:='(>)'
                         Else if FColumns.Items[j].Order=2 Then sbstr:='(<)' Else sbstr:='';
                         cxnc.Caption:=titlecap+sbstr;
Kayıt ve Çağırma kodları:

Kod: Tümünü seç

function TASCcxGrid.SaveColumns:Boolean;
Begin
     Result:=False;
     Try
        if GridListName<>'' then
        Begin
             if (Self.ActiveView is TcxGridDBTableView) Then
             Begin
                  (Self.ActiveView as TcxGridDBTableView).StoreToIniFile(
                  ASCListFilePath+GridListName+ASCcxGridExtension,True,
                  [gsoUseFilter,gsoUseSummary],GetObjName(GridListName+'Lst'));
                  Result:=True;
             end;
        end;
     Except
        Result:=False;
     end;
end;

function TASCcxGrid.LoadColumns:Boolean;
Begin
     Result:=False;
     Try
        if GridListName<>'' then
        Begin
             if (Self.ActiveView is TcxGridDBTableView) Then
             Begin
                  if FileExists(ASCListFilePath+GridListName+ASCcxGridExtension) then
                  Begin
                       (Self.ActiveView as TcxGridDBTableView).RestoreFromIniFile(
                       ASCListFilePath+GridListName+ASCcxGridExtension,True,True,
                       [gsoUseFilter,gsoUseSummary],GetObjName(GridListName+'Lst'));

                       Result:=True;
                  end;
             end;
        end;
     Except
        Result:=False;
     end;
end;
Kodlarımda eksiklik ya da hata bulan, önerisi olan arkadaşlar yazarsa sevinirim.
Teşekkür ederim.
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: cxgrid ayarların kayıt edilmesi ve yüklenmesi

Mesaj gönderen akdatilla »

Cxgrid kullanan, Hayırsever bir programcı bu işi ben şöyle yapıyorum diye yazmadığı için en azından 1 gün boyunca bu işi çözmeye çalıştım.
En sonunda şu değişiklikleri yaparak TcxGridDBTableView nesnesinin neredeyse tamamını dosyalara kaydetme
işlemini yaptım. Geri yüklemede de sorun olmadı. Ancak bütün özellikleri dosyaya yazdığı için dosya boyutları eskisine göre çok fazla oldu.
Aynı sorunla karşılaşan arkadaşlar bu değişikliği yapmadan önce mutlaka farklı yöntemler kullanmayı da denesinler.
Daha kolay bir çözüm üreten arkadaşlar yazarsa yine faydalı olacaktır.

Kod: Tümünü seç


/////////////////////////////////update1
unit cxGridDBTableView;

  TcxGridDBColumn = class(TcxGridColumn)
  private
    function GetStoredProperties(AProperties: TStrings): Boolean; override;
    ....
   end;


function TcxGridDBColumn.GetStoredProperties(AProperties: TStrings): Boolean;
begin
  with AProperties do
  begin
    Add('Caption');
  end;
  Result := inherited GetStoredProperties(AProperties);
end;
////////////////////////////////end update1

/////////////////////////////////update2
unit cxGridCustomView;

procedure TcxCustomGridView.StoreToIniFile(const AStorageName: string; AReCreate: Boolean;
  AOptions: TcxGridStorageOptions; const ASaveViewName: string);
var
  AStorage: TcxStorage;
begin
  FStoringName := ASaveViewName;
  AStorage := TcxStorage.Create(AStorageName);
  try
    FStorageOptions := AOptions;
    if ASaveViewName = '' then
      AStorage.NamePrefix := Owner.Name;
    AStorage.ReCreate := AReCreate;


    AStorage.Modes:=[smChildrenCreating,smSavePublishedClassProperties];//******


    AStorage.StoreToIni(Self);
  finally
    AStorage.Free;
  end;
end;
procedure TcxCustomGridView.RestoreFromIniFile(const AStorageName: string;
  AChildrenCreating, AChildrenDeleting: Boolean; AOptions: TcxGridStorageOptions;
  const ARestoreViewName: string);
var
  AStorage: TcxStorage;
  AModes: TcxStorageModes;
begin
  FStoringName := ARestoreViewName;
  AStorage := TcxStorage.Create(AStorageName);
  try
    if not IsStoringNameMode then
      AStorage.NamePrefix := Owner.Name;
    FStorageOptions := AOptions;


    AModes:=[smSavePublishedClassProperties];///*****


    if AChildrenCreating then
      Include(AModes, smChildrenCreating);
    if AChildrenDeleting then
      Include(AModes, smChildrenDeleting);
    AStorage.Modes := AModes;
    BeginUpdate;
    try
      IsRestoring := True;
      try
        AStorage.RestoreFromIni(Self);
      finally
        IsRestoring := False;
      end;
    finally
      EndUpdate;
    end;
  finally
    AStorage.Free;
  end;
end;
////////////////////////////////end update2



/////////////////////////////////update3
unit cxStorage;

procedure TcxStorage.InternalStoreTo(AWriter: TcxCustomWriter; const ADefaultObjectName: string);
Var
.....
begin
  if ADefaultObjectName='DataSource' Then exit;

...........
........
..........
end;
////////////////////////////////end update3
En son akdatilla tarafından 26 Tem 2008 11:30 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: cxgrid ayarların kayıt edilmesi ve yüklenmesi

Mesaj gönderen akdatilla »

Geri yükleme işlemini yapmadan önce gridde bulunan kolonları silmek gerekli (RestoreFromIniFile komutundan önce)

Kod: Tümünü seç

                       for j := (Self.ActiveView as TcxGridDBTableView).ColumnCount - 1 downto 0 do
                       (Self.ActiveView as TcxGridDBTableView).Columns[j].Free;
a_self_lion
Üye
Mesajlar: 93
Kayıt: 01 Eki 2008 07:04

Re: cxgrid ayarların kayıt edilmesi ve yüklenmesi

Mesaj gönderen a_self_lion »

sayın hocam bu şekilde yapsak olmaz mı bunun nesi kötü Yani fikrinizi almak istedim;


// bu kullanıcı adına göre kaydediyor
cxgrid1dbtableview1.StoreToIniFile('c:\'+ kullanici +'.ini');


// cxgrid in kullanıcı adına göre geri yüklüyor.
cxgrid1dbtableview1.RestoreFromIniFile('c:\'+ kullanici +'.ini');
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: cxgrid ayarların kayıt edilmesi ve yüklenmesi

Mesaj gönderen akdatilla »

Yazdıklarımı okursanız daha önce ben de aynı şekilde kullanıyordum. Ancak kullandığım son cxgrid paketinde istediğim bazı bilgiler kayıt edilmiyordu.
Sizin kullandığınız cxgrid'in kayıt ve yukleme fonksiyonları işinizi görüyorsa hiçbir değişiklik yapmayın.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: cxgrid ayarların kayıt edilmesi ve yüklenmesi

Mesaj gönderen Lost Soul »

akdatilla yazdı:Cxgrid kullanan, Hayırsever bir programcı bu işi ben şöyle yapıyorum diye yazmadığı için...
cxgrid ücretli bir program takdir edersiniz ki herkeste olmayabiliyor. Yoksa bu forumdakiler pek bir hayırseverdir :)
Cevapla