Entwickler-Ecke

Sonstiges (Delphi) - Zugriff auf OnClick über erstellte Komponente


DaKirsche - Fr 23.11.07 14:20
Titel: Zugriff auf OnClick über erstellte Komponente
Hallo Community,
ich habe ein Problem mit der OnClick-Prozedur.

Ich habe mir ein Image auf das Form gesetzt und dieses mit einer OnClick Prozedur versehen.

Ich will einen Dateibrowser zum wählen von Symbolen aus DLLs und Exe-Dateien erstellen, der dann den IconIndex des gewählten Objekts an das aufrufende Form zurückgibt.

In meinem Programm verwende ich ein Array of TImage und weise diesen erstellten Komponeten das OnClick-Event vom Image zu.

Hier erstmal mein Quelltext:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
unit symbloader;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ImgList, ExtCtrls, ShellAPI, Menus;

type
  Tsymbolloader = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    ImageList1: TImageList;
    Image1: TImage;
    Label2: TLabel;
    Panel2: TPanel;
    Panel1: TPanel;
    ScrollBar1: TScrollBar;
    PopupMenu1: TPopupMenu;
    GroupBox1: TGroupBox;
    Image2: TImage;
    procedure ScrollBar1Change(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure LoadIcons(sSourcePath: String);
  end;

var
  symbolloader: Tsymbolloader;
  ImageC: array of TImage;
  aUsedIcon: Integer = 0;
implementation

{$R *.dfm}

procedure Tsymbolloader.Button1Click(Sender: TObject);
begin
Button2Click(Sender);
end;

procedure Tsymbolloader.Button2Click(Sender: TObject);
var i: Integer;
begin
//Images aus Array leeren, bei Beenden
i:=0;
while (symbolloader.FindComponent('iconimage'+inttostr(i))<>nildo
begin
  imageC[i].free;
  Inc(i,1);
end;
symbolloader.Hide;
end;

procedure Tsymbolloader.Image1Click(Sender: TObject);
begin
//Geklicktes Element herausfinden
aUSedIcon:=StrToInt(((Sender)as TImage).Hint);
Image2.Picture.Icon:=((Sender)as TImage).Picture.Icon;
end;

procedure Tsymbolloader.LoadIcons(sSourcePath: String);
var icon: TIcon;
  NumberOfIcons, i: Integer;
begin
Label2.Caption:=' '+ExtractFileName(sSourcePath)+' ';
//Icons aus Datei laden
icon := TIcon.Create;
      try
        //Anzahl der Symbole in Quelldatei
        NumberOfIcons := ExtractIcon(Handle, PChar(sSourcePath), UINT(-1));
        //Arraylänge festlegen
        SetLength(imageC,NumberOfIcons - 1);
        //Untergrundpanel und Scrollbar vorbereiten
        Panel1.Width:=(NumberOfIcons div 6 + 1)*34 + 10;
        panel1.left:=1;
        Scrollbar1.Max:=(NumberOfIcons div 6 + 1);
        Scrollbar1.Position:=0;
        //Symbole in Ansicht laden
        for i := 0 to NumberOfIcons - 1 do
          begin
            icon.Handle := ExtractIcon(Handle, PChar(sSourcePath), i);
            //Wenn Komponente nicht existiert erstellen
            if not (symbolloader.FindComponent('iconimage'+inttostr(i))<>nilthen begin
              imageC[i]:= TImage.Create(Panel1);
              //imageC[i].Parent:=Panel1;
              imageC[i].Name:='iconimage'+inttostr(i);
             OnClick:=Image1Click;
            end;
              //Bild laden und Position ermitteln
              imageC[i].Hint:=IntToStr(i);
              imageC[i].Picture.Icon:=icon;
              imageC[i].width:=32;
              imageC[i].height:=32;
              imageC[i].Center:=True;
              imageC[i].Top:=(i mod 6)*34 + 1;
              imageC[i].Left:=(i div 6)*34 + 1;
          end;
      finally
        icon.Free;
      end;
//1. Bild laden, wenn mind. 1 vorhanden
if NumberOfIcons>0 then
  Image2.Picture.Icon:=imageC[0].Picture.Icon;
  //Formular anzeigen
symbolloader.Show;
end;

procedure Tsymbolloader.ScrollBar1Change(Sender: TObject);
begin
//In Ansicht scrollen
Panel1.Left:=0 - Scrollbar1.Position*32;
end;

end.


Wenn ich auf ein Image in der Ansicht klicke passiert leider nix...kann mir jeman sagen, warum?

Finde den Fehler leider nicht...

MFG
DaKirsche

Im Anhang: Ein Screenshot des Forms.


Moderiert von user profile iconjasocul: Topic aus Dateizugriff verschoben am Fr 23.11.2007 um 13:25


DaKirsche - Fr 23.11.07 16:20

Naja...Kommando zurück;)

Dummer Fehler :
OnClick:=Image1Click;

-->
imageC[i].OnClick:=Image1Click;

-Closed-