AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel
Thema durchsuchen
Ansicht
Themen-Optionen

Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

Ein Thema von Sel2012 · begonnen am 12. Jun 2015 · letzter Beitrag vom 14. Jun 2015
Antwort Antwort
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#1

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 12. Jun 2015, 11:39
In OnPaint/OnPainting einfach Canvas.Brush.Color zuzuweisen geht auch nicht, so wie man es vielerorts aus der VCL kannte.
Find ich zwar auch ein bissl umständlich und blöd, aber so isses nunmal.
Auch hierzu muss man ergänzen, dass es zwar nicht über Canvas.brush.color geht, aber eben z.B. so:

Delphi-Quellcode:
procedure TForm14.Panel1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
  canvas.BeginScene;
  canvas.Fill.Kind := TBrushKind.bkSolid;
  Canvas.Clearrect (Arect, TAlphaColorRec.Yellow);
  canvas.EndScene;
end;
Das zeichnet das Panel in Gelb, egal was man für einen Stil zugewiesen hat. Allerdings muss man dann auch alles andere, was sich im Panel befindet, selber zeichnen, für das TPanel dann vielleicht nicht so sinnvoll. Aber hilfreich zu wissen, wenn man z.B. in einem Listbox-Item eine andere Hintergrundfarbe benötigt, oder gleich mehrere unterschiedliche Hintergrundfarben innerhalb des gleichen ListBoxItems.

Generell ist es möglich, mit dem FMX-Canvas wie zu VCL-Zeiten zu arbeiten. Wo FMX gewisse Einschränkungen hat, zeichne ich das eine oder andere eben selber über den Canvas (z.B. bei mehreren TString-Columns in einem StringGrid, die unterschiedliche Ausrichtungen haben (also Links,- rechtsbündig oder zentriert)).

Insgesamt finde ich es aber als Erleichterung, das nicht mehr tun zu müssen (über den Canvas arbeiten). Unter der VCL habe ich fast alle Grids oder Listboxen per Ownerdraw gezeichnet, unter FMX benötige ich das fast nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
794 Beiträge
 
#2

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 13. Jun 2015, 14:49
Delphi-Quellcode:
procedure TForm14.Panel1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
  canvas.BeginScene;
  canvas.Fill.Kind := TBrushKind.bkSolid;
  Canvas.Clearrect (Arect, TAlphaColorRec.Yellow);
  canvas.EndScene;
end;
Das zeichnet das Panel in Gelb, egal was man für einen Stil zugewiesen hat. Allerdings muss man dann auch alles andere, was sich im Panel befindet, selber zeichnen, für das TPanel dann vielleicht nicht so sinnvoll. Aber hilfreich zu wissen, wenn man z.B. in einem Listbox-Item eine andere Hintergrundfarbe benötigt, oder gleich mehrere unterschiedliche Hintergrundfarben innerhalb des gleichen ListBoxItems.
Hinweis und Zusatzfrage:

Man kann ja auch mit FindStyleResource('...') sich ein (Fmx-)Objekt aus dem Style holen und dann dort Farbe etc. setzen - funktioniert auch soweit. Bei TPanel ist es allerdings so, dass der Style nur aus einem TRectangle besteht und obige Funktion findet dieses Objekt (panelstyle) nicht, da es scheinbar nur in Unterobjekten sucht. An den Panelstyle (oberstes Objekt) kommt man zwar auch mittels TStyledControl.FResourceLink heran, aber da dieses protected ist, muss man sich eine Klasse ableiten, die dies veröffentlicht und dann einen harten Typecast machen. Funktioniert; aber ist das so gewollt oder gibt es eine andere/bessere Möglichkeit?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#3

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 13. Jun 2015, 17:47
Eine andere / bessere Variante, um an den Original-Panelstyle ranzukommen, kenne ich auch nicht. Wenn man sich mal die FindStyleRessource-Implementierung ansieht, bin ich mir gar nicht so sicher, ob das evtl. ein Fehler ist, die Style-Ressource hier in diesem Falle nicht zurückzuliefern..

Aber statt hier mit Hacks zu arbeiten, kann man sich auch einfach eine 2. StyleRessource erstellen (mit den notwendigen Abweichungen) und dann dem Object (also hier dem Panel) einfach diesen Style (Eigenschaft StyleLookup) zuweisen (also z.B. ein PanelStyleRed, ein PanelStyleBlue).
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
794 Beiträge
 
#4

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 13. Jun 2015, 18:48
Eine andere / bessere Variante, um an den Original-Panelstyle ranzukommen, kenne ich auch nicht. Wenn man sich mal die FindStyleRessource-Implementierung ansieht, bin ich mir gar nicht so sicher, ob das evtl. ein Fehler ist, die Style-Ressource hier in diesem Falle nicht zurückzuliefern..
Danke für die Bestätigung.

Aber statt hier mit Hacks zu arbeiten, kann man sich auch einfach eine 2. StyleRessource erstellen (mit den notwendigen Abweichungen) und dann dem Object (also hier dem Panel) einfach diesen Style (Eigenschaft StyleLookup) zuweisen (also z.B. ein PanelStyleRed, ein PanelStyleBlue).
Ja, das ist die einfachere/bessere Variante.
  Mit Zitat antworten Zitat
