![]() |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Ok, ich werde erstmal Text als String nehmen, aber ich habe mit Deinem Code noch etwas Probleme, da der Debugger schimpft und mir mitteilt, dass ein Operator oder Semikolon fehlt. In der Codezeile davor ist aber definitiv ein Semikolon. Woran kann denn nun dieser Fehler liegen?
Delphi-Quellcode:
TextRect := Rect(2, 2, self.Width-2, self.Height-2);
|
Re: Benötige Hilfe beim Entwickeln einer Komponente
Da ist nichts schlechtes zu erkennen. Mault der Compiler in der Zeile mit der TextRect-Zuweisung? Zeig mal kurz den ganzen Abschnitt und die original Fehlermeldung.
Gruß oki |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Er springt mit dem Cursor an zwischen diese Zeichen: (2 aus der Zeile
Delphi-Quellcode:
gesamte procedure:
TextRect := Rect(2, 2, self.Width-2, self.Height-2);
Delphi-Quellcode:
Originale Fehlermeldung:
procedure TmyPanel.Paint;
var Rect,TextRect : TRect; begin Rect := GetClientRect; Canvas.FillRect(Rect); Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := FBgColorFrom; Canvas.Pen.Mode := pmCopy; Canvas.Pen.Style := BorderStyle; Canvas.Pen.Width := BorderWidth; Canvas.Pen.Color := BorderColor; if PaintGradient then DrawGradient(Canvas, BgColorFrom, BgColorTo, Rect, goVertical); Canvas.MoveTo(0,0); Canvas.LineTo(Rect.Left,Rect.Bottom); Canvas.MoveTo(0,0); Canvas.LineTo(Rect.Right,Rect.Top); Canvas.MoveTo(self.Width,0); Canvas.LineTo(Rect.Right,Rect.Bottom); Canvas.MoveTo(0,self.Height); //links unten Canvas.LineTo(Rect.Right,Rect.Bottom); TextRect := Rect(2, 2, self.Width-2, self.Height-2); SetBkMode(Canvas.Handle, TRANSPARENT); DrawText(self.Canvas.Handle, PChar(FText), -1, Rect, DT_CENTER or DT_VCENTER or DT_SINGLELINE); end; [Fehler] myPanel.pas(207): Operator oder Semikolon fehlt [Hinweis] myPanel.pas(24): Das private-Symbol 'FAlign' wurde deklariert, aber nie verwendet [Fataler Fehler] test_mypanel.dpk(32): Verwendete Unit '..\..\Lib\myPanel.pas' kann nicht compiliert werden |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Keine Ahnung ob es denn noch der Fall ist, wenn DrawText ginge, aber mit der TextOut gibts keinen Zeilenumbruch...
|
Re: Benötige Hilfe beim Entwickeln einer Komponente
Hallo Tom,
du definierst eine lokale Variable Rect und möchtest gleichzeitig die Funktion Rect() verwenden. Kein Wunder, daß der Compiler da etwas verwirrt ist. Entweder benennst du die lokale Variable um oder du versuchst es so:
Delphi-Quellcode:
Voraussetzung ist dann allerdings die Aufnahme der Unit Types in die USES-Anweisung.
TextRect := Types.Rect(2, 2, self.Width-2, self.Height-2);
Gruß Hawkeye |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Sorry, ich habe den Fehler auch gerade bemerkt und aus der lokalen Variable Rect => myRect gemacht. Nun funzt es.
Offen bleibt, wie man den Text umbrechen kann...!? Sorry, aber Dein Beitrag war ca. 2 Minuten früher drin... |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Hi, dann klappts auch mit DrawText, oder mit dem Nachbarn :lol:
Für automatischen Zeilenumbruch musst du DT_SINGLELINE gegen DT_WORDBREAK tauschen. Gruß oki |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Hello Again,
darf ich Euch nochmals um Rat bitten? Ich würde nun gern die Ausrichtung des Textes als Eigenschaft verpacken und habe nun folgendes gemacht:
Delphi-Quellcode:
Meine Frage lautet nun, wie kann ich das Ganze sinnvoll kombinieren? Bzw. was soll ich als Eigenschaftsvorgabewert für das Alignment benutzen? Kann ich die Cardinals, die für DrawText vorgegeben sind einfach durchreichen? Wenn ja wie? Oder muss ich mir eigene Eigenschaften schaffen, die ich dann übersetze?
private
..... procedure SetText(Content : String); procedure SetTextAlign(Alignment : Cardinal); published ..... property Text : String read FText write SetText; property TextAlign : Cardinal read FTextAlign write SetTextAlign; procedure TmyPanel.SetTextAlign(Alignment : Cardinal); // Settermethode begin If Alignment = FTextAlign then Exit; // wenn gleicher Inhalt nichts tun FTextAlign := Alignment; // Inhalt abspeichern Invalidate; // Control neu zeichnen end; DrawText(self.Canvas.Handle, PChar(FText), -1, TextRect, DT_VCENTER or DT_VCENTER or DT_WORDBREAK); Also mit:
Delphi-Quellcode:
Und dann müsste ich wohl aus alLeft DT_Left machen?! Aber in der Routine werden Möglichkeiten angeboten. Also wie könnte ich das jetzt sinvoll gestalten, denn ich will natürlich mehrere Möglichkeiten der Textausrichtung haben...Das versteht ihr doch...Oder... :-D
TalText = (alLeft, alTop, alBottom, alRight, alTopLeft);
|
Re: Benötige Hilfe beim Entwickeln einer Komponente
Moin torud,
nichts leichter als das. Du mußt dir nun nur überlegen, wie du diese setzt. Das kannst du in der üblichen Art und Weise tun. Bsp.: -Links-/Rechtsbündig und zentriert über Radiobutton, -vertikal zentriert und Zeilenümbruch als Checkboxen. Dabei kannst du für deine published-Deklaration ruhig bekannte Eigenschaften einführen:
Delphi-Quellcode:
Somit ist das auch im OI anwählbar.
protected
property TextPropertys : UINT read FTextPropertys write SetTextPropertys; published property TextAlignment : TAlignment read FTextAlignment write SetTextAlignment; property TextVCenter : UINT read FTextVCenter write SetTextVCenter; Bei Änderungen änderst du dementsprechend deine Eigenschaft FTextPropertys in den Setter-Methoden und läßt das Panel neu zeichnen.
Delphi-Quellcode:
Gruß oki
DrawText(self.Canvas.Handle, PChar(FText), -1, TextRect, FTextPropertys);
P.S. hab jetzt geschlagene 20 min für das bischen gebraucht. :| Ist echt noch zu früh |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Ok, da Du hier Mentortauglich zu sein scheinst, habe ich hier noch was kniffliges. Ich finde den Fehler einfach nicht. ich habe also noch eine Möglichkeit eingabut, um auch ein Bild anzeigen lassen zu können. Das Ganze ist mit dem Rahmen noch nicht abgestimmt und auch den Gradienten muss man nicht zeichnen, wenn man ein Bild drauf zeichnet, aber das Problem ist, dass mir mein Delphi direkt abschmiert, wenn ich ein Bild ausgesucht und im OI hinzufügt habe und er versucht die TGraphic mittels StretchDraw zu zeichnen. Ich poste mal wieder den gesamten Code. Deine Infos aus Deinem letzten Post sind noch nicht mit eingeflossen...Hier und da habe ich schon einiges gerade gezogen und ich bin begeistert, auch wenn es noch nicht ganz das ist, was ich will....Aber der Weg stimmt...
Delphi-Quellcode:
Der Fehler MUSS eigentlich hier liegen:
unit myPanel;
interface uses Windows, Messages, SysUtils, Classes, Controls, Graphics; type TbdStyle = (bdNone, bdSolid, bdDashed, bdClear, bdDotted); TGradientOrientation = (goVertical, goHorizontal); type TPixelRec = packed record case Boolean of true: (Color: TColor); false: (r, g, b, Reserved: Byte); end; type TmyPanel = class(TCustomControl) private FBgColorFrom : TColor; FBgColorTo : TColor; FPaintGradient : Boolean; FGradientDirection : TGradientOrientation; FBorderColor:TColor; FBorderStyle:TPenStyle; FBorderWidth:integer; FRoundEdges:boolean; FCornerWidth:integer; FText:String; FTextAlign:Cardinal; FPicture:TGraphic; procedure SetBgColorFrom(Value : TColor); procedure SetBgColorTo(Value : TColor); procedure SetGradientStatus(Value: Boolean); procedure SetBorderWidth(Value: integer); procedure SetBorderColor(Value : TColor); procedure SetPicture(Pic : TGraphic); procedure SetText(Content : String); procedure SetTextAlign(Alignment : Cardinal); procedure SetGradientDirection(Direction:TGradientOrientation); { Private-Deklarationen } protected { Protected-Deklarationen } procedure Paint; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; { Public-Deklarationen } published //property Align : TAlign read FAlign write FAlign; property Align; property BgColorFrom : TColor read FBgColorFrom write SetBgColorFrom; property BgColorTo : TColor read FBgColorTo write SetBgColorTo; property PaintGradient : boolean read FPaintGradient write SetGradientStatus; property GradientDirection : TGradientOrientation read FGradientDirection write SetGradientDirection; property BorderColor : TColor read FBorderColor write SetBorderColor; property BorderStyle : TPenStyle read FBorderStyle write FBorderStyle; property BorderWidth : integer read FBorderWidth write SetBorderWidth; property RoundEdges : boolean read FRoundEdges write FRoundEdges; property CornerWidth : integer read FCornerWidth write FCornerWidth; property Picture : TGraphic read FPicture write SetPicture; property Text : String read FText write SetText; property TextAlign : Cardinal read FTextAlign write SetTextAlign; { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TmyPanel]); end; constructor TmyPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); Align := alNone; BgColorFrom := clWhite; BgColorTo := clSilver; BorderColor := clGray; BorderStyle := psSolid; BorderWidth := 2; end; destructor TmyPanel.Destroy; begin inherited; end; procedure TmyPanel.SetPicture(Pic : TGraphic); begin If Pic = FPicture then Exit; // wenn gleicher Status nichts tun FPicture := Pic; // Status abspeichern Invalidate; // Control neu zeichnen end; procedure TmyPanel.SetGradientStatus(Value:Boolean); begin If Value = FPaintGradient then Exit; // wenn gleicher Status nichts tun FPaintGradient := Value; // Status abspeichern Invalidate; // Control neu zeichnen end; procedure TmyPanel.SetGradientDirection(Direction:TGradientOrientation); begin If Direction = FGradientDirection then Exit; // wenn gleicher Status nichts tun FGradientDirection := Direction; // Status abspeichern Invalidate; // Control neu zeichnen end; procedure TmyPanel.SetBorderWidth(Value:integer); begin If Value = FBorderWidth then Exit; // wenn gleicher Status nichts tun FBorderWidth := Value; // Status abspeichern Invalidate; // Control neu zeichnen end; procedure TmyPanel.SetBorderColor(Value : TColor); // Settermethode begin If Value = FBorderColor then Exit; // wenn gleiche Farbe nichts tun FBorderColor := Value; // Farbe abspeichern Invalidate; // Control neu zeichnen end; procedure TmyPanel.SetBgColorFrom(Value : TColor); // Settermethode begin If Value = FBgColorFrom then Exit; // wenn gleiche Farbe nichts tun FBgColorFrom := Value; // Farbe abspeichern Invalidate; // Control neu zeichnen end; procedure TmyPanel.SetBgColorTo(Value : TColor); begin If Value = FBgColorTo then Exit; FBgColorTo := Value; Invalidate; end; procedure TmyPanel.SetText(Content : String); // Settermethode begin If Content = FText then Exit; // wenn gleicher Inhalt nichts tun FText := Content; // Inhalt abspeichern Invalidate; // Control neu zeichnen end; procedure TmyPanel.SetTextAlign(Alignment : Cardinal); // Settermethode begin If Alignment = FTextAlign then Exit; // wenn gleicher Inhalt nichts tun FTextAlign := Alignment; // Inhalt abspeichern Invalidate; // Control neu zeichnen end; procedure DrawGradient(const Canvas: TCanvas; Color1, Color2: TColor; ARect: TRect; GradientOrientation: TGradientOrientation); var c1, c2, c: TPixelRec; //for easy access to RGB values as well as TColor value x, y: Integer; //current pixel position to be set OldPenWidth: Integer; //Save old settings to restore them properly OldPenStyle: TPenStyle;//see above begin c1.Color := ColorToRGB(Color1); //convert system colors to RGB values c2.Color := ColorToRGB(Color2); //if neccessary OldPenWidth := Canvas.Pen.Width; //get old settings OldPenStyle := Canvas.Pen.Style; Canvas.Pen.Width:=1; //ensure correct pen settings Canvas.Pen.Style:=psInsideFrame; case GradientOrientation of goVertical: begin for y := 0 to ARect.Bottom - ARect.Top do begin c.r := Round(c1.r + (c2.r - c1.r) * y / (ARect.Bottom - ARect.Top)); c.g := Round(c1.g + (c2.g - c1.g) * y / (ARect.Bottom - ARect.Top)); c.b := Round(c1.b + (c2.b - c1.b) * y / (ARect.Bottom - ARect.Top)); Canvas.Brush.Color := c.Color; Canvas.FillRect(Classes.Rect(ARect.Left, ARect.Top + y, ARect.Right, ARect.Top + y + 1)); end; end; goHorizontal: begin for x := 0 to ARect.Right - ARect.Left do begin c.r := Round(c1.r + (c2.r - c1.r) * x / (ARect.Right - ARect.Left)); c.g := Round(c1.g + (c2.g - c1.g) * x / (ARect.Right - ARect.Left)); c.b := Round(c1.b + (c2.b - c1.b) * x / (ARect.Right - ARect.Left)); Canvas.Brush.Color := c.Color; Canvas.FillRect(Rect(ARect.Left + x, ARect.Top, ARect.Left + x + 1, ARect.Bottom)); end; end; end; Canvas.Pen.Width := OldPenWidth; //restore old settings Canvas.Pen.Style := OldPenStyle; end; procedure TmyPanel.Paint; var myRect,TextRect : TRect; begin myRect := GetClientRect; Canvas.FillRect(myRect); Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := FBgColorFrom; Canvas.Pen.Mode := pmCopy; Canvas.Pen.Style := BorderStyle; Canvas.Pen.Width := BorderWidth; Canvas.Pen.Color := BorderColor; //zeichnen des gradients if PaintGradient then DrawGradient(Canvas, BgColorFrom, BgColorTo, myRect, GradientDirection); //zeichnen des rahmens Canvas.MoveTo(0,0); Canvas.LineTo(myRect.Left,myRect.Bottom); Canvas.MoveTo(0,0); Canvas.LineTo(myRect.Right,myRect.Top); Canvas.MoveTo(self.Width,0); Canvas.LineTo(myRect.Right,myRect.Bottom); Canvas.MoveTo(0,self.Height); //links unten Canvas.LineTo(myRect.Right,myRect.Bottom); //zeichnen des bildes, wenn vorhanden if Picture <> nil then Canvas.StretchDraw(myRect,Picture); //schreiben des textes TextRect := Rect(BorderWidth, BorderWidth, self.Width-BorderWidth, self.Height-BorderWidth); SetBkMode(Canvas.Handle, TRANSPARENT); DrawText(self.Canvas.Handle, PChar(FText), -1, TextRect, DT_VCENTER or DT_VCENTER or DT_WORDBREAK); end; end.
Delphi-Quellcode:
da ich den Code soeben testhalber mal deaktiviert habe und da wird ja das Bild nicht gezeichnet. Da war alles ok. Also was mache ich da noch falsch? Denn in meinem Infotool => EasyDelphiHelper stand geschrieben, dass man mit StretchDraw eine TGraphic zeichnen lassen kann und damit fast alles realisieren kann. Also wenigstens Bmp und Jpg. Das würde auch erstmal reichen...
if Picture <> nil then
Canvas.StretchDraw(myRect,Picture); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 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