Autor Beitrag
Timbo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: Mi 06.10.04 09:56 
moin,

weiß jemand, wie ich ein reines bild als button verwende?
muss ja bei runden button auch noch transparenz hinbekommen.
dann brauche ich noch die möglichkeit pro button drei bilder anzuzeigen:
1. normal
2. onMouseOver
3. onMousePress

logisch brauche ich auch noch onClick umd die gewünschte funktion auszuführen.

irgendwie funzt die suche im forum nicht richtig...
bekomme immer nur ganz wenig treffer, bei button z.B. 2 treffer...
das war früher doch nicht so.


vielen dank.
tim.


Zuletzt bearbeitet von Timbo am Mi 06.10.04 19:22, insgesamt 2-mal bearbeitet
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 06.10.04 10:24 
Vielleicht hilft dir ja schon TSpeedButton weiter. Dort gibt es eine Eigenschaft MouseInControl. Bilder sind dort auch möglich. Ob das allerdings so ist, wie du dir das vorstellst, weiß ich nicht.
Ansonsten bastel doch mal eine neue Komponente :wink:
Snoopie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

XP Prof
D7 Ent
BeitragVerfasst: Mi 06.10.04 10:31 
Nimm doch einen "normalen" TBitBtn (Register Zusätzlich). Mach keine Caption rein, sondern nur Dein Bild (Glyph). (SpeedBtn ist, soweit ich gelesen habe, für XP-Stil nicht geeignet.) :wink:

Mach den Button etwas breiter und höher als Dein Bild, damit der Rand des Buttons gut sichtbar ist, dann hast Du mit XP-Stil beim Drüberfahren mit der Maus die Färbung des Buttonrandes etc. Dann musst Du Dich auch nicht um ein MouseOver kümmern (Die Controls haben nur den Event OnMouseMove, kein OnMouseOver, OnMouseEnter, OnMouseOut o.ä., gilt auch für das Bild TImage)

Mit Numglyphs=2 und dem Verbreitern des Bildes kannst Du z.B. in der rechten Hälfte des Bildes eine Graustufenversion für den deaktivierten Button einstellen (siehe auch Delphi-Hilfe zu NumGlyphs).

OnClick ist das Ereignis für Deinen Code beim Drücken des Buttons (Maus oder Taste). OnClick wäre auch für TImage vorhanden...

TImage hat übrigens, soweit ich weiß, keinen TabStop, d.h. die Bedienung via Tastatur müsstest Du bei Benutzung des Bildes auch irgendwie behandeln...
8)

_________________
Snoopie
Timbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: Mi 06.10.04 18:53 
so hab das jetzt gelöst, habe die TImage komponente genommen.
habe ausgenutzt, das onmousemove nur über den entsprechenden komponente ausgeführt wird.
nun kann man jeden beliebigen button erzeugen (auch XP button unter win 95) :lol:

ausblenden volle Höhe 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:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
unit UArtikel;
//beispiel um images als button zu "missbrauchen"
//man kann sich dann seine button einfach in photoshop bauen
//das einzige was noch fehlt ist ein topstop, sonst hat man ja alles
//was der button auch hat

//man kann beliebig viele images verwenden.
//WICHTIG jedes Image muss im Tag-Property im objectinspector durchnummertiert sein
//beginnend mit 1. die gesamtanzahl bei der constanten "AnzahlBilder" eintragen.
//dann braucht man noch ein image wo der name "Dummy" lauten muss Tag auf 1 setzen
//im OnFormCreate müssen dann die images entsprechend initialisiert werden.
//in diesem beispiel sind 2 Image plus den Dummy

//Tim Hansen 6.10.2004 tim@junk-food.de

interface

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

