|
#1
|
|||
|
|||
TStringList
Есть такой класс
Код:
unit FillComboClass; interface uses SysUtils, DBCtrlsEh,FIBDatabase, pFIBDatabase,FIBDataSet,pFIBDataSet,Classes; Type TFillCombo = class(TObject) Private fset: TpFIBDataSet; citem: TStringList; fieldname: String; Protected Procedure Setfset(Val: TpFIBDataSet); Procedure Setfieldname(Val: String); Public // Constructor Create(DataSet: TpFIBDataSet; FieldName: string); // Конструктор Constructor Create; // Конструктор Destructor Destroy;// Деструктор Property DataSe: TpFIBDataSet write Setfset; // Свойство класса Property FieldNam: String write Setfieldname; // Свойство класса function fill(Val:TStringList):TStringList; end; implementation uses DMUnit; //constructor TFillCombo.Create(DataSet: TpFIBDataSet; item: TDBComboBoxEh; FieldName: string); //constructor TFillCombo.Create(DataSet: TpFIBDataSet; FieldName: string); constructor TFillCombo.Create; begin citem:=TStringList.Create; end; destructor TFillCombo.Destroy; begin inherited; end; function TFillCombo.fill(Val:TStringList):TStringList; begin fset.First; while not fset.Eof do begin citem.add(fset.FieldByName(fieldname).AsString); fset.Next; end; result := citem; citem.Free; end; procedure TFillCombo.Setfieldname(Val: String); begin fieldname:=val; end; procedure TFillCombo.Setfset(Val: TpFIBDataSet); begin fset :=TpFIBDataSet.Create(nil); fset:=Val; end; end. в этом кусочке Код:
citem.add(fset.FieldByName(fieldname).AsString); у меня Delphi 2009. |
#2
|
||||
|
||||
1. Я не увидел вызова вашей процедуры Fill, поэтому трудно сказать в чем проблема.
2. Вот тут вы чего-то мудрите: Код:
procedure TFillCombo.Setfset(Val: TpFIBDataSet); begin fset :=TpFIBDataSet.Create(nil); fset:=Val; end; При такой реализации смысла в этой процедуре нет никакого. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
//Создаем клас описанный выше
ob := TFillCombo.Create; //Здесь передаем датасет ob.DataSe:=dm.SetSprCom; //здесь поле таблици из которой значениями //надо заполнить сомбобох ob.FieldNam:='SPR_VALUE'; //сам методо про который и разговор ob.fill(t); //здесь заполняем item комбобокса ComboGroupNomen.Items.Assign(t); |
#4
|
||||
|
||||
Судя по коду процедуры fill ваша переменная t просто нигде там не используется.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
да нет просто не доконца написал
вот полный вызов Код:
procedure TAddNomenGroupForm.ComboGrNomUnitButtonDown(Sender: TObject; TopButton: Boolean; var AutoRepeat, Handled: Boolean); var ob:TFillCombo; t:TStringList; begin t:=TStringList.Create; //Заполняем ComboBox dm.SetSprCom.Active:=true; // ob.Create(dm.SetSprCom,'SPR_VALUE'); ob := TFillCombo.Create; ob.DataSe:=dm.SetSprCom; ob.FieldNam:='SPR_VALUE'; ob.fill(t); ComboGroupNomen.Items.Assign(t); // ComboGroupNomen.Items:=t; //ComboGroupNomen.Items.AddStrings(t); end; там можно было сделать так и без t Код:
ob.fill(ComboGroupNomen.Items); проблема в самом методе fill |
#6
|
|||
|
|||
А зачем в Вашем методе fill вот такая строчка: citem.Free; ?
Вероятно она должна быть в деструкторе Destroy... Последний раз редактировалось roamer, 07.11.2010 в 02:14. |
#7
|
||||
|
||||
По-моему дело вот в чём:
Код:
function TFillCombo.fill(Val:TStringList):TStringList; Код:
result := citem; Код:
ob.fill(t); |
#8
|
||||
|
||||
Собственно об этом я и написал ранее, но видимо автор темы не понял подсказки.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
|||
|
|||
Код:
procedure TMainForm.JvXPBar1Items1Click(Sender: TObject); var t:tstringlist; begin t:=tstringlist.Create; t.Add('fffff'); end; Все понятно в посте выше, это дело оптимизации. Спасибо конечно. Но дело не в том. Даже в коде выше в t не пишется 'fffff'. в tstringlist не добовляются строчки, вот в этом проблема. Может быть дело в том что в D2009 появился Юникод и теперь как нибудь по другому надо? |
#10
|
|||
|
|||
Все разобрался, все работает. Всем спасибо за помощь.
|