KeyLife富翁笔记 
作者: 轻舞肥羊
标题: DevExpress部分使用技巧(原创)
关键字: DevExpress,cxGrid
分类: 开发技巧
密级: 公开
(评分:★★★★ , 回复: 6, 阅读: 5204) »»
本文由 轻舞肥羊 发表于 大富翁论坛
转载请标明出处,谢谢

声明:以下代码请看懂再使用,本人水平有限,发现bug希望提出,让我们共同改进

2004-1-10 17:06:00   
 发表评语»»»

2004-1-10 17:08:06    1.扩展cxLookupComboBox,使其支持多列查询的cxLookupComboBoxEx//==============================================================================
// Unit Name: cxLookupComboBoxEx
// Author   : ysai
// Date     : 2003
// Purpose  : 扩展cxLookupComboBox,cxDBLookupComboBox,使其支持多列过滤
// History  :
//    2003-05-28大数据量改进
//    2003-07-07可操作性改进
//    2003-08-20效率改进
//    2003-08-29加入过滤延时
// 注意:
//     限制1,不能再使用Properties.OnChange事件
//     限制2,不能再使用Properties.ListSource.DataSet.OnFilterRecord事件
//     限制3,不能再使用Properties.ListSource.DataSet.Filtered属性
//     其它,最好在设计期设好一切属性,运行期再设置属性可能引发求知错误
//==============================================================================

unit cxLookupComboBoxEx;

interface

uses
  SysUtils, Classes, Controls, Windows, Messages,DB,StrUtils,
  cxControls, cxContainer, cxEdit, cxTextEdit,
  cxMaskEdit, cxDropDownEdit, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox;

type
  TcxLookupComboBoxEx = class(TcxLookupComboBox)
  private
    //保存要过滤的字段列表
    FFieldList  : TList;
    FFindText   : String;
   
    //过滤事件
    procedure _OnFilterRecord(DataSet: TDataSet; var Accept: Boolean);
    //编辑框文字改变事件
    procedure _OnChange(Sender : TObject);
    procedure GetFieldList;
    //延时过滤消息
    procedure WMTimer (var Message: TMessage); message WM_TIMER;
  protected
    //下拉表格收回时
    procedure CloseUp(AAccept: Boolean); override;
    //过滤过程
    procedure _FilterListSource;
    //初始化下拉表格事件
    procedure DoInitPopup; override;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    //更新要过滤的字段列表
    procedure UpdateFilterFields;
  published
  end;

TcxDBLookupComboBoxEx = class(TcxDBLookupComboBox)
  private
    //保存要过滤的字段列表
    FFieldList  : TList;
    FFindText   : String;

//过滤事件
    procedure _OnFilterRecord(DataSet: TDataSet; var Accept: Boolean);
    //编辑框文字改变事件
    procedure _OnChange(Sender : TObject);
    //取得要过滤的字段列表
    procedure GetFieldList;
    //延时过滤消息
    procedure WMTimer (var Message: TMessage); message WM_TIMER;
  protected
    //下拉表格收回时
    procedure CloseUp(AAccept: Boolean); override;
    //过滤过程
    procedure _FilterListSource;
    //初始化下拉表格事件
    procedure DoInitPopup; override;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    //更新要过滤的字段列表
    procedure UpdateFilterFields;
  published
  end;

procedure Register;

implementation

const
  UM_TIMER_FILTER = WM_USER + $101;             //自定义延时消息ID
  FILTERTIMER     = 500;                        //延时时间
  DROPDOWN_ROWS   = 12;

procedure Register;
begin
  RegisterComponents('Dev Express', [TcxLookupComboBoxEx,TcxDBLookupComboBoxEx]);
end;

{ TcxLookupComboBoxEx }

procedure TcxLookupComboBoxEx.CloseUp(AAccept: Boolean);
begin
  inherited;
  //收起下拉后取消过滤
  if  Assigned(Properties.ListSource) then
    if Assigned(Properties.ListSource.DataSet) then
      Properties.ListSource.DataSet.Filtered := False;
end;

constructor TcxLookupComboBoxEx.Create(AOwner: TComponent);
begin
  inherited;
  //默认值
  Properties.AutoSelect                 :=  False;
  Properties.DropDownAutoSize           :=  True;
  Properties.DropDownListStyle          :=  lsEditList;
  Properties.DropDownRows               :=  DROPDOWN_ROWS;
  Properties.DropDownSizeable           :=  True;
  Properties.IncrementalFiltering       :=  False;
  Properties.Revertable                 :=  True;
  Properties.OnChange                   :=  _OnChange;
  Properties.UseLeftAlignmentOnEditing  :=  False;
end;

destructor TcxLookupComboBoxEx.Destroy;
begin
  //释放过滤字段列表
  if Assigned(FFieldList) then FFieldList.Free;
  inherited;
end;

procedure TcxLookupComboBoxEx.DoInitPopup;
begin
  //取得过滤字段
  if  Assigned(Properties.ListSource) then
    if Assigned(Properties.ListSource.DataSet) then
    begin
      GetFieldList;
      Properties.ListSource.DataSet.Filtered := False;
    end;
  inherited DoInitPopup;
end;

procedure TcxLookupComboBoxEx._FilterListSource;
//过滤字段
begin
  if Assigned(Properties.ListSource)
      and Assigned(Properties.ListSource.DataSet) then
  try
    Properties.ListSource.DataSet.DisableControls;
    Properties.ListSource.DataSet.Filtered        :=  False;
    Properties.ListSource.DataSet.OnFilterRecord  :=  _OnFilterRecord;
    if Text <>  '' then
    begin
      FFindText :=  Text;
      if SelLength > 0 then
        FFindText :=  LeftStr(Text,SelStart);
      Properties.ListSource.DataSet.Filtered  :=  FFindText <> '';
    end;
    Changed;
  finally
    Properties.ListSource.DataSet.EnableControls;
  end;
end;

procedure TcxLookupComboBoxEx.GetFieldList;
//取得过滤字段列表
var
  i           : Integer;
  sFieldName  : String;
  fdTemp      : TField;
begin
  if not Assigned(FFieldList) then
  begin
    FFieldList  :=  TList.Create;
    for i:=0 to Properties.ListColumns.Count -1 do
    begin
      sFieldName := Properties.ListColumns.Items[i].FieldName;
      if sFieldName = '' then Continue;
      fdTemp  :=  Properties.ListSource.DataSet.FindField(sFieldName);
      if Assigned(fdTemp) then
        FFieldList.Add(Pointer(fdTemp));
    end;
  end;
end;

procedure TcxLookupComboBoxEx._OnChange(Sender: TObject);
//设置延时
begin
  if Focused and DroppedDown then
  begin
    KillTimer(Handle,UM_TIMER_FILTER);
    SetTimer(Handle,UM_TIMER_FILTER,FILTERTIMER,nil);
  end;
end;

procedure TcxLookupComboBoxEx._OnFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
//过滤事件
var
  s : String;
  i : Integer;
begin
  s :=  LowerCase(FFindText);
  if (s <> '') and (Properties.ListColumns.Count > 0) then
  begin
    Accept  :=  False;
    for i := 0 to FFieldList.Count -1 do
    begin
      Accept  :=  Pos(s,LowerCase(TField(FFieldList[i]).AsString))>0;
      if Accept then Exit;
    end;
  end
  else
    Accept  :=  True;
end;

procedure TcxLookupComboBoxEx.WMTimer(var Message: TMessage);
//延时更新消息
begin
  KillTimer(Handle,UM_TIMER_FILTER);
  if Focused and DroppedDown then _FilterListSource;
end;

procedure TcxLookupComboBoxEx.UpdateFilterFields;
//更新要过滤的字段列表
begin
  if Assigned(FFieldList) then
  begin
    FFieldList.Free;
    FFieldList  :=  nil;
  end;
  GetFieldList;
end;

{ TcxDBLookupComboBoxEx }

