又有问题来了,还请大家给我这个新手多指教! |
尚未結案
|
jtp
初階會員 發表:39 回覆:81 積分:29 註冊:2003-04-20 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 可以在動態建立 TImage 時給定 ComponentName 如:
procedure TForm1.Button1Click(Sender: TObject); var a: TImage; begin a:=TImage.Create(self); a.Name := 'myImage1'; //..... a.OnDblClick := Form1.Image1DblClick; end; // procedure TForm1.Image1DblClick(Sender: TObject); begin showmessage(TComponent(Sender).Name); end;如此一來就可以在共用的 DblClick Event 中取得動態建立的 component name 來進行判斷 |
jtp
初階會員 發表:39 回覆:81 積分:29 註冊:2003-04-20 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
一般操作不用判斷是那個,在事件裡直接操控 Sender 即可
以下假設 BigImage 是你存放較大版本的 TImage
procedure TForm1.Image1DblClick(Sender: TObject); var Img : TImage; begin Img := TImage(Sender); Img.SaveToFile(Path FileName); BigImage.Picture.Bitmap.Assign(Img.Picture.Bitmap); end;若你需要重新 Load File 才能放大,那若你的圖檔是在你當前記住的目錄和有固定副檔名的,可使用檔名(不連副檔名)來作 TImage 的 Name ,這樣就可以用 BigImage.LoadFromFile(Path Img.Name 'bmp'); 來 Load File 否則,建議你建立一個 TStringList 在動態加入 Timage 時以 TImage.Name=FileNameWithFullPath 的格式來 Add 進TStringList,那你之後便可以以 : BigImage.LoadFromFile(MyStringList.Values[Img.Name]); 來 Load File |
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls, DB, DBTables; type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Button3: TButton;
Qry1: TQuery;
procedure myclick(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1;
totalrun:integer=5;
i:integer=0;
implementation {$R *.dfm}
//点击放大,并提示是那张图片
procedure TForm1.myclick(Sender: TObject);
begin
if (sender is timage) then
begin
(sender as timage).Width:=100;
(sender as timage).Height :=100;
showmessage('this is '+copy((sender as timage).Name ,6,length((sender as timage).Name)-5 )+ ' image !!!');
end;
end; //动态创建
procedure TForm1.Button3Click(Sender: TObject);
var
image:timage; begin
image:=timage.Create(ScrollBox1);
image.Top:=20+totalrun;
image.Left:=20+totalrun;
image.Width:=75;
image.Height:=75;
image.Picture.LoadFromFile('c:\spy.jpg');
image.Align :=alNone;
image.Visible:=true;
image.Name:='image'+inttostr(i);
image.OnClick :=myclick;
image.Parent :=ScrollBox1;
totalrun:=totalrun+5;
inc(i)
end; end. 供参考!! 风花雪月 e梦情缘
------
风花雪月 e梦情缘 |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
jtp
初階會員 發表:39 回覆:81 積分:29 註冊:2003-04-20 發送簡訊給我 |
各位大哥,之前我发过几个贴就是有关这个问题的,我把整个代码贴出来,请大家帮我看看如何双击scrollbox内的动态创建的image图形,然后得知其是第几个图形,及放大图形。 //**************从数据库中取出图片及动态创建image**************
procedure TForm_caseembryo1.SpeedButton1Click(Sender: TObject);
var
image:timage;
begin
if qry1.Active=false then exit;
Qry1.First;
clearimage;
while not Qry1.Eof do
begin
image:=timage.Create(ScrollBox1);
image.Picture.LoadFromFile(Qry1.FieldByname('picpath').asstring);
image.Parent := ScrollBox1;
Qry1.Next;
end;
ReArrangeImages;
end; //***************************
procedure TForm_caseembryo1.ReArrangeImages;
var
i, ImageW, ImageH, OffSet, CurrentX, CurrentY: integer;
begin
ImageW := 100;
ImageH := 200; OffSet := 5; CurrentX := 0;
CurrentY := 0;
for i := 0 to ScrollBox1.ComponentCount - 1 do
begin
if ScrollBox1.Components[i] is TImage then
with TImage(ScrollBox1.Components[i]) do
begin
Width := ImageW;
Height := ImageH;
Left := CurrentX OffSet;
Top := CurrentY OffSet;
proportional:=true; if ScrollBox1.Width < (CurrentX 2 * OffSet ImageW ) then
begin
CurrentX := 0;
CurrentY := CurrentY 2 * OffSet ImageH;
end else
CurrentX := CurrentX 2 * OffSet ImageW;
end;
end;
end;
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
請看紅字的部分. 動態給定事件的程式部分請參考:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30055
// 在 type 段多加: TVirtualClass = class(TObject) class procedure myDblClick(Sender: TObject); end; . . . . procedure TForm_caseembryo1.SpeedButton1Click(Sender: TObject); var image:timage; i: integer; begin if qry1.Active=false then exit; Qry1.First; i:=0; clearimage; while not Qry1.Eof do begin image:=timage.Create(ScrollBox1); image.Picture.LoadFromFile(Qry1.FieldByname('picpath').asstring); i:=i+1; image.Name:='myImage' IntToStr(i); image.OnDblClick := TVirtualClass.myDblClick image.Parent := ScrollBox1; Qry1.Next; end; ReArrangeImages; end; class procedure TVirtualClass.myDblClick(Sender: TObject); begin showmessage(TComponent(Sender).Name); // 也可以在此寫要放大的處理. 使用的方式針對 TImage(Sender) 這個就可以了. end; |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
timhuang 兄, 先再謝謝你之前有關 RTTI 的解答,真的使小弟得益不少。 最近常見你使用 Virture Class ,想借些請問一下 使用 Virture Class 比直接將事件寫在 Form 的 Class 裡有甚麼好處? 因為我相信你會這樣建議絕對有它的好處的但我想來想去想不出來(除了若這類事件多事便於管理外)。謝謝。 另外,即然物件是從數據庫資料產生的,我覺得 Image.Name 最可與數據表的 Key 產生關聯,這樣即 Name 不會重覆之後又可以 Name 在數據表找回相關記錄作其他操作,不知 timhuang 兄認為如何? 若 KeyField 是文字而首字元不是數字的話,可在創建時 :
Image.Name := Qry1.FieldByname('Key').asstring;
在 procedure TForm1.Image1DblClick(Sender: TObject) 裡便可以用
Qry1.Loacte('Key',Img.Name,[]);
來找到該筆資料作其他操作 若 KeyField 是數字欄或是首個位元為數字的文字欄,可以在之前加一位元 :
Image.Name := 'I' Qry1.FieldByname('Key').asstring;
在 procedure TForm1.Image1DblClick(Sender: TObject) 裡便可以用
Qry1.Loacte('Key',Copy(Img.Name,2,Length(Img.Name)),[]);
來找到該筆資料作其他操作
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
引言: 最近常見你使用 Virture Class ,想借些請問一下 使用 Virture Class 比直接將事件寫在 Form 的 Class 裡有甚麼好處? 因為我相信你會這樣建議絕對有它的好處的但我想來想去想不出來(除了若這類事件多事便於管理外)。謝謝。這個原因是因為要使用 class function (procedure) 的關係. 有沒有注意到我用的 virtual class 都是寫入 class 的 function, 因為可以在 class 沒有 instance 時就可以有 function (procedure) 的位置出現, 反過來看, 在 TForm1 中也是可以寫這樣的東西沒錯, 但是若不是 class function 的話, 必須 assign xxx.onClick := Form1.myClick; 這樣的語法, 也就是必須要有 instance 才行. 但是在 TForm1 中寫 class function (procedure) 很奇怪, 所以弟才會建議用另一個 VirtualClass 來建立所有的動態 assign function (procedure), 除了方便管理外, 也有不易混淆的好處 !! <>< face="Verdana, Arial, Helvetica">引言: 另外,即然物件是從數據庫資料產生的,我覺得 Image.Name 最可與數據表的 Key 產生關聯,這樣即 Name 不會重覆之後又可以 Name 在數據表找回相關記錄作其他操作,不知 timhuang 兄認為如何? 這樣是不錯的, 比較容易對應.. |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
timhuang 兄, 謝謝你的講解,因應你的講解我還想到一個好處,就是可把常用的 Event Code 習中到一個 Pas 裡放在 Virture Class 裡,之後要用時動在 FormCreate 時設定使用 pas unit 裡的那個 evnet 就好不用再重覆寫。 另外我早前亦想到一個用普通 procedure 模擬 TxxxEvent of Class 的方法 (受你及 william 兄的啟發不少),也順便發表來給你們看看,不過沒甚麼實用價值,只是用來騙騙分 :P http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30573 hagar 兄,
噫,我也很喜歡這樣討論討論,無論技術上及心靈上都得益不少呢。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |