如何控制动态生成的image?分数不够可以在加,只要能解决问题,大富翁都去那里了? :( (10分)

S

sungods

Unregistered / Unconfirmed
GUEST, unregistred user!
...
var imgku:Array[0..9] of TImage;
...
procedure TForm1.Button1Click(Sender: TObject);

begin
imgku[1]:=timage.Create(self);
imgku[1].parent:=panel1;
//imgku[1].Canvas.Polygon(pa[1]);
imgku[1].Picture.LoadFromFile('c:/zhuye.bmp');
imgku[1].Stretch:=true;//拉伸
imgku[1].Visible:=true;
imgku[1].onmousemove:=abc;
inc(i);
end;

请问这个过程名怎么做
我这样写
首先在public里面声名了一下
...
public
procedure abc;
...
procedure abc;
begin
...
end;
在编译的时候这个地方出错:
imgku[1].onmousemove:=abc;
说过程名不对。
请富翁们,帮忙最好用代码解释,分数在解决问题以后在针对回复者状况追加~
 
abc要和imgku[1].onmousemove的一致,
这样写
Procedure abc(Sender: TObject
Shift: TShiftState
X, Y: Integer);
 
好的,我try一下~
 
[Error] Unit1.pas(50): Incompatible types: 'TMouseButton' and 'TShiftState'
[Error] Unit1.pas(18): Unsatisfied forward or external declaration: 'TForm1.abc'
出现两个错误
我是这么写的:
procedure abc (Sender: TObject
Shift: TShiftState
X,Y: Integer);
begin
ix:=x;
iy:=y
end;
上面还是一样的
 
我自己顶1下
 
procedure Tform1.abc (Sender: TObject
Shift: TShiftState
X,Y: Integer);
begin
ix:=x;
iy:=y
end;
你是在TForm1窗口中的public域中申明的,所以要在abc的实现中写上所属类的名。
 
to yaoqiaoefng
还有错误
[Error] Unit1.pas(45): Incompatible types: 'Parameter lists differ'
 
你把第45行的内容写出来让我看看
 
问题解决了,不过还出现另外一个问题~
如果过yaoqiaofeng你能回答我的问题我会在加分给你:
就是我在动态创建image以后要用鼠标拖拉他,让他在panel里面移动,
如果我创建第一个imgku[1],移动他可以实现,创建第二个imglu[2]也可以,当创建完第二个以后,回头在移动第一个,这是发现焦点就在第二个上面了。
问题是如何取得当前imgku的句柄?
 
建议自定义一个TmyImage,实现鼠标操作,再重写一个构造函数create,带上图片参数,会简单得多.
 
我觉得是你的函数Tform1.abc 写得不对
 
上面的问题解决了
现在我的鼠标只能操作最后一个动态生成的image,如果获得其他句柄
这个应该在onmousemove里面获得其他image的句柄,应该怎么写?
难道大富翁都解决不了么?
 
我自己顶一下
 
在Tform1.abc中应该这样写
TImage(sender).Left:=....
 
鼠标拖动的问题解决了
现在不可以右键删除了?还是找不到焦点或者句柄
我把我的代码贴出来,大家参考以下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,QExtCtrls, StdCtrls, ExtCtrls, Menus, DB, ADODB;

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
PopupMenu1: TPopupMenu;
Edit1: TEdit;
Button2: TButton;
N1: TMenuItem;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
showhint1: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure showhint1Click(Sender: TObject);
private
{ Private declarations }
public
procedure mm(Sender: TObject
Shift: TShiftState
X,Y: Integer);
//procedure bcd(Sender: TObject
Button: TMouseButton;Shift: TShiftState
X, Y: Integer);
procedure md(Sender: TObject
Button: TMouseButton;Shift: TShiftState
X, Y: Integer);

{ Public declarations }
end;

var
Form1: TForm1;
i,k,j:integer;
p : array[1..99] of Tpanel;
imgku:Array[1..99] of TImage;
dwstyle:dword;
h:thandle;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
inc(i);
{动态创建panel}
p:=tpanel.Create(self);
p.Parent:=panel1;
p.Width:=60;
p.Height:=60;
{动态创建imgku}
imgku:=timage.Create(self);
imgku.parent:=p;
imgku.Align:=alclient;
imgku.Picture.LoadFromFile('c:/zhuye.bmp');
imgku.Stretch:=true;//拉伸
imgku.Visible:=true;
imgku.OnMouseMove:=mm;
imgku.OnMouseDown:=md;
imgku.PopupMenu:=popupmenu1;
imgku.ShowHint:=true;
k:=i;
//k可以变化,固定i为了下一个创建图片
end;

procedure Tform1.mm (Sender: TObject
Shift: TShiftState
X,Y: Integer);
begin
//??????????????????//
//这个地方k值不能变?//
//??????????????????//

p[k].Cursor:=crhandpoint;

end;

procedure tform1.md(Sender: TObject
Button: TMouseButton;Shift: TShiftState
X, Y: Integer);
begin
if p[k].Cursor = crhandpoint then
begin
releasecapture();
TControl(sender).Parent.Perform(WM_SYSCOMMAND, $F012, 0);
//sendmessage(p[k].Handle,WM_NCLBUTTONDOWN , HTCAPTION, 0);
//showmessage(inttostr(j));
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0
//初始化数组
if assigned(p[k]) then
begin
//修改此单字符串窗口组件性质,可自由缩放大小
dwstyle := getwindowlong(p[j].Handle,GWL_STYLE);
//修正此单字符串窗口组件在Form1上的实际尺寸与范围
//以便USER直接调整单字符串窗口组件边沿
setwindowlong(p[k].Handle,GWL_STYLE,dwstyle or WS_SIZEBOX);
movewindow(p[k].Handle,p[k].Left,p[k].Top,p[k].Width,p[k].Height+1,true);
//如果p[j].height+1 可以拖动
//如果p[j].height 不可拖动
end;
adoquery1.SQL.Add('select * from ku');
adoquery1.Active:=true;
adoquery1.first;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
//k不是动态的传递imgku[k]中的数值
k:=strtoint(edit1.text);
end;

procedure TForm1.N1Click(Sender: TObject);
begin
//解决动态查找句柄此删除问题可解决
imgku[k].ShowHint:=false;
imgku[k].Free;
p[k].Free;
end;

procedure TForm1.showhint1Click(Sender: TObject);
var
name:string;
info:string;
begin
//通过一个窗体传递信息
//当前自定义的
//还是上面的句柄解决不了,这个地方也有问题
name:=adoquery1.Fields[0].AsString;
info:=adoquery1.Fields[1].AsString;
imgku[k].Hint:='name:'+name+'. '+'库存种类:'+info;
adoquery1.Next;
end;

end.
 
Image控件没有焦点。
所以你只能在form(或者image的父窗口控件)的OnMouseDown事件里用ControlAtPos获取当前鼠标选中的是哪个Image.
 
其实可以这样,用一个结构,
t = Record
image : Timage;
panle : TPanle;
S : string
//这个就是全局的标记,这个变量可是整型变量,也可以字符串变量,最主要的是你是通过什么方式去切换你所要操作的对象。
end;
 
在 TForm1.Button1Click中加入以下代码
imgku.tag:=i;

在 TForm1.Button1Click中加入以下代码
k:=Timage(sender).Tag
就可以了
 
非常感谢大家的参与~
问题要明天去单位测试定论。
问题解决马上结帖~
如发现问题好要请教大家
 
多人接受答案了。
 

Similar threads

顶部 底部