![]() |
|
|
#1
|
|||
|
|||
|
Есть такой класс
Код:
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
|
|||
|
|||
|
Все разобрался, все работает. Всем спасибо за помощь.
![]() |