Sel2012

Registriert seit: 6. Jun 2015
Ort: 31535
103 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 13. Jun 2015, 20:31
[QUOTE=Harry Stahl;1304932]

Delphi-Quellcode:
procedure TForm14.Panel1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
  canvas.BeginScene;
  canvas.Fill.Kind := TBrushKind.bkSolid;
  Canvas.Clearrect (Arect, TAlphaColorRec.Yellow);
  canvas.EndScene;
end;
Es ist, als würde ich bei Null anfangen. Beim <Ausführen> klemmt's (ohne Fehlermeldung).
Auslöser der Aktion soll Button1 sein (Procedure Button1Click). Panel1 wurde aus der Tool-Palette kreiert.
Wer erkennt wo, dass es sich um Panel1 handelt?
Panel1.canvas. nützt nix.
Das ist so ein Beispiel, dass nur den Schluss zulässt, dass Dummis hier nichts zu suchen haben. Aber wer hilft angemessen,d.h. ausreichend ausführlich?

Danke für die Geduld.
  Mit Zitat antworten Zitat
Sel2012

Registriert seit: 6. Jun 2015
Ort: 31535
103 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 14. Jun 2015, 14:27
[QUOTE=Harry Stahl;1304932]
Delphi-Quellcode:
procedure TForm14.Panel1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
  canvas.BeginScene;
  canvas.Fill.Kind := TBrushKind.bkSolid;
  Canvas.Clearrect (Arect, TAlphaColorRec.Yellow);
  canvas.EndScene;
end;
Das zeichnet das Panel in Gelb,...
Es geht auch ganz simpel(siehe Anhang) Anfängerglück (?):
Aus der Ruhelage (Blau) werden über Button1 oder Button2 andere Farben gewählt. Das klappt ganz stabil. Die Zuordnung / Farbwahl findet über <if> statt.
Ich wüsste aber gern den Code für den Aufruf von
procedure TForm2.Panel1Paint(Sender: TObject; Canvas: TCanvas;const ARect: TRectF);
direkt über z.B. Button1Click.
Angehängte Grafiken
Dateityp: jpg canvas.jpg (33,2 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.881 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 14. Jun 2015, 14:54
Dann musst Du diesen Status irgendwie hinterlegen und dann im Paint-Event auswerten und entsprechend reagieren.
Markus Kinzler
  Mit Zitat antworten Zitat
Sel2012

Registriert seit: 6. Jun 2015
Ort: 31535
103 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 14. Jun 2015, 15:12
Dann musst Du diesen Status irgendwie hinterlegen und dann im Paint-Event auswerten und entsprechend reagieren.
Tschulligung, das ist so, als würde ich mit meinem Goldfisch reden (bitte nicht böse sein - Programmierer können wohl nicht anders kommunizieren).
Ich suche sowas:

procedure machwas(zahl: integer);
begin
zahl := zahl+5;
end;

procedure aufruf;
var einezahl: integer;
begin
einezahl := 5;
machwas(einezahl);
end;

Nur eben ausgelöst mit Button1Click. <machwas(einezahl);> müsste nur an
procedure Panel1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
angepasst werden. Aber wie?
const ARect: TRectF);
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.881 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 14. Jun 2015, 15:34
Den Status ( Werte für Auswertung oder absolute Farbe) z.B. in .Tag ablegen und dann im Paint auswerten

In Klick-Event des Buttons:

Delphi-Quellcode:
  Panel1.Tag := TAlphaColor.Blue;
  Panel1.Repaint;
Im Paint:
Delphi-Quellcode:
  if Sender.Tag <> 0 then
  begin
    canvas.BeginScene;
    canvas.Fill.Kind := TBrushKind.bkSolid;
    Canvas.Clearrect (Arect, (Sender as TComponent).Tag);
    canvas.EndScene;
  end;
Markus Kinzler

Geändert von mkinzler (14. Jun 2015 um 15:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#10

AW: Enttäuschung: Kein Image,Panel, individueller Farbumschag bei FontColor und Panel

  Alt 14. Jun 2015, 15:16
Nein, das ist keine gute Idee, im Button-Klick-Event direkt auf das Panel zeichnen zu wollen. Der richtige Ort ist hier immer das OnPaint-Event selber. Du kannst allenfalls einen Wert im Button-Event setzten, und ein Repaint der Komponente auslösen, wo dann der Wert berücksichtigt wird.

Das nur als Antwort. Aber generell möchte ich zur Sicherheit nur einmal sagen, dass das von mir gezeigte Beispiel nur als Antwort auf Himitsus Bemerkung zum Canvas-zeichnen unter FMX war. Ich würde das nur in besonderen Spezialfällen nutzen.

Viel einfacher wäre, Du definierst Dir benutzerdefinierte Styles (mit unterschiedlichen Farben) und weist dann dem Panel einfach die unterschiedlichen Styles zu.

Oder Du verwendest direkt das TRectangle, da kannst Du ganz einfach zur Laufzeit (auch im Button-Klick-Event) die Eigenschaft "Fill" mit der gewünschten Farbe setzen.
  Mit Zitat antworten Zitat
Antwort Antwort


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