Текущий архив: 2003.12.19;
Скачать: CL | DM;
Вниз
В чём разница между S1 и S2 в данном фрагменте? Найти похожие ветки
← →
Knight © (2003-11-25 18:05) [40]>> Игорь Шевченко © (25.11.03 17:59) [39]
> Про мышку пытал форум, а потом цель выяснилась.
Ну там-то сразу было понятно, что не для дела... :)
А тут всё серьёзно, если комп раньше не разнесу из-за таких вот приколов с функциями, то исходники выложу. Ведь ещё вчера была мысль, что всё дело в Win2k, но как-то сбила с толку, частичная работоспособность функции.
← →
Knight © (2003-11-25 18:09) [41]Удалено модератором
Примечание: Offtopic
← →
Reindeer Moss Eater © (2003-11-25 21:26) [42]{.$DEFINE FROM_EXECUTABLE}
{.$DEFINE I_BELEIVE_IN_WIN32APIHELP}
procedure TForm1.Button1Click(Sender: TObject);
var i:Word; s : string; h:HICON;
begin
i:=0;
{$IFDEF FROM_EXECUTABLE}
s:=Application.ExeName;
{$ELSE}
SetLength(s,MAX_PATH);
StrPCopy(PChar(s),"C:\Program Files\Borland\Delphi5\readme.txt");
{$ENDIF}
H:=ExtractAssociatedIcon(0,PChar(s),i);
{$IFDEF I_BELEIVE_IN_WIN32APIHELP}
if H = 0 then
begin
Image1.Picture.Icon.Handle:=i;
ShowMessage("Assosiated executable file is :" + Trim(PChar(s)));
end
else
Image1.Picture.Icon.Handle:=H;
{$ELSE}
if H > 0 then
Image1.Picture.Icon.Handle:=H
else
ShowMessage(Format("GetLastError = %d",[GetLastError]));
{$ENDIF}
end;
← →
Reindeer Moss Eater © (2003-11-25 21:41) [43]А разные результаты в разных Windows потому что
uses ShellApi;
unit ShellApi.pas
...
shell32 = "shell32.dll";
...
Реализация иными словами разная у ExtractAssociatedIcon.
Код выше рожден на XP.
← →
Knight © (2003-11-25 23:30) [44]>> Reindeer Moss Eater © (25.11.03 21:26) [42]
Класс! Хоть и через ...., но заработало и в Win2k! :)
procedure TForm1.Button1Click(Sender: TObject);
var I:Word;
buff:Array[0..MAX_PATH] of Char;
S2:String;
begin
I:=0;
S2:="D:\";
StrPCopy(buff,S2);
Image1.Picture.Icon.Handle:=ExtractAssociatedIcon(HInstance,buff,I);
end;
Осталось, разобраться как получить иконку для типа файла, если сам файл не доступен... Попробовал напрямую, но никаких ассоциаций у системы это не вызвало.
← →
Knight © (2003-11-26 12:25) [45]Удалено модератором
Примечание: Создание пустых сообщений. Не надо
← →
Knight © (2003-11-26 13:02) [46]> Удалено модератором
> Примечание: Создание пустых сообщений. Не надо
Знаю, что не надо, но ведь как-то поднять в начало треба, а то совсем забудется...
← →
Игорь Шевченко © (2003-11-26 13:03) [47]Knight © (26.11.03 13:02)
Тебе не кажется, что активное привлечение внимания к своей персоне может повлечь прямо противоположный результат ?
← →
Knight © (2003-11-26 17:00) [48]Если эта тема уйдёт далеко, значит ответ найден...
← →
clickmaker © (2003-11-26 17:04) [49]
> Knight © (26.11.03 17:00) [48]
Найдешь ответ и в кусты? Так нам же тоже интересно чем твой mortal combat c win2k закончиться?
← →
Knight © (2003-11-26 19:43) [50]Удалено модератором
← →
Knight © (2003-11-27 12:23) [51]Ну раз больше идей нет, то сделал через реестр. Может кому пригодится... можно передавать расширение или тип:
расширение - ".xxx" (".txt", ".z" и т.п.)
тип - "type" ("folder", "drive" и т.п.)
Если иконка не найдена, то если Default:
true - то берётся стандартная;
false - результат 0;
function GetFileIcon(sFileType:String; Default:Boolean):HICON;
var FT, V, FN, N: string;
i, P: Integer;
R: TRegistry;
begin
Result:=0;
FT:="";
R:=TRegistry.Create;
try
if sFileType<>"" then begin
R.RootKey:=HKEY_CLASSES_ROOT;
if sFileType[1]="." then begin
if R.OpenKey(sFileType, False) then begin
FT:=R.ReadString("");
R.CloseKey;
end;
end else FT:=sFileType;
if (FT<>"") and R.OpenKey(FT+"\DefaultIcon", False) then begin
V:=R.ReadString("");
R.CloseKey;
end;
end;
if (V="") and Default then V:="shell32.dll,0";
finally
R.Free;
end;
if V<>"" then begin
while Pos(""",V)<>0 do Delete(V,Pos(""",V),1);
P:=pos(",",V);
if P<>0 then begin
FN:=copy(V,1,P-1);
N:=copy(V,P+1,length(V)-P);
if N[1]="-" then Delete(N,1,1);
i:=StrToIntDef(N,0)
end else begin
FN:=V;
i:=0;
end;
if FN<>"" then Result:=ExtractIcon(hInstance,PChar(FN),i);
end;
end;
PS: Приму любые советы по улучшению :)
← →
jack128 © (2003-11-27 12:55) [52]
> Осталось, разобраться как получить иконку для типа файла,
> если сам файл не доступен...
Создать файл с нужным расширением
использовать ExtractAssociatedIcon
Удалить файл
← →
Knight © (2003-11-27 13:04) [53]>> jack128 © (27.11.03 12:55) [52]
Супер... истино, говорят, что если бы строители строили как программисты пишут программы, то первый же, заполший из леса муравей, разрушил бы цивилизацию... :)
PS: Даже если предложений по улучшению не будет, все-равно всем ОГРОМНОЕ СПАСИБО за помощь. :)
← →
Reindeer Moss Eater © (2003-11-27 13:06) [54]В первоисточнике не муравей из леса, а пролетающий дятел
← →
clickmaker © (2003-11-27 13:12) [55]А я так и не понял, чем тя SHGetFileInfo не устроило. Насчет несуществующего файла, почитай внимательно про параметр pszPath и флажок SHGFI_USEFILEATTRIBUTES
← →
Knight © (2003-11-27 14:37) [56]>> clickmaker © (27.11.03 13:12) [55]
Да я чё-то почитал, почитал, попробовал, попробовал, а ничего не вышло. Плюнул и написал своё.
← →
jack128 © (2003-11-27 14:42) [57]
> Knight © (27.11.03 13:04) [53]
А по конкретней, чем тя мой вариант не устраивает?
← →
Knight © (2003-11-27 17:03) [58]>> jack128 © (27.11.03 14:42) [57]
> А по конкретней, чем тя мой вариант не устраивает?
Один файл - хорошо,
Два - хорошо...
а если несколько сотен?
Конечно, можно делать кэш... но мне это надо?
← →
Knight © (2003-11-27 17:10) [59]>> jack128 © (27.11.03 14:42) [57]
А, например, в папке System32 их более 2 тысяч...
← →
Игорь Шевченко © (2003-11-27 19:06) [60]Knight © (27.11.03 17:10)
Ты бы хоть рассказал народу, зачем оно тебе надо? А то ведешь себя, как партизан, которого в гестапо пытают. Чем яснее будет условие задачи, тем рациональнее (и быстрее) тебе могут предложить способ. Или просто пофлеймить захотелось ? ;)
Страницы: 1 2 вся ветка
Текущий архив: 2003.12.19;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.022 c