procedure TcxDBLookupComboBoxEx.CloseUp(AAccept: Boolean);
begin
  inherited;
  //收起下拉后取消过滤
  if  Assigned(Properties.ListSource) then
    if Assigned(Properties.ListSource.DataSet) then
      Properties.ListSource.DataSet.Filtered := False;
end;

constructor TcxDBLookupComboBoxEx.Create(AOwner: TComponent);
begin
  inherited;
  //默认值
  Properties.AutoSelect                 :=  False;
  Properties.DropDownListStyle          :=  lsEditList;
  Properties.DropDownRows               :=  DROPDOWN_ROWS;
  Properties.DropDownSizeable           :=  True;
  Properties.IncrementalFiltering       :=  False;
  Properties.Revertable                 :=  True;
  Properties.OnChange                   :=  _OnChange;
  Properties.UseLeftAlignmentOnEditing  :=  False;
end;

destructor TcxDBLookupComboBoxEx.Destroy;
begin
  //释放过滤字段列表
  if Assigned(FFieldList) then FFieldList.Free;
  inherited;
end;

procedure TcxDBLookupComboBoxEx.DoInitPopup;
begin
  //取得过滤字段
  if  Assigned(Properties.ListSource) then
    if Assigned(Properties.ListSource.DataSet) then
    begin
      GetFieldList;
      Properties.ListSource.DataSet.Filtered := False;
    end;
  inherited DoInitPopup;
end;

procedure TcxDBLookupComboBoxEx._FilterListSource;
//过滤字段
begin
  if Assigned(Properties.ListSource)
      and Assigned(Properties.ListSource.DataSet) then
  try
    Properties.ListSource.DataSet.DisableControls;
    Properties.ListSource.DataSet.Filtered        :=  False;
    Properties.ListSource.DataSet.OnFilterRecord  :=  _OnFilterRecord;
    if Text <>  '' then
    begin
      FFindText :=  Text;
      if SelLength > 0 then
        FFindText :=  LeftStr(Text,SelStart);
      Properties.ListSource.DataSet.Filtered  :=  FFindText <> '';
    end;
    Changed;
  finally
    Properties.ListSource.DataSet.EnableControls;
  end;
end;

procedure TcxDBLookupComboBoxEx.GetFieldList;
//取得过滤字段列表
var
  i           : Integer;
  sFieldName  : String;
  fdTemp      : TField;
begin
  if not Assigned(FFieldList) then
  begin
    FFieldList  :=  TList.Create;
    for i:=0 to Properties.ListColumns.Count -1 do
    begin
      sFieldName := Properties.ListColumns.Items[i].FieldName;
      if sFieldName = '' then Continue;
      fdTemp  :=  Properties.ListSource.DataSet.FindField(sFieldName);
      if Assigned(fdTemp) then
        FFieldList.Add(Pointer(fdTemp));
    end;
  end;
end;

procedure TcxDBLookupComboBoxEx._OnChange(Sender: TObject);
//设置延时
begin
  if Focused and DroppedDown then
  begin
    KillTimer(Handle,UM_TIMER_FILTER);
    SetTimer(Handle,UM_TIMER_FILTER,FILTERTIMER,nil);
  end;
end;

procedure TcxDBLookupComboBoxEx._OnFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
//过滤事件
var
  s : String;
  i : Integer;
begin
  s :=  LowerCase(FFindText);
  if (s <> '') and (Properties.ListColumns.Count > 0) then
  begin
    Accept  :=  False;
    for i := 0 to FFieldList.Count -1 do
    begin
      Accept  :=  Pos(s,LowerCase(TField(FFieldList[i]).AsString))>0;
      if Accept then Exit;
    end;
  end
  else
    Accept  :=  True;
end;

procedure TcxDBLookupComboBoxEx.WMTimer(var Message: TMessage);
//延时更新消息
begin
  KillTimer(Handle,UM_TIMER_FILTER);
  if Focused and DroppedDown then _FilterListSource;
end;

