DataLink olmaksızın seçilen datasetin alanlarını listeleme..
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
DataLink olmaksızın seçilen datasetin alanlarını listeleme..
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...
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...
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):
Bunu register etmek için de bileşenleri kaydettiğiniz unit'de:
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.
Kod: Tümünü seç
RegisterPropertyEditor(TypeInfo(string), TFSGField, 'PropertyName', TFSGFieldPropertyNameEditor);
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
İ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...
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
- sabanakman
- Kıdemli Üye
- Mesajlar: 3077
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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şeklinde elde ederim.
Kod: Tümünü seç
LitBox1.Items.Clear;
for i:=0 to tbl.FieldCount-1 do LitBox1.Items.Add(tbl.Fields[i].FieldName);
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
İ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...
- sabanakman
- Kıdemli Üye
- Mesajlar: 3077
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08