AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekt soll sich selber zeichnen

Ein Thema von Hansa · begonnen am 28. Mär 2003 · letzter Beitrag vom 10. Apr 2003
Antwort Antwort
Seite 1 von 2  1 2      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Objekt soll sich selber zeichnen

  Alt 28. Mär 2003, 21:22
Hi,

kann mir da jemand helfen ? Ich will einen farbigen Button produzieren. Der Hintergrund ist der Thread mit OOP. D.h. ich habe eine neue Komponente erstellt, das geht auch schon. Ich kann z.B. einem Memo die Farbe, die im Button definiert ist zuweisen. Nur kriege ich es nicht gebacken, den Button selbst, in der Farbe, die im OI eingestellt ist, darzustellen.

Code:
procedure TFarbButton1.DrawButton (Rect : TRect);
begin
  FCanvas.Brush.Color := FColor;
  FCanvas.Pen.Color := clBlack;
  DrawFocusRect (FCanvas.Handle,Rect);
end;
Das liegt bestimmt an dem DrawFocusRect. 8) FColor ist die Farbe aus dem OI. Leider hab ich mich bisher mit dem Canvas/Rect...Kram nicht befaßt.
Gruß
Hansa
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2
  Alt 1. Apr 2003, 15:00
Hi Hansa,

probier es mal mit folgendem Code:
Delphi-Quellcode:
procedure TFarbButton1.DrawButton (Rect : TRect);
begin
  FCanvas.Brush.Color := FColor;
  FCanvas.Pen.Color := clBlack;
  FCanvas.FillRect(Rect);
end;
Gruß oki
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3
  Alt 1. Apr 2003, 18:04
Hi,

ich habe jetzt eine Canvas in dem Objekt. Aber die DFM sieht so aus :
Code:
  object FarbButton1: TFarbButton
    Left = 88
    Top = 72
    Width = 75
    Height = 25
    Caption = 'FarbButton1'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clSkyBlue
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
    TabOrder = 0
    Color = clFuchsia
  end
Da ist nix zu sehen von Brush, Pen usw. Die Änderungen bei Font sind unsichtbar.
Gruß
Hansa
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4
  Alt 2. Apr 2003, 14:41
Hi Hansa,

da gibt es eigentlich was mit Brush oder TBitmap oder so. Da ist dann irgentwo Canvas oder eigene Methoden zum Füllen des Hintergrundes.
Leider bin ich im Moment etwas knapp mit der Zeit.

Sag aber nochmal von welchem Objekt du Deinen TFarbButton abgeleitet hast.

Gruß oki
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5
  Alt 2. Apr 2003, 15:18
Das ist natürlich von TButton abgeleitet. Na gut, so halt :
Code:
type
  TFarbButton = class(TButton)
  private
    { Private declarations }
    FColor : TColor;
    FCanvas : TCanvas;
    procedure SetColor (c : TColor);
  protected
    { Protected declarations }
    procedure DrawButton (Rect : TRect);
  public
    { Public declarations }
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    property Canvas : TCanvas read FCanvas;
    property Color : TColor read FColor write SetColor;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiel', [TFarbButton]);
end;

constructor TFarbButton.Create (AOwner : TComponent);
  begin
    inherited Create (AOwner);
    FCanvas := TCanvas.Create;
  end;

destructor TFarbButton.Destroy;
  begin
    FCanvas.free;
    inherited;
  end;

procedure TFarbButton.DrawButton (Rect : TRect);
begin
  FCanvas.Brush.Color := FColor;
  FCanvas.Pen.Color := clBlack;
  FCanvas.FillRect (Rect);
end;

procedure TFarbButton.SetColor (c : TColor);
begin
  Fcolor := c;
end;
Und den OI hänge ich als Beiweis, daß es funktioniert noch an. Anzumerken ist die Property Color, die steht in der Typdeklaration der Klasse drin und ist von mir. Die anderen Farben werden von Brush und Pen bereitgestellt. Und noch eine Frage : Bei Copymode steht eine komische Zahl. Was soll das ? Wie gesagt im OI sieht das Recht gut aus. Es gibt noch einen Fehler : Es funktioniert nicht.
Angehängte Dateien
Dateityp: doc dok5_143.doc (32,5 KB, 17x aufgerufen)
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6
  Alt 2. Apr 2003, 21:19
huch, der Server wird heruntergefahren. Dann kann ich nur noch berichten, daß Delphi sich im Moment ohne Ankündigung verabschiedet. Keine Exception, kein laufender Task mehr, einfach so. Fällt sonst keinem im Quelltext ein Fehler auf ? mhhh

Mir fällt nur noch auf, daß bei property FCanvas die "write" Anweisung fehlt.
Gruß
Hansa
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7
  Alt 7. Apr 2003, 17:16
Hi Hansa,

ich hab am Wochenende mal ein bischen rumgespielt.

Erst mal folgendes.
Es reicht natürlich nicht dem Objekt einfach einen Canvas zuzuweisen. Dann hast Du zwar einen Canvas, aber was bringt's.

Lege besser einen TControlCanvas an und weise der Eigenschaft Control im Constructor deines Button's der Eigenschaft FCanvas(TControlCanvas).Control := self zu.

Somit ist erst mal Dein Button mit dem Canvas verknüpft.

Leider ist es nun aber so, dass das TButton-Object von Windows stammt (deshalb findest du in den Propertys auch keinen Canvas). Du müßtest jetst alle Paint und gleichlautenden Methoden und Ereignisse überschreiben und damit das Aussehen Deines neuen Buttons definieren. Das sah sehr mühsehlig aus, aber muß wohl sein.
Ich habe festgestellt, dass das Object TControlCanvas von den SpeedButton zur Darstellung der Glyph's verwendet wird. Wenn du beim neuzeichnen für den Canvas-Rect nicht die gesamte Buttongröße angibst, sondern nur einen zu gestaltenden Bereich wird vieles sicher einfacher.

Im großen und ganzen glaube ich, dass das was du willst darauf hinaus läuft, dass du alle möglichen Zeichenroutinen für deinen Farbbutton neu schreiben mußt (Paint im Zusammenhang mit Refresh, Redraw; wie sieht der Button im Down-Modus aus; 3D-Darstellung etc. etc. ...).

Viel Spaß

Gruß oki
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8
  Alt 9. Apr 2003, 22:20
Oki, Du hast leider Recht. Das sollte ein Beispiel werden, aber es geht nur mit API-Funktionen. Folgendes Beispiel habe ich ausgewertet :

http://www.swissdelphicenter.ch/de/showcode.php?id=1100

Da steht, wie das geht. Ich habe es im Funktionsumfang reduziert, bin aber irgendwann nicht mehr weiter gekommen. Irgendwann schlägt die API Delphi kaputt. Das Beispiel ist also meiner Meinung nach für OOP ungeeignet. Wer einen farbigen Button braucht: der Code funktioniert ! Danke in die Schweiz!
Gruß
Hansa
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9
  Alt 10. Apr 2003, 08:48
Hi Hansa,

genau das hab ich geahnt.

Irgentwie habe ich immer Horror vor diesem DC-Geraffel. Aus diesem Grund hab ich dir auch kein Bsp. gepostet. Da hätte ich mir bestimmt das ganze Wochenende versaut und das Ergebnis steht in den Sternen. Andere Sachen hätten auch noch liegen bleiben müssen. Aber die Zielrichtung haben wir dann schon richtig vermutet. Warum das Bsp. im Link mit OOP Probleme gibt ist mir unverständlich. Meine Erfahrungen (gering) mit HDC basierenden API-Routinen haben eigentlich immer sauber funktioniert.

Gruß oki
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10
  Alt 10. Apr 2003, 12:13
Zitat von oki:
... Warum das Bsp. im Link mit OOP Probleme gibt ist mir unverständlich. Meine Erfahrungen (gering) mit HDC basierenden API-Routinen haben eigentlich immer sauber funktioniert.
Das Bsp. im Link macht keine Probleme und es benutzt ja auch OOP. Wegen der vielen API-Sachen da drin sieht man meiner Ansicht nicht mehr das wesentliche an OOP. Für jemand, der nicht weiß, was das ist taugt es nicht als leicht zu verstehendes Beispiel.

das hier schon eher:

http://www.delphipraxis.net/viewtopic.php?t=4392
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.
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