線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3130
推到 Plurk!
推到 Facebook!

如何秀圖

尚未結案
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-28 23:45:45 IP:220.134.xxx.xxx 未訂閱
想請問各位大大..我想要做把100張圖片同時秀出來..並讓使用者能點選出所需要的圖片...然後匯到image裡...我有搜尋前輩大大的文章..但是都沒看到我要的範例..用listview可以嗎?因為不會寫這個..請大大指教一下..
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-29 02:11:19 IP:61.230.xxx.xxx 未訂閱
frankh 您好:    下列這一篇可先參考一下: 如何把目錄內的圖(jpg,bmp)秀在陣列圖板內? http://delphi.ktop.com.tw/topic.php?topic_id=58913 7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-01 00:12:41 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 您給我參考的文章我看不是很懂...不懂如何運用listview imagelist..把多張圖放進listview..小弟是bcb新手...所以文章有關listview很多部分看不懂..文章中他的圖檔是要點選資料夾圖片才會秀出來...但我只是想要直接讀取資料夾的圖片...可不可以請您指導小弟一下..非常感謝您
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-01 01:17:56 IP:61.230.xxx.xxx 未訂閱
frankh 您好:    雖然該範例是寫成您描述的運作方式,但是您可以在 Form 的 OnCreate 事件中,直接指定 FileListBox 指向特定目錄,例如:
FileListBox1->Directory = "C:\\Share Folder\\Pictures\\";
這樣子就可以在程式執行之後,立即顯示出指定目錄內的圖檔。 那支範例程式其實已經算是很小的了,慢慢試著將範例修改成您所想要的運作方式,在修改的過程中,您就會瞭解各個元件的運作方式,以及設定成不同參數時的差異,如果有碰到難題或是有不懂的地方可以提出來。 7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-01 10:16:04 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: FileListBox1->Directory = "C:\\Share Folder\\Pictures\是在FileListBox直接指定...但是我如果連FileListBox都不要設..只想當程式執行時...listview直接都可以匯入我的資料夾的圖片...那我該怎麼做?    
引言: frankh 您好: 雖然該範例是寫成您描述的運作方式,但是您可以在 Form 的 OnCreate 事件中,直接指定 FileListBox 指向特定目錄,例如:
FileListBox1->Directory = "C:\\Share Folder\\Pictures\\";
這樣子就可以在程式執行之後,立即顯示出指定目錄內的圖檔。 那支範例程式其實已經算是很小的了,慢慢試著將範例修改成您所想要的運作方式,在修改的過程中,您就會瞭解各個元件的運作方式,以及設定成不同參數時的差異,如果有碰到難題或是有不懂的地方可以提出來。 7 天天敲鍵盤 v 時時按滑鼠 8
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-01 17:39:22 IP:59.115.xxx.xxx 未訂閱
frankh 您好:    給您一個範例好了,縮圖大小、縮圖底色、讀取目錄....等設定項目我都擺在程式的開始處,請您依據您的需求自行修改,物件名稱也請自行修改成您自己程式內所設定物件的名稱,以下程式已經考慮到縮圖的顯示比例,以及小圖的居中顯示....等,適用性已經很高了,但是針對不同需求時仍有加強的空間,我也在程式內已經盡可能的加註了說明,希望您能看懂:

    Screen->Cursor = crHourGlass;
    const ThumbWidth  = 92;  // 縮圖寬度
    const ThumbHeight = 69;  // 縮圖高度
    TColor bkColor = clSilver;  // 縮圖的底色 (圖檔尺寸小於縮圖框尺寸時才會顯示出來)        AnsiString GoDir = "c:\\my temp";  // 要處理縮圖的目錄位置
    chdir(GoDir.c_str());  // 切換到指定目錄去        ListView3->Items->Clear();  // 清除 ListView 的所有內容
    ListView3->Items->BeginUpdate();  // 作此設定可讓處理速度較為快些        ImageList3->Clear();  // 清除 ImageList 的所有內容
    ImageList3->Width  = ThumbWidth;   // 設定 ImageList 存放圖像的寬度
    ImageList3->Height = ThumbHeight;  // 設定 ImageList 存放圖像的高度        TSearchRec Sr;  // 設 Sr 為存放檔案資訊的結構變數
    AnsiString FileName;  // 設定檔案名稱之用的暫存變數
    AnsiString FileExt;   // 存放檔案的副檔名        int done = FindFirst("*.*", faDirectory | faAnyFile, Sr);
    while (done == 0) {
        Application->ProcessMessages();
        if (!(Sr.Attr & faDirectory)) {  // 如果是檔案
            FileName = Sr.Name;  // 取得檔案名稱
            FileExt  = ExtractFileExt(FileName).UpperCase();  // 取得檔案的副檔名,並轉為大寫字樣
            // 若檔案類型為 .bmp, .jpg, .jpeg, .gif 才做成縮圖並顯示於 ListView 上
            if (FileExt == ".BMP" || FileExt == ".JPG" || FileExt == ".JPEG" || FileExt == ".GIF") {
                TListItem* Item = ListView3->Items->Add();  // 添加 ListView 項目
                Item->Caption = AnsiString(FileName);  // 設定 ListView 項目的標題為檔案名稱                    Graphics::TBitmap *Bitmap = new Graphics::TBitmap();  // 暫存之用的 Bitmap
                Bitmap->PixelFormat = pf24bit;                    if (FileExt == ".BMP") {  // 如果是 .BMP 檔的話
                    Bitmap->LoadFromFile(FileName);
                } else if (FileExt == ".GIF") {  // 如果是 .GIF 檔的話
                    TGIFGraphic *Gif = new TGIFGraphic();  // 透過 TGIFGraphic 來讀取
                    Gif->LoadFromFile(FileName);
                    Bitmap->Assign(Gif);
                    delete Gif;
                    Gif = NULL;
                } else if (FileExt == ".JPG" || FileExt == ".JPEG") {  // 如果是 .JPG 或 .JPEG 檔的話
                    TJPEGImage *JPEG = new TJPEGImage();  // 透過 TJPEGImage 來讀取
                    JPEG->Performance = jpBestSpeed;
                    JPEG->Scale = jsEighth;
                    JPEG->Scale = jsFullSize;
                    JPEG->LoadFromFile(FileName);                        Bitmap->Assign(JPEG);
                    delete JPEG;
                    JPEG = NULL;
                }                    Graphics::TBitmap *DestBmp = new Graphics::TBitmap();
                Bitmap->PixelFormat = pf24bit;
                DestBmp->Width = ThumbWidth;
                DestBmp->Height = ThumbHeight;                    // 以下三是將 DestBmp 填滿指定的底色
                DestBmp->Canvas->CopyMode = cmSrcCopy;
                DestBmp->Canvas->Brush->Color = bkColor;
                DestBmp->Canvas->FillRect(Rect(0, 0, ThumbWidth, ThumbHeight));                    int w = Bitmap->Width;
                int h = Bitmap->Height;
                int top;
                int left;                    // 如果讀入圖檔的尺寸超出縮圖的指定尺寸,就進行縮小比例的運算
                if (Bitmap->Width > ThumbWidth || Bitmap->Height > ThumbHeight) {
                    top  = 0;
                    left = 0;
                    float f = (float)h / w;  // 取得高度與寬度的比例                        w = ThumbWidth;
                    h = f * w;                        if (h > ThumbHeight) {  // 如果計算出來的高度高過縮圖框的高度
                        h = ThumbHeight;
                        w = h/f;
                        left = (ThumbWidth-w) / 2;
                    } else {
                        top = (ThumbHeight-h) / 2;
                    }                        SetStretchBltMode(DestBmp->Canvas->Handle, HALFTONE);  // 大圖需縮小時作此設定會比較美觀
                } else {  // 如果讀入圖檔的尺寸小於縮圖的指定尺寸,就計算出居中顯示的位置
                    left = (ThumbWidth-w)  / 2;
                    top  = (ThumbHeight-h) / 2;
                }
                // 將讀入的圖檔按照縮圖尺寸繪製到已經填滿底色的 Bitmap 物件上
                DestBmp->Canvas->CopyRect(Rect(left, top, left w, top h), Bitmap->Canvas, Rect(0,0, Bitmap->Width, Bitmap->Height));                    Item->ImageIndex = ImageList3->Add(DestBmp, NULL);  // 將縮圖存入 ImageList                    delete DestBmp;
                DestBmp = NULL;                    delete Bitmap;
                Bitmap = NULL;                }
        }            done = FindNext(Sr);  // 找尋目錄中的下一個檔案
    }        FindClose(Sr);        ListView3->Items->EndUpdate();
    Screen->Cursor = crDefault;
