Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

Помогите написать компонент с 2 полями TDataField   Найти похожие ветки 

 
denissoft ©   (2005-10-12 13:00) [0]

Написал компонент для базы данных в котором два поля
Наследник от TcomboBox
В котором
1) property DataField: string    read GetDataField   write SetDataField;
property DataSource: TDataSource read GetDataSource  write SetDataSource;

2) property DataItemField: string    read GetDataField   write SetDataField;
 property DataItemSource: TDataSource read GetDataSource  write SetDataSource;
Для первого список с именами полей БД есть а для второго нету, в чем причина?
Во втором случаи надо вводить имя поля руками, неудобно все таки.


 
denissoft ©   (2005-10-12 13:08) [1]

unit DBcomItemEdit;

interface

uses
 Windows, Messages, SysUtils, Classes, Controls, StdCtrls, DbcomboBoxEdit,db,adodb,DBCtrls;

type
 TDBcomItemEdit = class(TDbcomboBoxEdit)
 private
 FDataLink: TFieldDataLink;
 FTexT:string;
 Fid:string;
 procedure DataChange( Sender: TObject );
 procedure UpdateData( Sender: TObject );
 Function TextToId:String;
 Function GetTextFromId:String;

   { Private declarations }
 protected
 procedure Change; override;
 function GetComboText: string;
 function GetDataField: string;
 procedure SetDataField( const Value: string );
 function GetDataSource: TDataSource;
 procedure SetDataSource( Value: TDataSource );
 procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
 procedure CMExit(var Message: TCMExit); message CM_EXIT;
 procedure SetComboText( const Value: string );
 { Protected declarations }
 public
 destructor Destroy; override;
 constructor Create( AOwner: TComponent ); override;
   { Public declarations }
 published
  property DataItemField: string    read GetDataField   write SetDataField;
  property DataItemSource: TDataSource read GetDataSource  write SetDataSource;
  property ID:string read Fid write Fid;

   { Published declarations }
 end;

procedure Register;

implementation
Function TDBcomItemEdit.TextToId:String;
begin
  DataItemSource.DataSet.Filter:=DataItemField+" = "+#39+text+#39;
  DataItemSource.DataSet.Filtered:=true;
  FText:=DataItemSource.DataSet.FieldByName(Fid).AsString;
  result:=Ftext;
  if DataItemSource.DataSet.RecordCount = 0  then begin
  DataItemSource.DataSet.Append;
  DataItemSource.DataSet.FieldByName(DataItemField).AsString:=text;
  DataItemSource.DataSet.Post;
  FText:=DataItemSource.DataSet.FieldByName(Fid).AsString;
  result:=Ftext;
  end;
  DataItemSource.DataSet.Filtered:=false;
end;
procedure TDBcomItemEdit.CMExit(var Message: TCMExit);
begin
 try
   FDataLink.UpdateRecord;
 except
   SetFocus;
   raise;
 end;
 inherited;
end;

destructor TDBcomItemEdit.Destroy;
begin

 FDataLink.Free;
 FDataLink := nil;
 inherited Destroy;
end;

Function TDBcomItemEdit.GetTextFromId:String;
begin
result:="";
if DataItemSource<>nil then
if DataItemSource.DataSet<>nil then begin
if DataSource.dataset.FieldByName(DataField).AsString<>"" then begin
  DataItemSource.DataSet.Filter:=Fid+"= "+#39+   DataSource.dataset.FieldByName(DataField).AsString+#39;
  DataItemSource.DataSet.Filtered:=true;
  if not DataItemSource.DataSet.Active then
  DataItemSource.DataSet.Active:=true;
  if DataItemSource.DataSet.Active then begin
  text:=DataItemSource.DataSet.Name;
  Text:=DataItemSource.DataSet.FieldByName(DataItemField).AsString;
  result:=text;
  DataItemSource.DataSet.Filtered:=false;
  end;
  end;
  end;
end;

procedure TDBcomItemEdit.Change;
begin
 FDataLink.Edit;
 inherited Change;
 FDataLink.Modified;
end;

Function TDBcomItemEdit.GetComboText: string;
begin
   Result := Text
end;
procedure TDBcomItemEdit.DataChange( Sender: TObject );
begin

 if not ( Style = csSimple ) and DroppedDown then
   Exit;
 if DataLink<>nil then
 if DataLink.Field <> nil then
   SetComboText( GetTextFromId )
 else
   if csDesigning in ComponentState then
     SetComboText( Name )
   else
     SetComboText( "" );

end;
procedure TDBcomItemEdit.SetComboText( const Value: string );
var
 I: Integer;
 Redraw: Boolean;
