Autor |
Beitrag |
Timbo
      
Beiträge: 166
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
|
|
Snoopie
      
Beiträge: 33
XP Prof
D7 Ent
|
Verfasst: 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.)
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...

_________________ Snoopie
|
|
Timbo 
      
Beiträge: 166
|
Verfasst: 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)
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;
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 public 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 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; 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;
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;
OldFormCords:= 0; OldImageCords:= 0;
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;
procedure TFArtikel.MyMouseMoveInnerhalb(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (HightlightImage.Name <> TImage(Sender).Name) AND (X+Y <> OldImageCords) then begin HightlightImage.Picture:= Pics[HightlightImage.Tag].Norm; TImage(Sender).Picture:= Pics[TImage(Sender).Tag].Over; HightlightImage:= TImage(Sender); end; end;
procedure TFArtikel.MyMouseMoveAusserhalb(Sender: TObject; Shift: TShiftState; X, Y: Integer); var i: Integer; begin 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 166
|
Verfasst: Mi 06.10.04 19:23
|
|
Snoopie
      
Beiträge: 33
XP Prof
D7 Ent
|
Verfasst: 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. 
_________________ Snoopie
|
|
Timbo 
      
Beiträge: 166
|
Verfasst: 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.
|
|
|