Delphi 随记

1 DBGRIDEH的下拉列分三种情况:
1.添加下拉列,但不捆绑数据集,在PickList添加,PickList本身是个TSTRINGS,直接用ADD方法就可以了,不过只在PickList里添加,在实际输入的时候可以与输入的不符,也就是输入的字符可能不在下拉列表中,解决这个问题则必须用KEYLIST属性,与PickList一样,它也是TSTRINGS类型,它当中设置的值则为必选,我常将PickList和KeyList设置为一样的,这样输入的内容则必须为列表中的候选项。还有一个我自己总结的一点,数据库用SQL SERVER时,这样的列不要用CHAR类型的,否则会有显示不出来的情况(除非候选字符你你数据的字符数相同)
2.与数据集绑定,这个很简单,只要将该字段设置为查询字段就可以了,下拉列表会自己出来,这样的设置和DBGRIDEH本身无关,不需要在DBGRIEH另外设置。
3.在列下拉的时候显示GRID,你需要将改列设置为查询字段,并在列的COLUMN属性中添加列(列LISTSOURCE属性上边的那个属性),并要注意DROPDOWNWITH(建议设置为-1),DROPDOWNSIZE(TRUE),DROPDOWNTITLE(TRUE)的设置。
其实DBGRIDEH的奥妙还很多,要好好挖掘,可惜现在实在找不到好的介绍,希望大家一起探讨交流。

2 自定义线程类

type
  TMyThread = class(TThread)
  fzid:string;
  protected 
    procedure Execute; override;
    constructor Create(id:string);
  end;


constructor TMyThread.Create(id:string );
begin
 inherited Create(True);  //True  线程创建后等待Resume指令 再执行
 self.fzid:=id; //外界参数
end;

procedure TMyThread.Execute;
var 
  i: Integer; 
begin 
  FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}

  with TQuery.Create(nil) do
  try

    application.MessageBox(pchar(self.fzid),'系统提示',0);
  finally
    Free;
  end;

end;

执行

MyThread := TMyThread.Create('1');
MyThread.Resume;

3 线程同步

  类似于锁的功能

3.1 声明线程共享变量和临界区

//声明临界区和共享变量
//一定要注意声明的位置,不是在类中定义,而是在Form.pas 的implementation 之下区域
//此区域为公共区域,在Form.pas中定义的线程都可以访问

implementation
      uses commvalue;
var
CS:TRTLCriticalSection; //临界区 (线程同步 相当于互斥锁)
threadNum:integer;  //当前线程数,相当于信号量

3.2

InitializeCriticalSection(CS); //初始化临界区 
DeleteCriticalSection(CS); //删除临界区 
//初始化+删除 只要操作一次即可

EnterCriticalSection(CS); //进入临界区
threadNum:=threadNum-1;   //释放资源
LeaveCriticalSection(CS);//离开临界区

猜你喜欢

转载自blog.csdn.net/shanchahua123456/article/details/85236233