Delphi编程技巧总汇--------[持续更新]

s11ss 2014-02-06 01:23:59
加精
眼瞅马年伊始,Delphi版块门可罗雀,新贴寥寥无几,鄙人又闲来无事,故发此贴来攒点人气!
鄙人才疏学浅,难免会有不严谨甚至错误之处,还望各路英豪海涵并指正!也欢迎各位贤良之才高谈阔论,发表高见!闲言少叙,鄙人就一马当先,抛砖引玉了:

加入一句{$R WindowsXP},控件具有系统主题风格。



ps:
鄙人近日为生计所困,虽不至于衣不蔽体、穷困潦倒,但也算是菲食薄衣了,哪位爱心人士心怀慈悲,见鄙人还有点用,让鄙人有偿改个bug或做个模块啥的,鄙人定当竭尽所能、全力以赴、感激涕零!BTW, 版主大人大人有大量,别把帖给删了,别烧了我的救命稻草!
...全文
17387 9 收藏 211
写回复
211 条回复
s11ss 2016年09月12日
直接用Result当循环变量:
function TStrings.IndexOf(const S: string): Integer;
begin
  for Result := 0 to GetCount - 1 do
    if CompareStrings(Get(Result), S) = 0 then Exit;
  Result := -1;
end;
回复 点赞
卷壳鹦鹉螺 2016年08月12日
以前从来没在这里发过贴,现在给楼主顶一下吧。
回复 点赞
qq_32953509 2016年08月11日
鄙人新人!请教如何才能入门。。
回复 点赞
qqq4246995 2016年08月09日
爱好者支持一下,学习了!
回复 点赞
acridin 2016年07月28日
感觉自己好孤陋寡闻
回复 点赞
hanlinsuile 2016年05月11日
楼主,请帮忙看下。 function TfrmProjCompletedScore.AllOverTreeList( node: TcxTreeListNode): TcxTreeListNode; var BNode: TcxTreeListNode; begin while node<>nil do begin if node.HasChildren then begin node := node.getFirstChild; AllOverTreeList(node); if node.Parent <> nil then node := node.Parent; end else begin if ((Node.Values[tlWBSProjectName.ItemIndex] = NULL) or (Node.Values[tlWBSProjectName.ItemIndex] = '')) then begin BNode := node.Parent; node.Delete; node := BNode; AllOverTreeList(node); end; end; if node.getNextSibling <> nil then node := node.getNextSibling else Exit; end; end; procedure TfrmProjCompletedScore.cxButton1Click(Sender: TObject); var ANode : TcxTreeListNode; begin inherited; with tlWBS.DataController.DataSource.DataSet do try tlWBS.BeginUpdate; DisableControls; // Anode := tlWBS.FocusedNode; Anode := tlWBS.TopNode; AllOverTreeList(ANode); finally tlWBS.EndUpdate; EnableControls; end; end; 这样遍历删除,出现stack overflow,该如何解决呢?。
回复 点赞
ttbook001 2016年04月29日
回复 点赞
xiaocongzhi 2016年04月27日
回复 点赞
Hannibal 2016年04月26日
新人,先支持下,收藏了慢慢消化。
回复 点赞
cwarr 2016年04月23日
新人啊,好多看不懂,能不能发些实现某结果的帖子啊?比如,第一个帖子,很明确要达到什么目的,其他很多就不明白了。。。
回复 点赞
qq_34625643 2016年04月11日
我也来一个不是技巧,无技术含量的. 假如定义了 TTestObject = class(TInterfacedObject, IA) 类,当我们想用Supports检测是否支持IA接口时,那么会导致TestObject被释放,例如像下面的代码


  IA = interface
    ['{1B989234-AA9B-4EB3-B8D0-82596979EC7C}']
    procedure Say;
  end;

  TTestObject = class(TInterfacedObject, IA)
  public
    procedure Say;
  end;


procedure TForm1.Button1Click(Sender: TObject);
var
  TestObject: TTestObject;
  A: IA;
begin
  TestObject := TTestObject.Create;
  //A := TestObject as IA;
  //A<>nil then
  //  A.Say;
  if Supports(TestObject, IA, A) then
    A.Say;
end;
这样的代码会导致TestObjec被自动 释放。 假如TestObject 是在其它地方创建的,就会导致出现问题。 下面代码是我改造后的代码

  IA = interface
    ['{1B989234-AA9B-4EB3-B8D0-82596979EC7C}']
    procedure Say;
  end;

  TTestObject = class(TInterfacedObject, IA)
  private
    FAIntf: IA;   //主要是为了增加计数
  public
    constructor Create;
    destructor Destroy; override;
    procedure Say;
    procedure FreeEx;  //新加的释放方法 
  end;


procedure TForm1.Button1Click(Sender: TObject);
var
  TestObject: TTestObject;
  A: IA;
begin
  TestObject := TTestObject.Create;
  A := TestObject as IA;
  A.Say;
  TestObject.FreeEx;
end;

constructor TTestObject.Create;
begin
  inherited Create;
  FAIntf := Self;  //增加一行代码
end;

destructor TTestObject.Destroy;
begin
  ShowMessage('TTestobject.Destroy');
  inherited;
end;

procedure TTestObject.FreeEx;
begin
  FAIntf := nil;
end;

procedure TTestObject.Say;
begin
  ShowMessage('test');
end;
这样就避免从TComponent继承了。
回复 点赞
NetG 2016年04月11日
继续更新啊,楼主
回复 点赞
jjpweb 2016年04月11日
这一定要Mark一下
回复 点赞
qq_28931259 2016年04月08日
学习了
回复 点赞
Playmaster 2016年04月08日
确实受益匪浅~~,特有钻研精神的人才能注意到这些。
回复 点赞
Sean丶quan 2016年04月05日
受益匪浅~~
回复 点赞
qq_33817577 2016年02月19日
引用 67 楼 s11ss 的回复:
以前刚学c语言的时候,看到交换I,J的值,是通过一个临时变量。虽然当时学的时候明白了,但在实践中很容易弄糊涂。如果用两个临时变量,会不会交换得更自然点: var I,J,I2,J2: Integer; begin I2 := I; J2 := J; I := J2; J := I2 end;
还可以不用临时变量:

var
 I,J:Integer;
begin
  I := I xor J;
  J := I xor J;
  I := I xor J;
end;
回复 点赞
苏生米沿 2016年01月10日
顶顶顶。。。delphi现在还这么多人使用啊
回复 点赞
叔叔不骗你 2016年01月08日
还有多少做delphi 的?
回复 点赞
qq_17732857 2016年01月01日
大神怎么能迫于生计,想赚钱,加我微信331906526
回复 点赞
发动态
发帖子
语言基础/算法/系统设计
创建于2007-08-02

3418

社区成员

3.3w+

社区内容

Delphi 语言基础/算法/系统设计
社区公告
暂无公告