我的一个学VC朋友说学Delphi的人都是些不爱动脑子的人, 只会装控件, 没有运算能力, 他出了道题目, 我做不来(0分)

  • 主题发起人 主题发起人 xhyph
  • 开始时间 开始时间
X

xhyph

Unregistered / Unconfirmed
GUEST, unregistred user!
题目很简单
有两个TTreeView

要求把两个TTreeView合并,
比方说
treevew1是
1
11
111
2
22
222
3
33

treeview2是
4
44
444
1
55
6

合并后必须是
1
11
111
55
2
22
222
3
33
4
44
444
6

也就是说treeview1和treeview2共有的话,就不能在新的treeview 重复

我是做不出来,,让他笑话了一阵子,
不知道这里的高手是否象我同学说的那样,没有运算能力
 
很难吗?
将Treeview1作为合并后的数,
针对Treeview2的每一个结点,在TreeView1中查找,找不到就添加,
只要记住保持相同的父结点就行了。
 
To Delphi:
说说都容易,请写出代码
 
Delphi 控件也没有做这个的。如果哪个控件做这个,请告知,我也下载一份。
 
老大,这也叫问题,编程语言千变万化,算法是万变不离其中
只要算法过硬,使什么样的语言是一样的
请你那位vc的哥们儿,用vc来一套漂亮的界面,ok?对了还是别让他用控件作啦
 
最好去看一下关于数据结构的书
 
VC是不错,可是一辈子什么也做不出来那还有什么意思?
开发语言各有个自的优点,只要用的好就行。
 
2个函数解决问题(效率比较低)
function 是否在tree1当中(接点):boolean;
begin
if no then
insert;
end;
for (tree2.every接点)
{
是否在tree1当中;
哈哈,这也叫数据结构,看过解决寻找2叉树的最短路径和最快查询,这才是基本的数据结构!
不要丢东西!
}
 
他只不过是茴字有几种写法的那种感觉!
任何一种语言的都是工具,如果不能产生效益或需要太大的难度,那还有何意义!
 
因为改了几处,所以比较乱,用你的例子检验了一下,还可以,不知道其他情况如何。
procedure AddNodes(ds: TTreeNodes; src, dest: TTreeNode);
var
a, s: TTreeNode;
begin
s := src.GetFirstChild;
while s <> nil do begin
a := ds.AddChild(dest, s.Text);
AddNodes(ds, s, a);
s := src.GetNextChild(s);
end;
end;

procedure UnionNode(ss, ds: TTreeNodes; src, dest: TTreeNode);
var
s, d, a: TTreeNode;
begin
if src <> nil then
s := src.getFirstChild
else
s := ss.GetFirstNode;
while s <> nil do begin
if dest <> nil then
d := dest.getFirstChild
else
d := ds.GetFirstNode;
while d <> nil do begin
if s.Text = d.Text then begin
UnionNode(ss, ds, s, d);
Break;
end;
d := dest.GetNextChild(d);
end;
if d = nil then begin
a := ds.AddChild(dest, s.Text);
AddNodes(ds, s, a);
end;
s := src.GetNextChild(s);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
UnionNode(TreeView2.Items, TreeView1.Items, nil, nil);
end;
 
以下代码在Windows2000+D5下运行通过!
强调一点,算法和语言没什么联系,各种语言都有各自的优点,希望楼主的朋友不要门缝里看人!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
TV1: TTreeView;
TV2: TTreeView;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
function ChkTreeItem(iLevel: integer; sTxt: string; TV: TTreeView): boolean;
procedure AddTreeItem(PNode: TTreeNode; sTxt: string; TV: TTreeView);
function CheckSite(const Str, Ch: string;
var Mystring: TStrings): boolean;
function GetNode(iLevel: integer; PTxt: string; TV: TTreeView): TTreeNode;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1 : TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
CNode, aNode : TTreeNode;
i : integer;
sNTxt, sPTxt, sStr: string;
slStr, slTmp : TStrings;
begin
slStr := TStringList.Create;
slTmp := TStringList.Create;
for i := 0 to TV2.Items.Count - 1 do
begin
CNode := TV2.Items;
//检测在TV1中是否有TV2中的节点?
if not ChkTreeItem(CNode.Level, CNode.Text, TV1) then
begin
sNTxt := CNode.Text;
Label2.Caption := Label2.Caption + ',' + sNTxt;
if CNode.Parent <> nil then
sPTxt := CNode.Parent.Text
else
sPTxt := '';
//保存TV1中没有节点信息(txt,级别,父节点txt)
slStr.Add(sNTxt + ',' + Inttostr(CNode.Level) + ',' + sPTxt);
end;
end;
for i := 0 to slStr.Count - 1 do
begin
sStr := slStr;
CheckSite(sStr, ',', slTmp);
aNode := GetNode(StrToInt(slTmp[1]), slTmp[2], TV1); //得到TV1中相关节点的父节点
AddTreeItem(aNode, slTmp[0], TV1); //创建节点
end;
slStr.Free;
end;