type
  TFArtikel = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Dummy: TImage;
    procedure FormCreate(Sender: TObject);
    procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure MyMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure MyMouseMoveInnerhalb(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure MyMouseMoveAusserhalb(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FArtikel: TFArtikel;

implementation

{$R *.dfm}

const
  AnzahlBilder= 2;

type
 TPicRec = record
    Norm, Over, Press: TPicture;
   end;
  TPicRecArray = array[1..AnzahlBilder] of TPicRec;

  TPicPathArray= array[1..(AnzahlBilder*3)] of String;

const
  //sämtliche bilder dateien
  PicPathArray: TPicPathArray = ('Button1Norm.bmp',
                                  'Button1Over.bmp',
                                  'Button1Press.bmp',
                                  'Button2Norm.bmp',
                                  'Button2Over.bmp',
                                  'Button2Press.bmp');
var
  OldFormCords, OldImageCords: Integer;
  HightlightImage: TImage;
  Pics: TPicRecArray;

procedure TFArtikel.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  i:= 1;
  //das Pics Array mit mit allen werten gefüllt.
  while i <= AnzahlBilder do begin
    Pics[i].Norm:=TPicture.Create;
    Pics[i].Norm.LoadFromFile(PicPathArray[((i-1)*3)+1]);
    Pics[i].Over:=TPicture.Create;
    Pics[i].Over.LoadFromFile(PicPathArray[((i-1)*3)+2]);
    Pics[i].Press:=TPicture.Create;
    Pics[i].Press.LoadFromFile(PicPathArray[((i-1)*3)+3]);
    inc(i);
  end;

  //Image Initialisieren und grösse anpassen
  Image1.Picture:= Pics[1].Norm;
  Image1.Width:= Pics[1].Norm.Width;
  Image1.Height:= Pics[1].Norm.Height;
  
  Image2.Picture:= Pics[2].Norm;
  Image2.Width:= Pics[2].Norm.Width;
  Image2.Height:= Pics[2].Norm.Height;

  //die beiden werte zur überprüfung der mausbewegungen
  OldFormCords:= 0;
  OldImageCords:= 0;

  //wird nur als dummy zum rücksetzen benötigt
  HightlightImage:= Dummy;
end;

procedure TFArtikel.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  TImage(Sender).Picture:= Pics[TImage(Sender).Tag].Press;
end;

procedure TFArtikel.MyMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  TImage(Sender).Picture:= Pics[TImage(Sender).Tag].Over;
end;

//alle images, die bilbwechsel machen sollen müssen diese funktion im
//OnMouseMove haben, einfach im objectinspector auswählen
procedure TFArtikel.MyMouseMoveInnerhalb(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  //zunächst prüfen, ob bild schon gesetzt wurde
  //dann schauen ob muas koordinaten sich geändert haben
  if (HightlightImage.Name <> TImage(Sender).Name) AND (X+Y <> OldImageCords) then begin
    //rücksetzen des alten images
    HightlightImage.Picture:= Pics[HightlightImage.Tag].Norm;
    //over image für aktuelles bild
    TImage(Sender).Picture:= Pics[TImage(Sender).Tag].Over;
    //aktuelles image auf highlight setzen
    HightlightImage:= TImage(Sender);
  end;
end;

//das formular und alle sachen, die direkt an die images angrenzen müssen diese funktion im
//OnMouseMove haben, einfach im objectinspector auswählen
procedure TFArtikel.MyMouseMoveAusserhalb(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i: Integer;
begin
  //ist schon rückgesetzt?
  //maus bewegt sich ausserhalb der images
  if (HightlightImage.Name <> Dummy.Name) AND (X+Y <> OldFormCords) then begin
    HightlightImage.Picture:= Pics[HightlightImage.Tag].Norm;
    HightlightImage:= Dummy;
  end;
end;

end.


nur tabstops funzen damit nicht, ist bei mir aber nicht so schlimm

und das man in onformcreate alle images für die erste anzeige einzeln initialsieren muss stört mich noch.
wie kann man denn alle images durchlaufen, oder wat?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 06.10.04 19:19 
Hallo, Timbo!

Es ist nicht nötig, hinter den Titel des Topics "gelöst" zu schreiben. Du kannst das Topic entsprechend markieren, indem Du auf den grünen Haken in Deinem ersten Posting klickst!

MfG
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Timbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: Mi 06.10.04 19:23 
ok, erledigt...
Snoopie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

XP Prof
D7 Ent
BeitragVerfasst: Do 07.10.04 08:21 
ist zwar erledigt, aber trotzdem noch Tipps:

Falls Du doch den Tabstop brauchst, leg doch "hinter" das Bild ein Element, das Tabstop haben kann, z.B. ein Panel. Allerdings hat das Panel kein OnKeyDown, könnte aber über das OnKeyDown der Form erledigt werden. Anzeigeänderung beim OnEnter und OnExit, damit man sieht, dass die TabPosition "auf" dem Button liegt.

Die Bilder könntest Du auch in eine ImageList laden, dann musst Du nicht jedes Bild einzeln initialisieren. :wink:

_________________
Snoopie
Timbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: Do 07.10.04 10:11 
mit dem tabstop ist nee gute idee...
meinst du die images in ein const array und dann das durchlaufen?
stimmt, dann könnt ich die drei werte in einer schleife setzen und müßte nur einmal das array füllen.