全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1258
推到 Plurk!
推到 Facebook!

又有问题来了,还请大家给我这个新手多指教!

尚未結案
jtp
初階會員


發表:39
回覆:81
積分:29
註冊:2003-04-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-15 16:27:06 IP:218.18.xxx.xxx 未訂閱
我在scrollbox中动态创建了image控件,且image从数据库中加载了图片了,我现在想知道如何在这些动态创建的图片上双击图片时得其是排第几张图片?如何把图片放大?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-15 20:42:16 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-16 09:14:42 IP:218.18.xxx.xxx 未訂閱
这样不行啊,大哥,我动态创建的IMAGE可能有成千上万个,那怎么判段是哪个啊?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-16 09:38:54 IP:218.16.xxx.xxx 未訂閱
一般操作不用判斷是那個,在事件裡直接操控 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-16 09:40:52 IP:61.155.xxx.xxx 未訂閱
    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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-16 09:43:48 IP:211.76.xxx.xxx 未訂閱
沒錯啊. 就算建立成千上萬個還是可以賦與名稱啊. 這是最快的判定那個 TImage 被選定的方法. 可以將你的程式貼上來, 創建(create) 及事件指定(assign event) 的部分程式碼上來嗎? 讓大家幫你看看如何修改.
jtp
初階會員


發表:39
回覆:81
積分:29
註冊:2003-04-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-16 10:21:41 IP:218.18.xxx.xxx 未訂閱
各位大哥,之前我发过几个贴就是有关这个问题的,我把整个代码贴出来,请大家帮我看看如何双击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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-16 10:35:22 IP:211.76.xxx.xxx 未訂閱
請看紅字的部分. 動態給定事件的程式部分請參考: 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-16 10:38:12 IP:218.16.xxx.xxx 未訂閱
你沒說清楚你想甚樣放大。    若是放在另一個大的 Timage 裡(像 ACDSee Browse 時的 Preview 畫面)上面已說了方法。    不過可能一會又有人 "參考" 了那方法後加上 unit x interface 等做成很長的文章來貼。    見太多了
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-16 10:59:20 IP:218.16.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-16 15:52:14 IP:211.76.xxx.xxx 未訂閱
引言: 最近常見你使用 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-16 16:05:16 IP:202.39.xxx.xxx 未訂閱
看你們這樣討論, 雖然是看得霧煞煞 但感覺很棒! --- 每個人都是一本書< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=9549643&CC=213577">
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-16 17:09:02 IP:218.16.xxx.xxx 未訂閱
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 兄, 噫,我也很喜歡這樣討論討論,無論技術上及心靈上都得益不少呢。
系統時間:2024-06-27 3:51:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!