Avatar billede dl Nybegynder
03. april 2001 - 19:54 Der er 9 kommentarer og
1 løsning

Ikoner + Listbox

Jeg har fundet ud af hvordan jeg kan skrive alle computerens drev, ned i en listbox.

Men hvordan kan jeg lave sådan at den også laver et Harddiskikon, når det er et harddisk drev, og en diskketteikon når det er en diskette drev.
Og cd ikoner, når det er et cd drev.
Avatar billede martinlind Nybegynder
04. april 2001 - 07:36 #1
Tegne et ikon i listbox\'en med OwnerDraw

Avatar billede borrisholt Novice
04. april 2001 - 07:47 #2
du tager en form. Giver den et OnCreateEvent, og et OnShowEvent. Så sætter du en list box på den og giver ListBoxen et onDrawItemEvent. Så skriver du det følgende kode :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;      Rect: TRect; State: TOwnerDrawState);
    procedure FormShow(Sender: TObject);
  private
    Number : Integer;
    ICons : array of HICON;
  public
    { Public declarations }
  end;

  TDriveType = (dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM, dtRAM);

var
  Form1: TForm1;

implementation

{$R *.DFM}
uses
  ShellAPI;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Number := 0;
  ListBox1.Style := lbOwnerDrawFixed;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);
var
  h: HIcon;
begin
  with (control as TListBox) do
  begin
    Canvas.Brush.Style:=bsSolid;
    Canvas.Brush.Color:=Color;

    if odSelected in State then
      Canvas.Brush.color:=clActiveCaption;

    Canvas.Fillrect(rect);
    Canvas.Textout( Rect.Left+20,Rect.Top,Items[Index]);
    h:= Icons[Index];

    if h<>0 then
      DrawIconEx(Canvas.Handle,Rect.left+1,rect.top+1,h,16,16,0,0,di_normal);

    if odFocused in state then
      canvas.DrawFocusRect(rect);
  end;
end;

