Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bevel auf einem Rechteck (https://www.delphipraxis.net/177088-bevel-auf-einem-rechteck.html)

Chris211183 15. Okt 2013 12:06

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

stahli 15. Okt 2013 12:16

AW: Bevel auf einem Rechteck
 
Schau Dir doch mal Paint von TPanel an.
Dort wird das ja gemacht.

DeddyH 15. Okt 2013 12:23

AW: Bevel auf einem Rechteck
 
Frame3D hast Du schon versucht?

Chris211183 15. Okt 2013 12:27

AW: Bevel auf einem Rechteck
 
:thumb: Nein, das hatter noch nicht gemacht, aber das wird gleich mal gemacht !

Danke, manchmal Hilft nen kleiner Denkanstoß !

Chris211183 15. Okt 2013 13:05

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...

DeddyH 15. Okt 2013 13:30

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:
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;
Somit wird das Ding gelb gefüllt, und in der Mitte erscheint so ein Frame mit Kantenlänge 50 Pixel, siehe Screenshot.

Chris211183 15. Okt 2013 13:40

AW: Bevel auf einem Rechteck
 
Alles klar,

super vielen Dank !!!:bounce2:

Chris

Chris211183 21. Okt 2013 09:28

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

DeddyH 21. Okt 2013 09:32

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;

himitsu 21. Okt 2013 09:42

AW: Bevel auf einem Rechteck
 
Zitat:

Beispiel (TMyCompo ist von TGraphicControl abgeleitet, es wurde nur die Paint-Methode überschrieben):
Bei der Deklaration der Methode hast du natürlich auch nicht das override vergessen?

DeddyH 21. Okt 2013 09:44

AW: Bevel auf einem Rechteck
 
Oder das Setzen des Parents? Das wäre mein erster Verdacht.

Chris211183 21. Okt 2013 12:19

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 :!::!::!:

Chris211183 21. Okt 2013 12:21

AW: Bevel auf einem Rechteck
 
ne den Parent habe ich auch !
Daher ja meine Verzweiflungen :-)

DeddyH 21. Okt 2013 12:22

AW: Bevel auf einem Rechteck
 
Nochmal im Ganzen:
Delphi-Quellcode:
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;
Damit sollte in etwa das Bild aus meinem Screenshot erscheinen. Allerdings habe ich das jetzt gerade schnell im Editor zusammenkopiert, daher ohne Gewähr.

himitsu 21. Okt 2013 14:23

AW: Bevel auf einem Rechteck
 
Zitat:

Zitat von DeddyH (Beitrag 1232617)
Nochmal im Ganzen:

Und das FormCreate muß im OI am OnCreate der Form angehängt sein.

DeddyH 21. Okt 2013 14:25

AW: Bevel auf einem Rechteck
 
Das versteht sich ja wohl von selbst.

himitsu 21. Okt 2013 16:35

AW: Bevel auf einem Rechteck
 
Zitat:

Zitat von DeddyH (Beitrag 1232631)
Das versteht sich ja wohl von selbst.

Das hatte ich auch mal gedacht, aber wurde eines Besseren belehrt. :stupid:

Chris211183 22. Okt 2013 10:44

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.

DeddyH 22. Okt 2013 10:47

AW: Bevel auf einem Rechteck
 
Vielleicht hat himitsu doch Recht. Ist das OnCreate-Ereignis des Formulars auch mit der FormCreate-Methode verknüpft (Objektinspektor)?

baumina 22. Okt 2013 10:57

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.

Chris211183 22. Okt 2013 11:03

AW: Bevel auf einem Rechteck
 
:witch: jetzt ja


:wall:

ohhh mannnn eyyyyyyyyyy


Danke :lol::lol::lol::lol:

Chris211183 23. Okt 2013 10:17

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:
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);
kann ich das einfach lösen (mit if else Anweisungen) oder muss ich da noch ewig rumdoktern :?:

baumina 23. Okt 2013 10:33

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);

DeddyH 23. Okt 2013 10:47

AW: Bevel auf einem Rechteck
 
Du könntest SetBounds überschreiben und darin Invalidate aufrufen.

Chris211183 23. Okt 2013 10:50

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 :|

DeddyH 23. Okt 2013 10:52

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;

baumina 23. Okt 2013 10:59

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);

Chris211183 23. Okt 2013 11:02

AW: Bevel auf einem Rechteck
 
Probiers mal aus !

Vielen Dank euch Beiden !!!

bcvs 23. Okt 2013 11:04

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);

Chris211183 23. Okt 2013 11:20

AW: Bevel auf einem Rechteck
 
:thumb::thumb::thumb:

habs hinbekommen !!!

:P

stahli 23. Okt 2013 11:26

AW: Bevel auf einem Rechteck
 
Ich würde es insgesamt etwas aufräumen:

Delphi-Quellcode:
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);
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. ;-)

DeddyH 23. Okt 2013 12:23

AW: Bevel auf einem Rechteck
 
Zitat:

Zitat von stahli (Beitrag 1232863)
Delphi-Quellcode:
inherited; // "paint;" KANN entfallen - benötigt wird das nur Funktionen: Result := inherited MyFunction(MyParam);

:shock: Das kann dann entfallen, wenn man die geerbte Routine aus irgendwelchen Gründen nicht durchlaufen will, das hat aber mit Funktionsergebnissen nichts zu tun.

Chris211183 23. Okt 2013 12:39

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

baumina 23. Okt 2013 12:43

AW: Bevel auf einem Rechteck
 
Delphi-Quellcode:
procedure Frame3D(Canvas: TCanvas; var Rect: TRect; TopColor, BottomColor: TColor; Width: Integer);
d.h. der letzte Parameter erwartet die Breite

Chris211183 23. Okt 2013 12:56

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

baumina 23. Okt 2013 12:59

AW: Bevel auf einem Rechteck
 
:?: :?: :?: Nochmal bitte Code posten, ich komm nicht mit :stupid:

Chris211183 23. Okt 2013 13:23

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

Chris211183 23. Okt 2013 14:06

AW: Bevel auf einem Rechteck
 
Habs :stupid::stupid::stupid:, trotzdem Danke für Deine Mühe :thumb:

stahli 23. Okt 2013 14:09

AW: Bevel auf einem Rechteck
 
Meinst Du so:

Delphi-Quellcode:
  R := Rect(10, 10, Width - 10, Height - 10);
Sonst zeig mal einen Screenshot oder Skizze.


(schicke es mal trotz Überschneidung ab, falls doch nochmal Fragen auftauchen)

Chris211183 24. Okt 2013 10:16

AW: Bevel auf einem Rechteck
 
hab Dir ne PN gesendet !


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr.
Seite 1 von 2  1 2      

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