procedure TcxDBLookupComboBoxEx.UpdateFilterFields;
//更新要过滤的字段列表
begin
  if Assigned(FFieldList) then
  begin
    FFieldList.Free;
    FFieldList  :=  nil;
  end;
  GetFieldList;
end;

end.

2004-1-10 17:14:06    2.动态生成TcxGridDBTableView的列及页脚的合计栏var
  i   : Integer;
  cl  : TcxGridDBColumn;
begin
  Screen.Cursor :=  crHourGlass;
  cxtvMaster.BeginUpdate;
  try
    cxtvMaster.ClearItems;
    cxtvMaster.DataController.Summary.FooterSummaryItems.Clear;
    for i := 0 to cxtvMaster.DataController.DataSet.FieldCount - 1 do
    begin
      cl  :=  cxtvMaster.CreateColumn;
      cl.DataBinding.FieldName :=
          cxtvMaster.DataController.DataSet.Fields[i].FieldName;
      if cxtvMaster.DataController.DataSet.Fields[i] is TNumericField then
      begin
        TNumericField(cxtvMaster.DataController.DataSet.Fields[i])
            .DisplayFormat  :=  '#,##0.00';
        cl.Width := 80;
        with TcxGridDBTableSummaryItem(
            cxtvMaster.DataController.Summary.FooterSummaryItems.Add) do
        begin
          Column  :=  cl;
          FieldName :=  cl.DataBinding.FieldName;
          Format  :=  '#,##0.00';
          Kind  :=  skSum;
        end;
      end
      else if cxtvMaster.DataController.DataSet.Fields[i] is TStringField then
        cl.Width := 100
      else
        cl.Width := 80;
      cl.HeaderAlignmentHorz :=  taCenter;
    end;  //if
  finally
    cxtvMaster.EndUpdate;
    Screen.Cursor := crDefault;
  end;
end;

2004-1-10 17:24:32    3.动态生成TcxGridDBBandedTableView的列及页脚的合计栏如果存储过程或SQL返回如下结果集

员工     1月$  1月¥ 2月$ 2月¥ 合计$ 合计¥
-------------------------------------------
测试员A  200   1658  300  2487  500   4145

将生成如下样式的Grid(页脚没有画出,麻烦,另外设置了显示格式,金额将以#,##0.00的方式显示)
_________________________________________________
|  员工  |    1月     |    2月     |    合计    |
|-----------------------------------------------|
|  员工  |  $ |  ¥  |  $ |  ¥  |  $ |  ¥  |
|-----------------------------------------------|
|测试员A | 200 | 1658 | 300 | 2487 | 500 | 4145 |
-------------------------------------------------

var
  i     : Integer;
  cl    : TcxGridDBBandedColumn;
begin
  Screen.Cursor :=  crHourGlass;
  cxbtvMaster.BeginUpdate;
  try
    cxbtvMaster.ClearItems;
    cxbtvMaster.Bands.Clear;
    cxbtvMaster.DataController.Summary.FooterSummaryItems.Clear;
    for i := 0 to cxbtvMaster.DataController.DataSet.FieldCount - 1 do
    begin
      if i = 0 then
        with cxbtvMaster.Bands.Add do
        begin
          Options.HoldOwnColumnsOnly  :=  True;
          Caption  := cxbtvMaster.DataController.DataSet.Fields[i].FieldName;
        end;
      if RightStr(
          cxbtvMaster.DataController.DataSet.Fields[i].FieldName,
          1) = '$' then
        with cxbtvMaster.Bands.Add do
        begin
          Options.HoldOwnColumnsOnly  :=  True;
          Caption  := Copy(
              cxbtvMaster.DataController.DataSet.Fields[i].FieldName, 1,
              Length(cxbtvMaster.DataController.DataSet.Fields[i].FieldName)
              - 1);
          cxbtvMaster.DataController.DataSet.Fields[i].DisplayLabel :=  '$';
        end;
      if RightStr(
          cxbtvMaster.DataController.DataSet.Fields[i].FieldName,
          1) = '¥' then
        cxbtvMaster.DataController.DataSet.Fields[i].DisplayLabel :=  '¥';

cl  :=  cxbtvMaster.CreateColumn;
      cl.HeaderAlignmentHorz :=  taCenter;
      cl.Position.BandIndex :=  cxbtvMaster.Bands.Count - 1;
      cl.DataBinding.FieldName :=
          cxbtvMaster.DataController.DataSet.Fields[i].FieldName;
      if cxbtvMaster.DataController.DataSet.Fields[i] is TNumericField then
      begin
        TNumericField(cxbtvMaster.DataController.DataSet.Fields[i])
            .DisplayFormat  :=  '#,##0.00';
        cl.Width := 80;
        with TcxGridDBBandedTableSummaryItem(
            cxbtvMaster.DataController.Summary.FooterSummaryItems.Add) do
        begin
          Column  :=  cl;
          FieldName :=  cl.DataBinding.FieldName;
          Format  :=  '#,##0.00';
          Kind  :=  skSum;
        end;
      end
      else if cxbtvMaster.DataController.DataSet.Fields[i] is TStringField then
        cl.Width := 100
      else
        cl.Width := 80;
    end;  //if
  finally
    cxbtvMaster.EndUpdate;
    Screen.Cursor := crDefault;
  end;
end;

2004-1-31 22:36:25    4.自动调整列宽的方法要注意的地方可以用ApplyBestFit实现自动列宽;
不能在BeginUpdate和EndUpdate之间调用这个方法,否则会产生下标越界错误;
在BeginUpdate和EndUpdate中清除/建立列不会产生屏幕闪烁,其它需要长时间更新cxGrid数据的操作最好放在BeginUpdate和EndUpdate执行,并用try包起来.

2004-2-8 15:32:30    DevExpress Bar的动态菜单没有什么说明,细心点应该知道表结构及数据的内容形式
对比了一下代码,用dxBar比用ToolBar+PopupMenu生成动态菜单要简单,只用了一个递归过程

type
  //菜单项
  PMenuItemInfo = ^TMenuItemInfo;
  TMenuItemInfo = record
    ID            : string;
    ParentID      : string;
    Caption       : string;
    Hint          : string;
    LibraryName   : string;
    ProcedureName : string;
    wParam        : Integer;
    lParam        : Integer;
  end;

procedure TmgMainForm.BuildMenu;
//生成菜单

procedure SetMenuItemInfo(
      const ADataSet  : TDataSet;
      const AItem     : PMenuItemInfo
      );
  begin
    AItem.ID            :=  ADataSet.FieldByName('ID').AsString;
    AItem.ParentID      :=  ADataSet.FieldByName('ParentID').AsString;
    AItem.Caption       :=  ADataSet.FieldByName('Caption').AsString;
    AItem.Hint          :=  ADataSet.FieldByName('Hint').AsString;
    AItem.LibraryName   :=  ADataSet.FieldByName('LibraryName').AsString;
    AItem.ProcedureName :=  ADataSet.FieldByName('ProcedureName').AsString;
    AItem.wParam        :=  ADataSet.FieldByName('wParam').AsInteger;
    AItem.lParam        :=  ADataSet.FieldByName('lParam').AsInteger;
  end;

procedure CreateItemList(
      const ADataSet  : TDataSet;
      const AList     : TList;
      const AText     : string
      );
  //根据父节点建立子项目列表
  var
    m : PMenuItemInfo;
    i : Integer;
  begin
    ADataSet.First;
    for i := 0 to ADataSet.RecordCount - 1 do
    begin
      if ADataSet.FieldByName('ParentID').AsString = AText then
      begin
        New(m);
        SetMenuItemInfo(ADataSet,m);
        AList.Add(m);
        ADataSet.Delete;
      end else
        ADataSet.Next;
    end;  //for
  end;

procedure CreateMenuItems(
      const ADataSet    : TDataSet;
      const AKeyValue   : string;
      const AItemLinks  : TdxBarItemLinks;
      const AIndex      : Integer
      );
  //建立菜单项
  var
    db  : TdxBarButton;
    dbs : TdxBarSubItem;
    l   : TList;
    i   : Integer;
    j   : Integer;
    bg  : Boolean;
  begin
    bg  :=  False;
    j :=  AIndex;
    l :=  TList.Create;
    try
      CreateItemList(ADataSet, l, AKeyValue);
      for i := 0 to l.Count - 1 do
      begin
        if ADataSet.Locate('ParentID', PMenuItemInfo(l[i]).ID, []) then
        begin
          //有子项
          dbs         :=  TdxBarSubItem.Create(dxBar);
          dbs.Caption :=  PMenuItemInfo(l[i]).Caption;
          dbs.Hint    :=  PMenuItemInfo(l[i]).Hint;
          dbs.Tag     :=  Integer(l[i]);
          if AIndex > 0 then
            dbs.ImageIndex  :=  0;
          with AItemLinks.Add do
          begin
            Item        :=  dbs;
            Index       :=  j;
            BeginGroup  :=  bg;
          end;  //with
          bg          :=  False;
          CreateMenuItems(ADataSet, PMenuItemInfo(l[i]).ID, dbs.ItemLinks, 0);
          if dbs.ItemLinks.Count = 0 then
            dbs.Free
          else
            Inc(j);
        end
        else begin
          //无子项
          if not (PMenuItemInfo(l[i]).Caption = '-') then
          begin
            db          :=  TdxBarButton.Create(dxBar);
            db.Caption  :=  PMenuItemInfo(l[i]).Caption;
            db.Hint     :=  PMenuItemInfo(l[i]).Hint;
            db.Tag      :=  Integer(l[i]);
            db.OnClick  :=  MenuItemClick;
            if AIndex > 0 then
              db.ImageIndex :=  0;
            with AItemLinks.Add do
            begin
              Item        :=  db;
              Index       :=  j;
              BeginGroup  :=  bg;
            end;
            bg          :=  False;
            Inc(j);
          end
          else begin
            bg  :=  True;
          end;  //if bg
        end;  //if  Locate
      end;  //for
    finally
      l.Free;
    end;
  end;

var
  rsMenus : TDataSet;
begin
  rsMenus :=  mgDMMain.GetMenus;  //取得数据集
  if Assigned(rsMenus) then
  try
    CreateMenuItems(rsMenus, '', dxBar.Bars[0].ItemLinks, 1);
    //一定要刷新一下,否则不更改样式会出错
    dxBar.Bars[0].ItemLinks[0].Visible  :=  False;
    dxBar.Bars[0].ItemLinks[0].Visible  :=  True;
  finally
    rsMenus.Free;
  end;
end;

2005-1-4 16:34:35    取得TcxLookupComboBox下拉列表中各项的内容Properties.DataController.Values包含了所有内容,如果要取得当前选择行的内容,用以下代码
//cmb:TcxLookupComboBox;
  with cmb.Properties.DataController do
    ShowMessage(Values[FindRecordIndexByKey(cmb.EditValue),0]);
//0代表显示的第一列,以Properties.ListColumns为准,可以从这个集合中查找对应的字段名

转载于:https://www.cnblogs.com/DKSoft/articles/508175.html

DevExpress部分使用技巧(转存) -- 轻舞肥羊相关推荐

  1. DevExpress TreeListLookupEdit常用技巧

    DevExpress TreeListLookupEdit常用技巧 //设定为CheckBox可用 this.treeListLookUpEdit1.Properties.TreeList.Optio ...

  2. 苏宁智慧零售2018: 大象轻舞,一动千钧 | 一点财经

    "2018年过去了,我很怀念它." 2018是一个分裂与转折的年份:开年的是抖音.智慧零售.AI,人人争着抢滩新机遇:年中,消费升级还是降级,争论不休:下半年,凛冬来袭,减速的减速 ...

  3. 指尖轻舞桌面:Slide On Desk - 更新日志

    [DJun作品] 指尖轻舞 是一款将桌面管理功能统一集中.结合便捷的任务管理切换功能的Android手机桌面软件,简约界面,运行流畅迅速,为您提供更实用.更方便.更舒适的桌面功能. 支持Android ...

  4. 指尖轻舞桌面:Slide On Desk

    [DJun作品] 指尖轻舞 是一款将桌面管理功能统一集中.结合便捷的任务管理切换功能的Android手机桌面软件,简约界面,运行流畅迅速,为您提供更实用.更方便.更舒适的桌面功能. 支持Android ...

  5. 指尖轻舞桌面:Slide On Desk - 在线使用指引

    [DJun作品] 指尖轻舞 是一款将桌面管理功能统一集中.结合便捷的任务管理切换功能的Android手机桌面软件,简约界面,运行流畅迅速,为您提供更实用.更方便.更舒适的桌面功能. 支持Android ...

  6. 指尖轻舞桌面:Slide On Desk - 更多功能与独特体验

    [DJun作品] 指尖轻舞 是一款将桌面管理功能统一集中.结合便捷的任务管理切换功能的Android手机桌面软件,简约界面,运行流畅迅速,为您提供更实用.更方便.更舒适的桌面功能. 支持Android ...

  7. 指尖轻舞桌面:Slide On Desk - 基本功能与操作方法

    [DJun作品] 指尖轻舞 是一款将桌面管理功能统一集中.结合便捷的任务管理切换功能的Android手机桌面软件,简约界面,运行流畅迅速,为您提供更实用.更方便.更舒适的桌面功能. 支持Android ...

  8. 与大漠飞狐,轻舞的雨丝交流

    大漠飞狐,轻舞的雨丝: 我们专门开辟的交流的地方.以后,你们有什么需要,就留言在这里,我会尽快回复的. 我是属于信奉"捡钱包"投资哲学的.没有超人的能力,比较愚笨.股市坚守多年,没 ...

  9. 一生莫轻舞,一舞一生苦

    JavaScript 在js中定义一个函数. 1 function func_name(){ 2 alert('func_name'); 3 } 在写每行js语句的最后,一定要加分号";&q ...

最新文章

  1. 用乐观的心态去面对生活,能让你的生活过得更加快乐
  2. C#创建和调用DLL
  3. Regularized Evolution for Image Classifier Architecture Search--阅读笔记
  4. 嵌入式系统功能需求分析_超市监控系统的功能作用分析
  5. 软件性能测试与LoadRunner实战可以在网上和书店买到了
  6. 工业控制中无线局域网应用前景分析
  7. Java中的迭代与递归
  8. 数据库设计方法学概述
  9. UI实用素材|登录和个人资料界面模板
  10. 机器学习中的两个概率模型
  11. inflect java_关于Platinum库的MediaRender具体C++代码实现探讨
  12. 普通电视盒子安装绑定迅雷远程下载,实测成功
  13. PWM、PPM、SBUS、DSM2这四种协议区别
  14. 英飞凌XC2000系列单片机FLASH加解密策略
  15. 单元测试,我有话说(No tests to run. No tests were executed)
  16. 用计算机播放cd,电脑上怎么放光盘_播放CD的方法步骤
  17. android 那个桌面好,Hola桌面 可能是最好用的安卓手机桌面
  18. 啦啦啦一棵R语言圣诞树~
  19. java 图片合成 工具类_Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】...
  20. 云计算和大数据时代网络技术揭秘(十三)VXLAN

热门文章

  1. Linux环境下Kafka的下载配置和运行
  2. 如何判断是手机端还是PC端?
  3. linux stp 缺省状态,STP状态
  4. 为企业上云号脉,听听这些ISV如何说?
  5. 多人共享EXCEL文件使用
  6. PMP认证需要多少钱?
  7. 怎么将CAD图纸旋转角度后查看
  8. 【Git版本控制】——保姆级教程
  9. Python插值法(3)————hermite插值多项式(拉格朗日型)
  10. 第三十三篇,网络编程TCP协议通讯过程实现和函数接口