function TForm1.GetNode(iLevel: integer; PTxt: string; TV: TTreeView):
TTreeNode;
var
i : integer;
CNode : TTreeNode;
sPTxt : string;
begin
Result := nil;
if iLevel > 0 then iLevel := iLevel - 1; //父亲节点的级数
for i := 0 to TV.Items.Count - 1 do
begin
CNode := TV.Items;
sPTxt := CNode.Text;
if (sPtxt = PTxt) and (CNode.Level = iLevel) then //级数相等且标签相等则返回当前节点
begin
Result := CNode;
Break;
end;
end;
end;

procedure TForm1.AddTreeItem(PNode: TTreeNode; sTxt: string; TV: TTreeView);
begin
TV.Items.AddChild(PNode, sTxt); //创建节点
end;

function TForm1.CheckSite(const Str, Ch: string; var Mystring: TStrings)
: boolean;
{字符串Str以Ch分隔成几段小字符串,该函数是将这些小字符串提取出来并保存在MyString中}
{截取字符串两边的空格}
var
sit, n : integer;
S : string;
begin
Result := True;
MyString.Clear;
S := Str;
n := Length(Ch);
while True do
begin
if Pos(Ch, S) = 0 then
begin
MyString.Add(S);
Break;
end;
sit := Pos(Ch, S);
MyString.Add(Copy(S, 1, sit - 1));
S := Trim(Copy(S, sit + n, Length(S)));
end;
if MyString.Count < 2 then Result := False;
end;

function TForm1.ChkTreeItem(iLevel: integer; sTxt: string; TV: TTreeView):
boolean;
var
i : integer;
CNode : TTreeNode;
begin
Result := False;
for i := 0 to TV.Items.Count - 1 do
begin
// Label1.Caption := inttostr(i) + ' ' + inttostr(TV.Items.Count);
try
TV.Items.Selected;
CNode := TV.Selected;
if (CNode.Level = iLevel) and (CNode.Text = sTxt) then
begin
Result := True;
Break;
end;
except
Result := False;
end;
end;
end;

end.
 
他这个问题和语言无关把!你做不出来只是你没找到算法!有了算法,用啥都能做。

如果你的那个朋友就凭这个笑话你,这只能显示他的无知,而并不能说你不动脑筋,只是
没有找到解决问题的方法而已。
 
你那个 VC 的朋友也真球,用这种问题刁难你!
你去问问他:在编码的时候,他是用算法实现还是用语言实现?!
并且再告诉他:Delphi 的 TTreeView 派生于与 MFC 的 CTreeCtrl
一样的窗口子类,这里面到底有多大区别,我实在不清楚!
也许他会比你有多几个消息的处理,但你也同样可以实现!并且比
他更方便。

你那个朋友的问题提得比要得到一个菜单的 CommandID 还要低级!
 
同意上面兄弟的话。
什么VC。。。。;我怀疑那个用VC的能不能写出程序,他根本不知写程序的要点是什么,
用什么工具或语言都是次要的主要的是算法。
说什么DELPHI什么什么的,放他的狗屁
 
放他的狗屁
 
FOXPRO 都行
 
支持以上反对楼主朋友的朋友。
 
NND. 用什么语言无所谓。 关键还是你用的语言能不能帮你挣口饭吃。
你叫你朋友用VC写个数据库程序瞧瞧。 看他做的出来不?
他该不会说: "访问数据库? 汇编都可以吧"
 
好像用VC的人不用控件的,那那些ActiveX控件全是vb 用了不成.
 
想起来真可笑!哈哈哈1
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
629
import
I
后退
顶部