以上程式您可以視需要將它放置到您的程式中適當的位置,或者將它寫成自定函式,以便在程式中重覆使用。 7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-02 17:41:42 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 謝謝您給我範例...我有寫出來程式...程式碼沒問題...但RUN時圖片卻不能戴入到listview裡面去...可不可以再請您指導我一下... http://delphi.ktop.com.tw/topic.php?TOPIC_ID=79262
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-02 17:55:03 IP:61.217.xxx.xxx 未訂閱
frankh 您好:    以下是您的部份程式碼:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Screen->Cursor = crHourGlass;        //TColor bkColor = clSilver;  // 縮圖的底色 (圖檔尺寸小於縮圖框尺寸時才會顯示出來)        AnsiString GoDir = "C:\\Documents and Settings\Administrator\桌面\testify";  // 要處理縮圖的目錄位置
    chdir(GoDir.c_str());  // 切換到指定目錄去
}
您的 FormCreate 事件中並未放置我的其它程式碼,您也沒有將那些程式碼寫成副程式或函式來呼叫,當然不會有動作。 請您將我提供的全部敘述都放到 FormCreate 事件中,然後設定好 GoDir 變數的內容,再重新編譯、執行看看結果如何? 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/10/02 17:56:39
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-02 18:41:26 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 非常感謝您...可以run了...我會再繼續修改..改成我真正需要的程式...之前把程式碼也放錯地方了...我學到很多東西...想再請教您一下..是不是可以在listview把選擇的圖檔拖到image1裡面...不好意思問您這麼多問題...
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-03 00:36:54 IP:61.230.xxx.xxx 未訂閱
frankh 您好:    請比照下列方式做設定,然後試試看:
// 先將 ListView1 的 DragMode 設為 dmAutomatic    void __fastcall TForm1::Image1DragOver(TObject *Sender, TObject *Source,
      int X, int Y, TDragState State, bool &Accept)
{
    if (Source == ListView1) {
        Accept = true;
    }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Image1DragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{
    if (Source == ListView1) {
        Image1->Picture->Bitmap = LoadImage(ListView1->Selected->Caption);
    }
}
7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-03 12:57:13 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 我沒辦法run....我都有宣告了..請您指導一下...
Build
  [C   Error] Unit1.cpp(160): E2034 Cannot convert 'const AnsiString' to 'void *'
  [C   Error] Unit1.cpp(160): E2340 Type mismatch in parameter 1 (wanted 'void *', got 'AnsiString')
  [C   Error] Unit1.cpp(160): E2193 Too few parameters in call to '__stdcall LoadImageA(void *,const char *,unsigned int,int,int,unsigned int)'
  [C   Error] Unit1.cpp(160): E2034 Cannot convert 'void *' to 'TBitmap *'
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-03 14:11:15 IP:61.230.xxx.xxx 未訂閱
frankh 您好:    前一篇提供範例程式中的 LoadImage(...) 是一個虛擬函式,意思是告訴您在那個位置作載入圖檔的動作,請您自行比照辦理,將該函式換成您自己的載入圖檔程序或是自定函式 7 天天敲鍵盤 v 時時按滑鼠 8
系統時間:2024-04-28 13:37:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!