![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Требуется помощь в изменении компонента. [D7, Win2k]
Константин Рязанкин © (2004-08-09 21:11:00)Доброго времени суток.
Есть такой компонент:
unit BitBtnSelect;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Buttons,Dialogs,Select_book,ADODB,DB,DBCtrls;
type
TBitBtnSelect = class(TBitBtn)
private
FSelect:TF_Select;
FCaption:TCaption;
Fado:TADOConnection;
FTableSelect:string;
FKeyField:string;
FValueField:string;
procedure SetFormField(Value:TWinControl);
procedure SetCaption(Value:TCaption);
procedure SetADO(Value:TADOConnection);
procedure SetTableSelect(Value:string);
procedure SetKeyField(Value:string);
procedure SetValueField(Value:string);
public
constructor Create(AOwner: TComponent); override;
published
property AdoConnection:TADOConnection read Fado write SetAdo;
property TableSelect:string read FTableSelect write SetTableSelect;
property KeyField :string read FKeyField write SetKeyField;
property ValueField :string read FValueField write SetValueField;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('My Component', [TBitBtnSelect]);
end;
constructor TBitBtnSelect.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FAdo:=nil;
Caption:='';
FCaption:='';
FTableSelect:='';
FKeyField:='';
FValueField:='';
end;
procedure TBitBtnSelect.SetADO(Value:TADOConnection);
begin
if Value <> FADO then
begin
FAdo := Value;
Invalidate;
end;
end;
procedure TBitBtnSelect.SetTableSelect(Value:string);
begin
FTableSelect := Value;
end;
procedure TBitBtnSelect.SetKeyField(Value:string);
begin
FKeyField := Value;
end;
procedure TBitBtnSelect.SetValueField(Value:string);
begin
FValueField := Value;
end;
end.
Хотелось TableSelect не вводить ручками, а выбирать из списка, полученного из RecordSet:
rc:=Fado.Execute('select name from sysobjects')
Юрий Зотов (2004-08-10 19:39:00) [1]Наследуйтесь от TStringProperty. И исправьте GetAttributes:
Result := inherited GetAttributes + [paValueList]
Константин Рязанкин (2004-08-10 10:43:00) [2]Юрий Зотов © (10.08.04 10:11) [3]
Получилось следующее:
type
TTSPropED=class(TPropertyEditor)
public
procedure GetValues(proc:TGetStrProc); override;
function GetAttributes:TPropertyAttributes; override;
end;
function TTSPropED.GetAttributes:TPropertyAttributes;
begin
Result:=[paValueList];
end;
procedure TTSPropED.GetValues(proc:TGetStrProc);
var
dd:TADOConnection;
cc:_Recordset;
sql:string;
begin
dd:=TSpdBtnSelect(GetComponent(0)).AdoConnection;
if dd <> nil then
begin
sql:='select name from sysobjects';
cc:=dd.Execute(sql);
ShowMessage('select yes');
while not cc.EOF do
begin
proc(cc.Fields['name'].Value);
cc.MoveNext;
end;
cc:=nil;
end;
end;
TSpdBtnSelect = class(TSpeedButton)
private
...
FTableSelect:TStringList;
...
procedure SetTableSelect(Value:TStringList);
published
property TableSelect:TStringList read FTableSelect write SetTableSelect;
...
Список получен, но выбранное значение не отображется в свойстве TableSelect
Sandman25 (2004-08-10 10:21:00) [3]Константин Рязанкин
Очень рекомендую писать const перед описанием формальных параметров типа String.
Юрий Зотов (2004-08-10 10:11:00) [4]TBitBtnSelect(GetComponent(0)).AdoConnection
Константин Рязанкин (2004-08-10 10:03:00) [5]Юрий Зотов © (10.08.04 09:27) [1]
Писать редактор свойства пробовал. Проблема в том, что у меня не получается из ф-ции GetValues достучаться до Fado.
Юрий Зотов (2004-08-10 09:27:00) [6]1. Из всех методов нужен только SetADO. Остальные (включая конструктор) ничего не делают и их можно совершенно спокойно убрать.
2. В SetAdo не хватает FreeNotification, а еще требуется замещение Notification. Иначе после удаления компонента, на который ссылается поле FADO будете получать Access Violation.
2. По сабжу - нужно написать редактор свойства. Отнаследуйте его от TStringProperty, заместите методы GetAttributes и GetValues. Подробности см. в справке по TPropertyEditor и в коде модуля DesignEditors.