Function GetSystemDirectory : String;
begin
  SetLength(Result, MAX_PATH);
  Windows.GetSystemDirectory(PChar(Result),MAX_PATH);
  SetLength(Result, Pred(Pos(#0,Result)));
end;

function VolumeID(DriveChar: Char): string;
var
  OldErrorMode: Integer;
  NotUsed, VolFlags: Cardinal;
  Buf: array [0..MAX_PATH] of Char;
begin
  OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    if GetVolumeInformation(PChar(DriveChar + \':\\\'), Buf, sizeof(Buf),
      nil, NotUsed, VolFlags, nil, 0) then
      SetString(Result, Buf, StrLen(Buf))
    else Result := \'\';
    if DriveChar < \'a\' then
      Result := AnsiUpperCaseFileName(Result)
    else
      Result := AnsiLowerCaseFileName(Result);
    Result := Format(\'%s\',[Result]);
  finally
    SetErrorMode(OldErrorMode);
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  DriveNum: Integer;
  DriveChar: Char;
  DriveType: TDriveType;
  DriveBits: set of 0..25;
  Current : Integer;

  procedure AddDrive(const VolName: string);
  begin
  case DriveType of
    dtFloppy :
      Icons[Current] := ExtractIcon (Handle, PChar(GetSystemDirectory+\'\\Shell32.dll\'),6);
    dtFixed :
      Icons[Current] := ExtractIcon (Handle, PChar(GetSystemDirectory+\'\\Shell32.dll\'),8);
    dtNetwork :
      Icons[Current] := ExtractIcon (Handle, PChar(GetSystemDirectory+\'\\Shell32.dll\'),9);
    dtCDROM :
      Icons[Current] := ExtractIcon (Handle, PChar(GetSystemDirectory+\'\\Shell32.dll\'),11);
    dtRAM :
      Icons[Current] := ExtractIcon (Handle, PChar(GetSystemDirectory+\'\\Shell32.dll\'),12);
    end;
    inc(Current);
    ListBox1.Items.Add(Format(\'%s: %s\',[DriveChar, VolName]));
  end;

begin
  ListBox1.Clear;
  Integer(DriveBits) := GetLogicalDrives;
  for DriveNum := 0 to 25 do
  begin
    if not (DriveNum in DriveBits) then
      Continue;

    DriveChar := Char(DriveNum + Ord(\'a\'));
    DriveType := TDriveType(GetDriveType(PChar(DriveChar + \':\\\')));
    inc(Number);
  end;
  SetLength(Icons,Number);
  Current := 0;

  for DriveNum := 0 to 25 do
  begin
    if not (DriveNum in DriveBits) then
      Continue;

    DriveChar := Char(DriveNum + Ord(\'a\'));
    DriveType := TDriveType(GetDriveType(PChar(DriveChar + \':\\\')));
    DriveChar := Upcase(DriveChar);

    Adddrive(VolumeID(DriveChar))
  end;

  ListBox1.ItemIndex := 1;
end;

end.


Alternativt kunne du havde fundet koden på http://borrisholt.com

Jens B
Avatar billede borrisholt Novice
04. april 2001 - 07:50 #3
Hov en lille fejl
AddDrive(9 skal se sådan her ud :

  procedure AddDrive(const VolName: string);
  begin
    case DriveType of
      dtFloppy:
        Icons[Current] := ExtractIcon(Handle, PChar(GetSystemDirectory + \'\\Shell32.dll\'), 6 + Integer(DriveNum > 2));
      dtFixed:
        Icons[Current] := ExtractIcon(Handle, PChar(GetSystemDirectory + \'\\Shell32.dll\'), 8);
      dtNetwork:
        Icons[Current] := ExtractIcon(Handle, PChar(GetSystemDirectory + \'\\Shell32.dll\'), 9);
      dtCDROM:
        Icons[Current] := ExtractIcon(Handle, PChar(GetSystemDirectory + \'\\Shell32.dll\'), 11);
      dtRAM:
        Icons[Current] := ExtractIcon(Handle, PChar(GetSystemDirectory + \'\\Shell32.dll\'), 12);
    end;

    inc(Current);
    ListBox1.Items.Add(Format(\'%s: %s\',[DriveChar, VolName]));
  end;

En passende øvelse for dig ville være at forklare den måbende hob forskellen .....

Jens B
Avatar billede psv Nybegynder
05. april 2001 - 13:42 #4
borrisholt: Jeg har point til dig hvis du kan fortælle mig hvordan jeg graver ikonet for eks. en gif fil frem... Ikke fra filen men fra .gif associationen??
Avatar billede borrisholt Novice
05. april 2001 - 13:53 #5
hvordan man graver der frem direkte fra .gif associationen ved jeg ikke men det her er lige så godt :

(Et lille hack)

uses
  ShellApi;

Function GetTempPath : String;
begin
  SetLength(Result, MAX_PATH);
  Windows.GetTempPath(MAX_PATH, PChar(Result));
  SetLength(Result, Pred(Pos(#0,Result)));
end;

procedure MakeBlankFile(const Name: string);
var
  tf: textfile;
  path: string;
begin
  path := ExtractFilePath(Name);
  AssignFile(tf,Name);
  ReWrite(tf);
  CloseFile(tf);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName : TFileName;
  Dummy : Word;
begin
  FileName := GetTempPath+\'tmp.gif\';
  MakeBlankFile(FileName);
  Image1.Picture.Icon.Handle := ExtractAssociatedIcon(hInstance,pointer(FileName),Dummy);
  DeleteFile(FileName);
end;

Jens B
Avatar billede psv Nybegynder
05. april 2001 - 14:08 #6
Dumt spørgsmål: Jeg vil gerne ende med at ha\' en 16x16 bitmap og metoden giver en 32x32 icon.

Jeg føler mig ude på dybt vand :-)
Avatar billede dl Nybegynder
05. april 2001 - 22:37 #7
Ja koden er næsten godt nok.
Jag man ikke lave den sådan at den ikke går ud og læser på A:, men den skal stadig finde ud afn om der findes et a: og b: Drev.
Og så har jeg fundet ud af at jeg gerne vil have det ud i en listview, med Volume navn, og i den anden col. og det er en CD, Harddisk, eller en 3,5 diskette.

Kan i finde ud af det?
PS. Og gerne et eksemplen.
Avatar billede dl Nybegynder
05. maj 2001 - 12:26 #8
Er der ikke nogen der kan finde ud af det????
Avatar billede martinlind Nybegynder
05. maj 2001 - 14:58 #9
dl >> Skal du havde ALT på et sølvfad ?
Avatar billede dl Nybegynder
05. maj 2001 - 19:48 #10
Ja, helst...

i dette sp.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester