Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Mehrere Icons nebeneinander darstellen (https://www.delphipraxis.net/136948-mehrere-icons-nebeneinander-darstellen.html)

turboPASCAL 11. Jul 2009 21:26

Re: Mehrere Icons nebeneinander darstellen
 
Man könnte ja auch so:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TIconBar = class(TGraphicControl)
  private
    FIconSize: integer;
    FIconSpace: integer;
    FClickedIndex: integer;
    FIconArray: Array of HIcon;
    procedure Sort;
    procedure SetIconSpacer(Value: integer);
  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure AddIcon(Icon: HIcon);
    procedure DeleteIcon(Index: integer);
    property IconSize: integer read FIconSize;
    property ClickedIndex: integer read FClickedIndex;
    property IconSpacer: integer read FIconSpace write SetIconSpacer;
  end;

var
  Form1: TForm1;
  IconBar: TIconBar;

implementation

{$R *.dfm}

constructor TIconBar.Create;
begin
  inherited Create(Owner);

  FIconSize := 32;
  FIconSpace := 5;

  Width := FIconSize;
  Height := FIconSize;
end;

destructor TIconBar.Destroy;
var i: integer;
begin
  for i := 0 to length(FIconArray)-1 do
    DeleteObject(FIconArray[i]);
  SetLength(FIconArray, 0);

  inherited Destroy;
end;

procedure TIconBar.Sort;
var i,j,help, entrys: cardinal;
begin
  Entrys := length(FIconArray)-1;
  if Entrys > 0 then
  begin
    for i := 0 to Entrys - 1 do
      for j := i + 1 to Entrys do
        if FIconArray[i] < FIconArray[j] then
        begin
          help := FIconArray[i];
          FIconArray[i] := FIconArray[j];
          FIconArray[j] := help;
        end;
  end;
end;

procedure TIconBar.SetIconSpacer(Value: integer);
begin
  FIconSpace := Value;
end;

procedure TIconBar.Paint;
var i: integer;
begin
  Canvas.Brush.Color := Color;
  Canvas.Brush.Style := bsSolid;
  Canvas.FillRect(ClientRect);

  for i := 0 to length(FIconArray)-1 do
    DrawIconEx(Canvas.Handle, i * (FIconSize + FIconSpace), 0, FIconArray[i], FIconSize, FIconSize, 0, 0, DI_NORMAL);
end;

procedure TIconBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

end;

procedure TIconBar.AddIcon;
begin
  Width := length(FIconArray) * (FIconSize + FIconSpace) + FIconSize;
  SetLength(FIconArray, length(FIconArray) + 1);
  FIconArray[length(FIconArray)-1] := Icon;
  Invalidate;
end;

procedure TIconBar.DeleteIcon;
begin
  // todo:

  if (index >= 0) and (index < length(FIconArray)) then
  begin
    DeleteObject(FIconArray[index]);
    FIconArray[index] := 0;

    // (Re) Sort ... die Lücke muss nach oben
    Sort;

    // Löschen des Null-Eintrags
    SetLength(FIconArray, length(FIconArray));

    Width := length(FIconArray) * (FIconSize + FIconSpace) - FIconSpace;
    Invalidate;
  end;
end;

// -------------------------------------------------------------------------//

procedure TForm1.FormCreate(Sender: TObject);
begin
  IconBar := TIconBar.Create(Self);
  IconBar.Top := 40;
  IconBar.Left := 40;
  IconBar.Parent := Self;
  IconBar.AddIcon( LoadIcon(0, IDI_APPLICATION) );
  IconBar.AddIcon( LoadIcon(0, IDI_ASTERISK) );
  IconBar.AddIcon( LoadIcon(0, IDI_EXCLAMATION) );
  IconBar.AddIcon( LoadIcon(0, IDI_HAND) );
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  IconBar.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  IconBar.DeleteIcon(1);
end;

schwa226 11. Jul 2009 21:54

Re: Mehrere Icons nebeneinander darstellen
 
Danke!

Habe jetzt beide Ausprobiert!

Bei der Toolbox habe ich das Problem, dass die neuen Icons immer links, also Index = 0 hinzugefügt werden!
Kann man das umstellen, dass die Icons immer am Ende hinzugefügt werden?
Denn sonst ist es ja genau anders rum wie mein Dyn Array.

Auch schaffe ich es nicht die Icon Größe zu verändern.
Ich möchte gern die Icons mit 32x32 darstellen.



Die zweite Methode schaut auch gut aus, aber da habe ich das nächste Problem: ToolTip zu jedem Icon.
Wie erkenne ich auch auf welches Icon mit der Mouse gedrückt wurde?

Andreas L. 11. Jul 2009 22:00

Re: Mehrere Icons nebeneinander darstellen
 
Zitat:

Zitat von schwa226

Bei der Toolbox habe ich das Problem, dass die neuen Icons immer links, also Index = 0 hinzugefügt werden!
Kann man das umstellen, dass die Icons immer am Ende hinzugefügt werden?
Denn sonst ist es ja genau anders rum wie mein Dyn Array.

Entweder mit ToolButton.Left oder ToolButton.Index an die richtige Position schieben.
Zitat:

Zitat von schwa226
Auch schaffe ich es nicht die Icon Größe zu verändern.
Ich möchte gern die Icons mit 32x32 darstellen.

Delphi-Quellcode:
ToolButton.AutoSize := True;
Toolbar.AutoSize := True;
ImageList.Width := 32;
ImageList.height := 32;
Du könntest dir auch mal tListView mit ViewStyle := vsLargeIcons anschauen.

schwa226 11. Jul 2009 22:29

Re: Mehrere Icons nebeneinander darstellen
 
Tut leid aber,

Index kann nichts zugewiesen werden.

Das mit der Größe geht auch nicht.

Wenn ich dem TIcon sagen will das es 32x32 sein soll gibt es ein Fehler: Göße kann nicht geändert werden.

Wenn ich nun also das 16x16 Icon auf die ImageList mit 32x32 lege bekomme ich auch einen Error, da unterschiedliche Größe :wall:

Andreas L. 12. Jul 2009 09:33

Re: Mehrere Icons nebeneinander darstellen
 
Zitat:

Zitat von schwa226
Tut leid aber,

Index kann nichts zugewiesen werden.

Dann machs mit Left oder schau dir die anderen Methoden / Eigenschaften von TToolButton und TToolbar an. Steht recht ausführlich in der Delphi-Hilfe und genügend Beispiele findet man hier im Forum auch...
Zitat:

Zitat von schwa226
Das mit der Größe geht auch nicht.

Wenn ich dem TIcon sagen will das es 32x32 sein soll gibt es ein Fehler: Göße kann nicht geändert werden.

Wenn ich nun also das 16x16 Icon auf die ImageList mit 32x32 lege bekomme ich auch einen Error, da unterschiedliche Größe :wall:

Wie holst du dir denn das Icon-Handle?

schwa226 12. Jul 2009 09:54

Re: Mehrere Icons nebeneinander darstellen
 
Hab es nun so gelößt:

ich steppe mein Array durch bis ich das richtige Item gefunden habe, dann:

ButtonIndex := Buttoncount - i - 1.

Das geht so ganz gut!

Die HIcons bekomme ich von der TNA, TNotificationData. Und da sind nur die Handles von den 16x16 Icons drinnen.
Man müsste also das Icon Stretchen.

Andreas L. 12. Jul 2009 10:27

Re: Mehrere Icons nebeneinander darstellen
 
Zitat:

Zitat von schwa226
Hab es nun so gelößt:

ich steppe mein Array durch bis ich das richtige Item gefunden habe, dann:

ButtonIndex := Buttoncount - i - 1.

Das geht so ganz gut!

Die HIcons bekomme ich von der TNA, TNotificationData. Und da sind nur die Handles von den 16x16 Icons drinnen.
Man müsste also das Icon Stretchen.

Du kannst bestimmt die Dateinamen der dort angezeigten Programme ermitteln, also kannst du dir auch 32er Bildchen holen...

schwa226 12. Jul 2009 10:57

Re: Mehrere Icons nebeneinander darstellen
 
Ich glaube das ist ein Problem,

den die Icons der gleichen Application ändern sich!
D.H. die exe bleibt die gleiche aber das Icon-Handle ändert sich.

Andreas L. 12. Jul 2009 11:04

Re: Mehrere Icons nebeneinander darstellen
 
Zitat:

Zitat von schwa226
Ich glaube das ist ein Problem,

den die Icons der gleichen Application ändern sich!
D.H. die exe bleibt die gleiche aber das Icon-Handle ändert sich.

Dann musst du Bilder eben strecken. Hier im Forum suchenStretchDraw

schwa226 12. Jul 2009 17:03

Re: Mehrere Icons nebeneinander darstellen
 
Danke!

WErds mir noch ansehen!

Jetzt habe ich dazu noch eine Frage. Wie geht das dann bei der Toolbar mit OnMouseDown?
Wie finde ich heraus welcher Button gedrückt wurde?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz