![]() |
Bevel auf einem Rechteck
Hallo, ich mache gerade eine Komponente welche von TGraphicControl abgeleitet sein soll.
Frage: Wie kann ich einen Bevel auf einem Rechteck darstellen ? Jemand eine Ahnung ? :wall:Chris |
AW: Bevel auf einem Rechteck
Schau Dir doch mal Paint von TPanel an.
Dort wird das ja gemacht. |
AW: Bevel auf einem Rechteck
![]() |
AW: Bevel auf einem Rechteck
:thumb: Nein, das hatter noch nicht gemacht, aber das wird gleich mal gemacht !
Danke, manchmal Hilft nen kleiner Denkanstoß ! |
AW: Bevel auf einem Rechteck
Okay, hab mir das mal angesehen, wobei ich da nicht so wirklich was mit anfangen kann....
hab mir jetzt eine procedure geschrieben, bloß wie sag ich Ihm jetzt, dass er mir sowas dann auch zur Laufzeit auf den Schirm beamt ? wie geht sowas ? Am Ende soll ein 45x145 großes Rechteck zu sehen sein, wo in der Mitte so ein Frame drauf ist... |
AW: Bevel auf einem Rechteck
Liste der Anhänge anzeigen (Anzahl: 1)
Beispiel (TMyCompo ist von TGraphicControl abgeleitet, es wurde nur die Paint-Methode überschrieben):
Delphi-Quellcode:
Somit wird das Ding gelb gefüllt, und in der Mitte erscheint so ein Frame mit Kantenlänge 50 Pixel, siehe Screenshot.
procedure TMyCompo.Paint;
var R: TRect; begin inherited; Canvas.Brush.Color := clYellow; Canvas.FillRect(Rect(0, 0, Width, Height)); R := Rect((Width - 50) div 2, (Height - 50) div 2, (Width + 50) div 2, (Height + 50) div 2); Frame3D(Canvas, R, $00DADADA, clDkGray , 1); end; |
AW: Bevel auf einem Rechteck
Alles klar,
super vielen Dank !!!:bounce2: Chris |
AW: Bevel auf einem Rechteck
Hallo,
habe bis jetzt alles gut hinbekommen, bloß auf meinem Testformular wird nichts angezeigt. kann leider keinen Code posten, da ich von hier grad nicht auf meinen Quellcode zugreifen kann :-/ Wie sah denn deine Testunit aus @DaddyH (damit ich meine vergleichen kann) ? Habe auch die PaintMethode überschrieben und meine Werte alles gesetzt, auch wenn ich den Rest ausblende, damit mir nur mein Bevel angezeigt wird, machter Compiler nichts... (egal was ich bis jetzt versucht habe, ... Chris |
AW: Bevel auf einem Rechteck
Das müsste ungefähr so ausgesehen haben:
Delphi-Quellcode:
type
TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FTest: TMyCompo; end; ... procedure TForm1.FormCreate(Sender: TObject); begin FTest := TMyCompo.Create(self); FTest.Width := 200; FTest.Height := 200; FTest.Parent := self; end; |
AW: Bevel auf einem Rechteck
Zitat:
|
AW: Bevel auf einem Rechteck
Oder das Setzen des Parents? Das wäre mein erster Verdacht.
|
AW: Bevel auf einem Rechteck
Hi deddyH,
danke ! Nein habe ich nicht ! Meins sieht aber auch so aus, ich schnüffel da heute Abend nochmal durch, irgendwie is das komisch ! Melde mich dann nochmal, obs klappt oder wo der Fehler lag :!::!::!: |
AW: Bevel auf einem Rechteck
ne den Parent habe ich auch !
Daher ja meine Verzweiflungen :-) |
AW: Bevel auf einem Rechteck
Nochmal im Ganzen:
Delphi-Quellcode:
Damit sollte in etwa das Bild aus meinem Screenshot erscheinen. Allerdings habe ich das jetzt gerade schnell im Editor zusammenkopiert, daher ohne Gewähr.
type
TMyCompo = class(TGraphicControl) protected procedure Paint; override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FTest: TMyCompo; end; ... procedure TMyCompo.Paint; var R: TRect; begin inherited; Canvas.Brush.Color := clYellow; Canvas.FillRect(Rect(0, 0, Width, Height)); R := Rect((Width - 50) div 2, (Height - 50) div 2, (Width + 50) div 2, (Height + 50) div 2); Frame3D(Canvas, R, $00DADADA, clDkGray , 1); end; procedure TForm1.FormCreate(Sender: TObject); begin FTest := TMyCompo.Create(self); FTest.Width := 200; FTest.Height := 200; FTest.Parent := self; end; |
AW: Bevel auf einem Rechteck
Zitat:
|
AW: Bevel auf einem Rechteck
Das versteht sich ja wohl von selbst.
|
AW: Bevel auf einem Rechteck
Zitat:
|
AW: Bevel auf einem Rechteck
Hab da mal zusammenkopiert und dennoch nix (bin ich zu dämlich ?)
Istbestimmt wieder ein Anfängerfehler :roll:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Math, ExtCtrls; Type TMyCompo = class(TGraphicControl) protected procedure Paint; override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FTest: TMyCompo; end; var Form1: TForm1; implementation {$R *.dfm} procedure TMyCompo.Paint; var R: TRect; begin inherited; Canvas.Brush.Color := clred; Canvas.FillRect(Rect(0, 0, Width, Height)); R := Rect((Width - 50) div 2, (Height - 50) div 2, (Width + 50) div 2, (Height + 50) div 2); Frame3D(Canvas, R, clblack ,clyellow , 3); end; procedure TForm1.FormCreate(Sender: TObject); begin FTest := TMyCompo.Create(self); FTest.Width := 200; FTest.Height := 200; FTest.Parent := self; end; end. |
AW: Bevel auf einem Rechteck
Vielleicht hat himitsu doch Recht. Ist das OnCreate-Ereignis des Formulars auch mit der FormCreate-Methode verknüpft (Objektinspektor)?
|
AW: Bevel auf einem Rechteck
Klicke auf das Formular und gehe im Objektinspektor unter Ereignisse auf das Ereignis "OnCreate" und mache da einen Doppelklick, so dass in der .DFM folgende Zeile eingefügt wird : OnCreate = FormCreate.
Daraufhin müsste das Ganze klappen. |
AW: Bevel auf einem Rechteck
:witch: jetzt ja
:wall: ohhh mannnn eyyyyyyyyyy Danke :lol::lol::lol::lol: |
AW: Bevel auf einem Rechteck
Sodele, alles funzt in meier Komponente, nur wenn ich meinen Rahmen größer ziehe, bleibt mein Bevel in der Größe und vergrößert sich nicht mit...
Delphi-Quellcode:
kann ich das einfach lösen (mit if else Anweisungen) oder muss ich da noch ewig rumdoktern :?:
procedure THixBarGraph.Paint;
var R: TRect; begin inherited paint; if (Parent = NIL) or not visible then exit; Canvas.Brush.Color := clBtnFace; Canvas.FillRect(Rect(0, 0, Width, Height)); R := Rect((Width - 9) div 2, (Height - 133) div 2, (Width + 9) div 2, (Height + 133) div 2); Frame3D(Canvas, R, clBtnShadow ,clBtnHighlight , 1); |
AW: Bevel auf einem Rechteck
Rechne einfach nicht wie wild die Koordinaten für dein Rectangle aus, sondern nimm einfach nur
Delphi-Quellcode:
R := Rect(1, 1, Width - 1, Height - 1);
|
AW: Bevel auf einem Rechteck
Du könntest SetBounds überschreiben und darin Invalidate aufrufen.
|
AW: Bevel auf einem Rechteck
@Baumina, dann hätte ich ja nur ein Rahmen den ich verändern kann, ich habe aber einen Rahmen auf einem Rechteck, welcher sich mit vergrößerung des Rechteckes auh proportional verändern soll.
@DeddyH, nein habe ich nicht, das sagt mir auch nichts :| |
AW: Bevel auf einem Rechteck
Delphi-Quellcode:
type
THixBarGraph = class(TGraphicControl) ... public procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; ... end; ... procedure THixBarGraph.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin inherited; Invalidate; end; |
AW: Bevel auf einem Rechteck
Meiner Meinung nach verhält sich ist mein Vorschlag proportional zur Größe des Rechtecks:
Delphi-Quellcode:
procedure THixBarGraph.Paint;
var R: TRect; begin inherited paint; if (Parent = NIL) or not visible then exit; Canvas.Brush.Color := clBtnFace; Canvas.FillRect(Rect(0, 0, Width, Height)); // so hast du es im Moment : // Links = (Width - 9) div 2 // Oben = (Height - 133) div 2 R := Rect((Width - 9) div 2, (Height - 133) div 2, // Rechts = (Width + 9) div 2 // Unten = (Height + 133) div 2 (Width + 9) div 2, (Height + 133) div 2); // und so wäre mein Vorschlag: // 1 Links innerhalb vom Rechteck // 1 Oben innerhalb vom Rechteck // Rechts die Breite vom Rechteck-1 // Unten die Höhe von vom Rechteck-1 R := Rect(1, 1, Width - 1, Height - 1); Frame3D(Canvas, R, clBtnShadow ,clBtnHighlight , 1); |
AW: Bevel auf einem Rechteck
Probiers mal aus !
Vielen Dank euch Beiden !!! |
AW: Bevel auf einem Rechteck
Dann darsft du halt nicht mit absoluten Werten rechnen (Height - 133) sondern musst alle Werte mit einem Faktor von Width und Height ableiten, z.B. so:
Delphi-Quellcode:
R:=Rect (Width div 3, Height div 3, Width - Width div 3, Height - Height div 3);
|
AW: Bevel auf einem Rechteck
:thumb::thumb::thumb:
habs hinbekommen !!! :P |
AW: Bevel auf einem Rechteck
Ich würde es insgesamt etwas aufräumen:
Delphi-Quellcode:
Dann hast Du zwar zwei Variablen mehr, aber das Ganze wird m.E. etwas übersichtlicher und bei späteren Änderungen versteht man den eigenen Code besser. ;-)
procedure THixBarGraph.Paint;
var R: TRect; H, W: Integer; begin inherited; // "paint;" KANN entfallen - benötigt wird das nur Funktionen: Result := inherited MyFunction(MyParam); if (Parent = nil) or (not Visible) then Exit; Canvas.Brush.Color := clBtnFace; Canvas.FillRect(Rect(0, 0, Width, Height)); H := (Height div 10) div 2; // wenn die Bevelhöhe z.B. 1/10 sein soll W := (Width div 10) div 2; R := Rect((Width div 2) - W, (Height div 2) - H, (Width div 2) + W, (Height div 2) + H); Frame3D(Canvas, R, clBtnShadow ,clBtnHighlight , 1); |
AW: Bevel auf einem Rechteck
Zitat:
|
AW: Bevel auf einem Rechteck
soweit alles schick, er macht bloß Zicken mit der eigentlichen Breite des Rahmens (nicht die Ränder)
hab ne Property mitBarWidth deklariert und im Create auch den festen Wert 10 zugewiesen. Rückgabewert Integer und als Procedure F... := Value; er macht das aber nicht er soll immer 10 breit bleiben, egal was ich tue, aber irgendwie willer nicht |
AW: Bevel auf einem Rechteck
Delphi-Quellcode:
d.h. der letzte Parameter erwartet die Breite
procedure Frame3D(Canvas: TCanvas; var Rect: TRect; TopColor, BottomColor: TColor; Width: Integer);
|
AW: Bevel auf einem Rechteck
ja aber die Breite des Rahmens und nicht die Breite (also die Breite der beiden BevelBegrenzungen), aber nicht die Breite Zwischen denen
|
AW: Bevel auf einem Rechteck
:?: :?: :?: Nochmal bitte Code posten, ich komm nicht mit :stupid:
|
AW: Bevel auf einem Rechteck
:stupid:
es geht nur um die Breite zwischen den Rahmen, das was du meinst, ist die Breite des Rahmens. Also z.B. ein Fotorahmen ist 25cm Breit, davon sind 5cm Rahmen (das ist die BevelWidth), dazwischen passt ein Foto von 15cm das soll meine (BarWidth) sein |
AW: Bevel auf einem Rechteck
Habs :stupid::stupid::stupid:, trotzdem Danke für Deine Mühe :thumb:
|
AW: Bevel auf einem Rechteck
Meinst Du so:
Delphi-Quellcode:
Sonst zeig mal einen Screenshot oder Skizze.
R := Rect(10, 10, Width - 10, Height - 10);
(schicke es mal trotz Überschneidung ab, falls doch nochmal Fragen auftauchen) |
AW: Bevel auf einem Rechteck
hab Dir ne PN gesendet !
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz