DataLink olmaksızın seçilen datasetin alanlarını listeleme..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

DataLink olmaksızın seçilen datasetin alanlarını listeleme..

Mesaj gönderen aLonE CoDeR »

Selamlar.

Yazdığım bir bileşende DataLink nesnesi olmaksızın seçilen datasetin alanlarını listelemeye çalışıyorum ancak bunun için hangi sınıfı kullanmam gerektiği konusunda net bir çözüm bulamadım. Dataset nesnesinin alanlarını alma ve listeye doldurma konusunda herhangi bir problem yok sadece combo şeklinde listeleyerek bunu seçtireceğim sınıf konusunda önerilere ihtiyacım var.Şimdiden teşekkürler...
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Soruyu doğru anladığımı umarak;

TStringProperty property editörünü inherit edip yeni bi özellik editörü oluşturacaksınız.

Control(TControl) ve PropertyName(String) property'lerine sahip bi bileşenim vardı. PropertyName'in seçimi için yazdığım editör (içinde ait olduğu nesneye erişim, get-set vs. örnekleri olduğu için yazıyorum):

Kod: Tümünü seç

uses
  Classes, ucFilterSQLGenerator, DesignEditors, DesignIntf, TypInfo, Controls;

type
  TFSGFieldPropertyNameEditor = class(TStringProperty)
  private
    procedure GetPropertyList(var AList: TStringList);
  public
    procedure GetValues(Proc: TGetStrProc); override;
    procedure SetValue(const Value: string); override;

    function GetAttributes: TPropertyAttributes; override;
  end;

implementation

uses SysUtils;

function TFSGFieldPropertyNameEditor.GetAttributes: TPropertyAttributes;
begin
  Result := [paValueList, paSortList];
end;

procedure TFSGFieldPropertyNameEditor.GetPropertyList(
  var AList: TStringList);

  function GetPropTypeName(PropKind: TTypeKind): String;
  begin
    case PropKind of
      tkInteger, tkInt64 : Result := 'Int';
      tkChar, tkWChar    : Result := 'Char';
      tkFloat            : Result := 'Float';
      tkString, tkLString, tkWString : Result := 'Str';
    else
      Result := 'Unknown';
    end;//case-of
  end;//function

  var
    PropertyCount,
    i: Integer;
    PropList: PPropList;
    tmpControl: TControl;
begin
  AList.Clear;

  tmpControl := (GetComponent(0) as TFSGField).Control;

  PropertyCount := GetPropList(tmpControl, PropList);

  for i := 0 to Pred(PropertyCount) do
    if PropList^[i].PropType^.Kind in [tkInt64, tkWString, tkLString, tkWChar,
      tkString, tkFloat, tkChar, tkInteger] then
      AList.Add(PropList^[i].Name + ' (' + GetPropTypeName(PropList^[i].PropType^.Kind) + ')');

  tmpControl := nil;
end;

procedure TFSGFieldPropertyNameEditor.GetValues(Proc: TGetStrProc);
  var
    AList: TStringList;
    i: Integer;
begin
  AList := TStringList.Create;

  if not(Assigned((GetComponent(0) as TFSGField).Control)) then
  begin
    AList.Free;
    raise Exception.Create('Control Isn''t Assigned!');
  end;//if

  GetPropertyList(AList);
  with AList do
    for i := 0 to Pred(Count) do
      Proc(Strings[i]);

  AList.Free;
end;

procedure TFSGFieldPropertyNameEditor.SetValue(const Value: string);
  var
    PPos: Integer;
    AValue: String;
begin
  AValue := Value;
  PPos :=  Pos(' (', AValue);
  if PPos > 0 then
    Delete(AValue, PPos, Length(AValue));

  inherited SetValue(AValue);
end;

end.
Bunu register etmek için de bileşenleri kaydettiğiniz unit'de:

Kod: Tümünü seç

RegisterPropertyEditor(TypeInfo(string), TFSGField, 'PropertyName', TFSGFieldPropertyNameEditor);
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

İlgin için teşekkürler. Öncelikle bu propertyi design time kullanmam gerektiğinden pubhished bloğunda tanımlamam gerekli. Verdiğin örneğe benzer bir yapıyı değişik List alternatifleriyle kurgulayarak denemiştim ancak DataLinkte olduğu gibi stabil bir sonuca ulaşamadım. DataLink sınıfını incelediğimizde Persistent kullanıldığını görüyoruz ancak propertylere baktığımızda farklı noktalara dallanıyor konu...
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Tekrar bakma fırsatım oldu konuya, ancak hala stabil bir çözüm bulabilmiş değilim, DataLink nesnesini tüm detayıyla inceledim yine çözümleyemedim...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Alanlar listesi elde edeceksin ve DataLink kullanmak yok demişsin. Ben yapıyı incelemedim ama soruyu da sanırım tam anlayamadım. Bir DataSet alanlarını Fields özelliğinden elde etmek mümkün değil midir. Genelde alan listelerimi

Kod: Tümünü seç

LitBox1.Items.Clear;
for i:=0 to tbl.FieldCount-1 do LitBox1.Items.Add(tbl.Fields[i].FieldName);
şeklinde elde ederim.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

İlgin için teşekkürler. Alan listesini almak ya da ilgili list nesnesine doldurmakta zaten herhangi bir sorun yok sadece object inspectorda bu alanları seçtireceğim liste/combo sınıfını arıyorum. Örneğin bir DBEdit kullanıldığında DataField propertysine gelince eğer DataSet seçilmişse ilgili alanlar bir comboda listeleniyor ve oradan seçim yapılıyor. DBEdit ya da diğer veri bilinçli nesneler bunu DataLink sayesinde yapıyor yani ek bir kod yazmaya gerek kalmıyor DataLink gömüldüğünde. DataLink nesnesine baktığımızda ise temel sınıf TPersistent ve DataSource nesnesinde DataLink için bir TList sınıf tanımlanmış buraya ekleniyor vs.vs. Bense DataLink'le işim olmayacağı için bu alanları herhangi bir combo ya da muadili nesnede seçtirebilmek istiyorum ancak run time değil design time yani object inspectorda seçim yapılacak...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Marco Cantu'nun sanırım Delphi 7 kitabında bu konu ile ilgili bir anlatımı var. Çok zamanım yok ve bu konu ile uğraşmadım ama bir incele derim. 416. sayfada.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Tekrar teşekkürler ilgine, inceleyeceğim.
Cevapla