有两个listbox,先选listbox1的一个值,再选listbox2的一个值,选完后,在选的两个值之间产生一条线???如何实现!!急!! ( 积分: 100

  • 主题发起人 主题发起人 qtlove
  • 开始时间 开始时间
Q

qtlove

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个listbox,先选listbox1的一个值,再选listbox2的一个值,选完后,在选的两个值之间产生一条线???如何实现!!急!! ( 积分: 100 )<br />有两个listbox,先选listbox1的一个值,再选listbox2的一个值,选完后,在选的两个值之间产生一条线??如何实现!!
没做过画线方面的,能否讲清思路??
谢谢大家!!
 
有两个listbox,先选listbox1的一个值,再选listbox2的一个值,选完后,在选的两个值之间产生一条线??如何实现!!
没做过画线方面的,能否讲清思路??
谢谢大家!!
 
自己画吧
 
关键是怎么画??给个思路
 
Canvas.MoveTo(X, Y);
Canvas.LineTo(X, Y);
 
image控件里画。
 
var X1,Y1,X2,Y2:integer;
begin
X1:=ListBox1.Left+ListBox1.Width+2;
Y1:=ListBox1.Top+ListBox1.ItemHeight*(1+ListBox1.ItemIndex)-ListBox1.ItemHeight div 2;
X2:=ListBox2.Left-2;
Y2:=ListBox2.Top+ListBox2.ItemHeight*(1+ListBox2.ItemIndex)-ListBox2.ItemHeight div 2;
Form1.Canvas.MoveTo(X1,Y1);
Form1.Canvas.LineTo(X2,Y2);
end;
 
用Canvas.MoveTo及Canvas.LineTo可画线.如果用Form画,在Form失去焦点时,所画线被清除,使用Image将无此问题.当将Canvas.Pen.Mode设为pmNotXor时,按原来的点重画一次,可将画线清除
 
谢谢e-,得到提示,自己解决.
谢谢所有的人,谢谢大家的帮助.
我写的代码如下,见笑了.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ImgList, ComCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
ListBox1: TListBox;
ListBox2: TListBox;
StatusBar1: TStatusBar;
Button4: TButton;
ListBox3: TListBox;
procedure ListBox1Click(Sender: TObject);
procedure ListBox2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
X1:Integer; //listbox1选中的行数
X2:Integer; //listbox2选中的行数
AllLinkTag : array of string; //定义动态数组,全局标志位,用于判断是否连接
SelectedItems: array[1..50,0..1] of string; //用于保存连线两边的listbox1和listbox2的值
implementation

{$R *.dfm}

procedure TForm1.ListBox1Click(Sender: TObject);
begin
X1 := ListBox1.ItemIndex+1;
end;

procedure TForm1.ListBox2Click(Sender: TObject);
var
X:Integer;
Y:Integer;
L:Integer;
begin
X2 := ListBox2.ItemIndex+1;
if (AllLinkTag[X2] = 'UnLink') then
begin
X := Image1.Width;
Y := ListBox2.ItemHeight*X2;
L := ListBox1.ItemHeight*(X1);
Image1.Canvas.Pen.Mode := pmNotXor; //
Image1.Canvas.Pen.Color := clRed;
Image1.Canvas.Pen.Width := 2;
Image1.Canvas.MoveTo(0,L);
Image1.Canvas.LineTo(X,Y);
AllLinkTag[X2] := 'Link';
SelectedItems[X2,0] := ListBox1.Items[ListBox1.itemindex];
SelectedItems[X2,1] := ListBox2.Items[ListBox2.itemindex];
Exit;
end;
if (AllLinkTag[X2] = 'Link') then
begin
X := Image1.Width;
Y := ListBox2.ItemHeight*X2;
L := ListBox1.ItemHeight*(X1);
Image1.Canvas.Pen.Mode := pmNotXor; //
Image1.Canvas.Pen.Color := clRed;
Image1.Canvas.Pen.Width := 2;
Image1.Canvas.MoveTo(0,L);
Image1.Canvas.LineTo(X,Y);
AllLinkTag[X2] := 'UnLink';
SelectedItems[X2,0] := '';
SelectedItems[X2,1] := '';
Exit;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
begin
SetLength (AllLinkTag, 50); //分配内存
for I := 0 to 49 do
AllLinkTag := 'UnLink';
end;

procedure TForm1.Button4Click(Sender: TObject);
var
i:Integer;
begin
ListBox3.Items.Clear;
for i := 1 to 49 do
if (SelectedItems[i,0]<>'') and (SelectedItems[i,1]<>'') then
ListBox3.Items.Add(SelectedItems[i,0]+SelectedItems[i,1]);
end;

end.

但现在还有一个问题:
我不想出现&quot;一对多&quot;的情况.
即:若listbox2中的一项选择后,该项便不能在和listbox1中的连线.
试了较多的方法,考虑了设全局变量,做标记位的方法.但效果不理想.

望各位讨论讨论!!
 
后退
顶部