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

无法正确读取图标

缺席
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-11 18:11:24 IP:211.162.xxx.xxx 未訂閱
大大们好,小弟问题多多,请在茫茫迷海中给我指条明路吧 在我的这个小程式中,要实现的目的是把 class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { TIcon *MyIcon = new TIcon(); HICON hIcon; TListItem *MyListItem; if(OpenDialog1->Execute()) { AnsiString MyFileName = OpenDialog1->FileName; hIcon = ExtractIcon(Form1->Handle,MyFileName.c_str(),0); MyIcon->Handle = hIcon; ImageList1->AddIcon(MyIcon); MyListItem = ListView1->Items->Add(); MyListItem->Caption = ExtractFileName(MyFileName); MyListItem->ImageIndex = ListView1->Items->Count - 1; } delete MyIcon; } 当按下Button1时,弹出对话框,在指定了exe文件后,程式会将文件名和该文件的略缩图标显示出来. 现在的问题是: 1.当打开自己有特定图标的文件是可以成功的读取,例如:Notepad.exe等,但是在系统目录下有很多的exe文件的图标无法读出来,例如C:\WINNT\system32\systray.exe,以及C:\WINNT\system32\FTP.EXE等.我不知道为什么会产生这样的情况,盼您点拨一下我. 2.HICON hIcon是代表在栈中申请的空间,所以不用自己去销毁,VCL会帮我们做完的,TIcon *MyIcon = new TIcon()是代表在堆中申请的,所以在最后要自己去把它销毁掉.我的问题是:TListItem *MyListItem算是在那里申请的哦?堆还是栈?我在后面没有把它销毁掉,会不会造成资源的泄漏呢? 又得麻烦大大您们了,您们是世界上最无私奉献的人!!! 人生在勤,不索何获?
------
人生在勤,不索何获?
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-11 19:53:09 IP:211.162.xxx.xxx 未訂閱
小弟还有一个问题: 对于一个AnsiString的字符串,如果里面包含了路径和相关的参数,存不存在这样的可能: 把相关的路径提出来呢? 例如字符串:    AnsiString str1,str2,str3; str1="C:\\PROGRAM FILES\\REAL\\REALONE PLAYER\\RealPlay.exe SYSTEMBOOTHIDEPLAYER"; str2="C:\\Program Files\\QuickTime\\qttask.exe -atboottime"; str3="mobsync.exe /logon";    能否把exe的路径读出来呢?让它们变成下面这样的形式:    str1="C:\\PROGRAM FILES\\REAL\\REALONE PLAYER\\RealPlay.exe"; str2="C:\\Program Files\\QuickTime\\qttask.exe"; str3="mobsync.exe";    我的确不知道可不可能实现这样的功能?如果有,请大大您指点我,好吗?如果没有也没什么的,小弟多有打搅,抱歉了! 人生在勤,不索何获?
------
人生在勤,不索何获?
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-25 13:25:14 IP:211.162.xxx.xxx 未訂閱
感谢大家,我自己已经把问题解决了. 1. 有些系统文件的图标自身是没有的,它是引用的Explorer中的图标.可以用下面的代码来判断是否能正确读出图标:
void __fastcall TForm1::Button1Click(TObject *Sender)     
{                                                         
        HICON hIcon;
        if(OpenDialog1->Execute())
        {
            AnsiString MyFileName = OpenDialog1->FileName;
            hIcon = ExtractIcon(Form1->Handle,MyFileName.c_str(),0);
            if(hIcon != NULL)
            {
                ShowMessage("能把图标搞定哦");
            }
            else ShowMessage("哎,无能为力了^_^");
        }
}
2.关于将字段提出来的办法.因为都有规律,所以就可拆解:
AnsiString __fastcall TForm1::MyStringSegment(AnsiString Str,AnsiString Comma,int Seg)
{
        AnsiString sResult;    //做为结果返回            if((Str.IsEmpty()) || (Seg <1))
        {
            sResult = "";
            return sResult;
        }            String C = Comma;
        if(C == "") C = ",";            String s = Str;
        String sTemp;
        int iPosComma;            TStringList *TempList = new TStringList;    //哦,这里有一个列表哈            TempList->Clear();
        while(s.Pos(C) > 0)
        {
            iPosComma = s.Pos(C);       //什么哦
            sTemp = s.SubString(1,iPosComma - 1);
            TempList->Add(sTemp);
            s = s.SubString(iPosComma   1,s.Length());
        }            if(s.Length() != 0) TempList->Add(s);            if(Seg > TempList->Count)
        {
            sResult = "";
        }
        else
            sResult = TempList->Strings[Seg - 1];            delete TempList;            return sResult;
}
只需要将.号前面的拆出后再加上exe就搞定了 人生在勤,不索何获?
------
人生在勤,不索何获?
系統時間:2024-04-30 12:04:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!