begin
 if Value <> GetComboText then
 begin
   if Style <> csDropDown then
   begin
     Redraw := ( Style <> csSimple ) and HandleAllocated;
     if Redraw then
       SendMessage( Handle, wm_SetRedraw, 0, 0 );
     try
       if Value = "" then
         I := -1
       else
         I := Items.IndexOf( Value );
       ItemIndex := I;
     finally
       if Redraw then
       begin
         SendMessage( Handle, wm_SetRedraw, 1, 0 );
         Invalidate;
       end;
     end;

     if I >= 0 then
       Exit;
   end;
   if Style in [ csDropDown, csSimple ] then
     Text := Value;
 end;
end;
procedure TDBcomItemEdit.CMEnter(var Message: TCMEnter);
var x:integer;
 TBL:TADOQuery;
begin
if FDataLink.DataSource<>nil then  begin
try
begin

  if FDataLink.DataSource.DataSet.ClassType =ADODB.TADOTable then begin
  try

  TBL:=TADOQuery.Create(nil);
  if TADOTable(FDataLink.DataSource.DataSet).Connection<>nil then
  tbl.Connection:=TADOTable(FDataLink.DataSource.DataSet).Connection
  else
  tbl.ConnectionString:= TADOTable(FDataLink.DataSource.DataSet).ConnectionString;
  TBL.SQL.Clear;
     TBL.SQL.add("Select "+GetDataField);
  TBL.SQL.add("From "+TADOTable(FDataLink.DataSource.DataSet).TableName);
  TBL.SQL.add("GROUP BY "+GetDataField+";");

  tbl.Active:=true;

  tbl.Filter:=FDataLink.DataSource.DataSet.Filter;
  tbl.Filtered:=FDataLink.DataSource.DataSet.Filtered;
  items.Clear;
   if tbl.Active = true then
for x:=1 to tbl.RecordCount do begin
   tbl.RecNo:=x;

   items.Add(tbl.FieldByName(GetDataField).AsString);
  end;

  finally
  TBL.Free;

  end;

  end;
end;
finally

end;
end;
end;

function TDBcomItemEdit.GetDataField: string;
begin
 Result := FDataLink.FieldName;
end;
procedure TDBcomItemEdit.SetDataField( const Value: string );
begin

 FDataLink.FieldName := Value;
end;

function TDBcomItemEdit.GetDataSource: TDataSource;
begin
 Result := FDataLink.DataSource;
end;
procedure TDBcomItemEdit.SetDataSource( Value: TDataSource );
begin
 if not ( FDataLink.DataSourceFixed and ( csLoading in ComponentState ) ) then
 begin
   FDataLink.DataSource := Value;
   if Value <> nil then
     Value.FreeNotification( Self );
      if DataLink<>nil then
 if DataLink.Field <> nil then
   SetComboText( GetTextFromId );

 end;
end;

constructor TDBcomItemEdit.Create( AOwner: TComponent );
begin
 inherited Create( AOwner );
 ControlStyle := ControlStyle + [ csReplicatable, csSetCaption ];
 FDataLink := TFieldDataLink.Create;
 FDataLink.Control := Self;
if DataLink<>nil then begin
 DataLink.OnDataChange := DataChange;
 DataLink.OnUpdateData := UpdateData;
end;

end;
procedure TDBcomItemEdit.UpdateData( Sender: TObject );
begin
if DataLink<>nil then
 DataLink.Field.Text := TextToId;
end;

procedure Register;
begin
 RegisterComponents("Data Controls", [TDBcomItemEdit]);
end;

end.


 
Юрий Зотов ©   (2005-10-12 14:06) [2]

> Для первого список с именами полей БД есть а для второго нету,
> в чем причина?

В том, что редактор свойства TDataFieldProperty в VCL регистрируется для свойств с именем DataField и ни с каким другим. Вот выдержка из DBReg.pas:

RegisterPropertyEditor(TypeInfo(string), TComponent, "DataField", TDataFieldProperty);

Естественно, к свойству с другим именем (DataItemField) редактор не подключается и выпадающего списка полей нет. А чтобы он подключился и список появился, добавьте в Вашу процедуру регистрации строку:

RegisterPropertyEditor(TypeInfo(string), TDBcomItemEdit, "DataItemField", TDataFieldProperty);

И не забудьте подключить в Uses модуль DBReg.


 
denissoft ©   (2005-10-12 16:51) [3]

Спасибо за информацию про RegisterPropertyEditor(TypeInfo(string), TComponent, "DataField", TDataFieldProperty);

В вот модуля я вот эти взял/
DBReg,DesignIntf, DesignEditors
http://community.borland.com/article/0,1410,27717,00.html



Страницы: 1 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
4-1137766863
Atheist
2006-01-20 17:21
2006.04.09
WM_GETTEXT окну чужого процесса


2-1143116539
Nsk3D
2006-03-23 15:22
2006.04.09
Оформление функции в длл


2-1143537268
Mozgan
2006-03-28 13:14
2006.04.09
Работа со шрифтами


2-1143449951
Daria
2006-03-27 12:59
2006.04.09
Delphi+Excel


2-1143099245
Der Nechk@ssoff
2006-03-23 10:34
2006.04.09
ЗагрузкаDLL