![]() |
Zwei Fragen zu Komponentenentwicklung
Einleitend:
Sollte es hier keine extra Sparte für Komponentenentwicklung geben? denn ich habe erstens nich keine wirklich hilfreichen Komponententuts(wobei ich das auf dsdt da nicht dazuzähle. sowas kann ich auch ohne tut.) gefunden. es gibt ja in der OS-Sparte immer wieder Komponenten zum Download. Meine Fragen: - Ich will meine Komponenten richtig zeichnen lassen, auch zur designtime. muss ich dazu nur die bereits vorhandene paint-methode überschreiben, und der rest geht automatisch? - Wie bringe ich den Konstruktor in den OI, bzw. wie lege ich Standardwerte fest, die der OI überschreiben kann? ich habe bis jetzt immer im create der komponente die standardwerte belegt, wenn ich dann im OI etwas geändert habe scheint das keine auswirkungen gehabt zu haben, sondern ich musste die Initialisierung immer im formcreate machen. danke schonmal für die sicher hilfreichen antworten. für wirkich tiefergehende tutorials bin ich immer dankbar! EDIT: topic konkretisiert. EDIT: aufgrund neuer sachlage obige aussage revidiert. |
Re: Zwei Fragen zu Komponentenentwicklung
Was möchtest du denn für eine Komponente machen ?
|
Re: Zwei Fragen zu Komponentenentwicklung
Zitat:
Also : liefere Source-Teile oder zumindest Screenshot. Wie soll sonst jemand was dazu sagen ? |
Re: Zwei Fragen zu Komponentenentwicklung
Ich schließe mich Hansa an, wenn du sagst das du alls von dsdt kannst dann frag ich mich wieso du solche fragen fragst wenn sie doch dort im tutorial geklärt werden :roll:
Fragen zur Komponentenentwicklung habe ich immer in die VCL Sparte gepostet und da passen sie wohl auch sinngemäß rein finde ich, also wäre eine neue sparte für komponentenentwicklung irgendwie unnütz :gruebel: |
Re: Zwei Fragen zu Komponentenentwicklung
um missverständnisse zu vermeiden: ich habe bereits eine komponente programmiert, die soweit auch funktioniert.
ich hab da auch eine procedure paint; , die allerdings nix überschreibt, sondern von formpaint aufgerufen wird. :stupid: um meine aussage also ein wenig zu entschärfen: "so weit wie das tutorial auf dsdt bin ich auch schon". @phlux: ich habe in der suche gesehen, dass die threads zu komponenten ziemlich gleichmässig auf "sonstige fragen zu delphi" und "vcl und controls" verteilt sind. wenn man streng ist, passen eigene komponetenten auch nicht wirklich in die VCL-Sparte: "Fragen rund um VCL- und WinForms-Komponenten einschließlich der Common Controls(z.B. deren Benutzung und/oder Weiterentwicklung)" - gehören selbst entwickelte Komponenten zur VCL?! @jfheins: eine processbar, die auf ein canvas gezeichnet wird anstatt sich selbst zu zeichnen, da ich überprüfen möchte, ob das bei einer großen anzahl von progressbars performancevorteile bringt. der komplette source(hab gerade keine zeit, das hochzuladen):
Delphi-Quellcode:
ein screenshot kommt vielleicht später, ich hab auf jeden fall ne test-app da.
unit U_CanvasBar;
interface uses Graphics,Types,SysUtils,Classes,Windows; type TCanvasbar = class(TComponent) private fStep,FPercent,fPosition:integer; fMin,fMax:integer; fLeft,fTop,fWidth,fHeight:integer; fParent:TCanvas; fBorderCol,fColor,fGaugeCol:TColor; fFont:TFont; procedure SetPosition(value:integer); public constructor Create(AOwner:TComponent); override; destructor Destroy; override; procedure Paint; //kein override, sollte da eins sein? procedure StepIt; published property Parent : TCanvas read fParent write fParent; property Step : integer read fStep write fStep ; //stored 1; property Position: integer read fPosition write SetPosition; //stored 0; property Percent : integer read fPercent ; //stored 0; property Left : integer read fLeft write fLeft ; //stored 0; property Top : integer read fTop write fTop ; //stored 0; property Height : integer read fHeight write fHeight ; //stored 0; property Width : integer read fWidth write fWidth ; //stored 0; property BorderColor: TColor read fBorderCol write fBorderCol; //stored clblack; property Color: TColor read fColor write FColor ; //stored clgray; property FGaugeColor:TColor read fGaugeCol write fGaugeCol ; //stored clmedgray; property Font: TFont read fFont write fFont; property Min: integer read fMin write fMin; property Max: integer read fmax write fMax; end; procedure Register; implementation procedure Register; begin RegisterComponents('Custom',[TCanvasBar]); end; constructor TCanvasBar.Create(AOwner:TComponent); begin inherited; fBorderCol := clBlack; //hier werden die angesprochenen standardwerte gesetzt, die ich im OI nicht überschrieben kann. fGaugeCol := clSilver; //im OI erscheint das hier übrigens auch als clblack.... fColor := clGray; //...ebenso wie das hier. fFont:=TFont.Create; fMin:=0; fMax:=100; fPosition:=0; fPercent:=0; fStep:=1; fWidth:=160; fHeight:=16; end; destructor TCanvasBar.Destroy; begin inherited; fFont.Free; end; procedure TCanvasBar.Paint; var storpen:TPen; storbrush:TBrush; storfont:TFont; gaugerect:TRect; textwidth, textHeight, textLeft,textTop:integer; begin storpen:=TPen.Create; storbrush:=TBrush.Create; storfont:=TFont.Create; storpen.Assign(fparent.pen); storbrush.Assign(fparent.Brush); storfont.Assign(fparent.Font); fparent.Pen.Color:=fBorderCol; fparent.Brush.Color:=fColor; fparent.Rectangle(fleft,ftop,fleft+fwidth,ftop+fheight); if fPercent > 0 then begin GaugeRect.Left:=fLeft+1; GaugeRect.Top:=fTop+1; GaugeRect.Bottom:=fTop + fHeight - 1; GaugeRect.Right:= fLeft + round( (fwidth-2) * ( fPosition / fMax )); fparent.Pen.Color:=fGaugeCol; fparent.Brush.Color:=fGaugeCol; fparent.Rectangle(GaugeRect); end; fparent.Font:= fFont; textwidth := fparent.TextWidth(inttostr(fPercent)+'%'); textHeight := fparent.TextHeight(inttostr(fPercent)+'%'); textLeft := round(fLeft + fWidth / 2 - textWidth / 2); textTop := round(fTop + fHeight / 2 - textHeight / 2); SetBKMode(parent.Handle,TRANSPARENT); //das geht eleganter, ich weiss. fparent.TextOut(textLeft,textTop,inttostr(fPercent)+'%'); SetBKMode(parent.Handle,OPAQUE); fparent.Brush.Assign(storbrush); fparent.Pen.Assign(storpen); fparent.Font.Assign(storfont); storpen.Free; storbrush.Free; storfont.Free; end; procedure TCanvasBar.StepIt; begin fPosition := fPosition+fStep; self.SetPosition(fPosition); Paint; end; procedure TCanvasbar.SetPosition(value:integer); begin fPosition := value; if fMin <> fMax then fPercent := Round(Abs((fPosition - fMin) / (fMax - fMin)) * 100) else fPercent:=0; end; end. EDIT: aufgrund neuer sachlage obige aussage revidiert. |
Re: Zwei Fragen zu Komponentenentwicklung
Hallo,
ein paar Kleinigkeiten: Du verwendest als Eigenschaft Parent. Eine Komponente hat schon eine solche Eigenschaft. Benutze lieber einen anderen Namen.
Delphi-Quellcode:
inherited kommt im Destructor immer am Schluss!
destructor TCanvasBar.Destroy;
begin inherited; fFont.Free; end; Die Methode Paint solltest Du entweder überschreiben, damit sie automatisch aufgefufen wird oder umbenennen, um die ursprüngliche Methode zu behalten. Gruß xaromz |
Re: Zwei Fragen zu Komponentenentwicklung
Zitat:
Mehr zu sagen bringt jetzt auch nicht viel. Lese dir das Tuto nochmals durch, aber dann lese auch jedes Wort und suche dir besser eine andere Komponente um zu üben ! Also eine, die schon was mitbringt. Du fängst ja fast schon bei Adam und Eva an. Und das hat mit OOP nicht mehr viel zu tun. |
Re: Zwei Fragen zu Komponentenentwicklung
ja sicher musst du override; dahinterschreiben wenn du die prozedure überschreiben willst und nicht vergessen in der prozedur paint dann selbst am ende noch inherited paint; zu schreiben ;)
|
Re: Zwei Fragen zu Komponentenentwicklung
@xaromz: hätt ich mir eigentlich irgendwie denken können, dass eine komponente schon ein parent hat :roll:
wie greif ich dann darauf zu, und wie zwinge ich den progger, dass er ein canvas als parent nimmt? oder soll ich schauen, ob das parent ein canvas hat? das mit dem destruktor ist auch logisch. danke. @Hansa: hmm... vielleicht hast du recht. werde mir das nochmal durchlesen. und das mit dem OI: ich sehe nicht, wo ich den OI "festlege". TColor ist TColor. Und der OI soll das dann gefälligst nach meinen einstellungen anpassen. @phlux: k, mach ich. PS: großes "ÖHA"! da(dsdt) gibts ja zwei tuts zur komponentenentwicklung :shock: Damit muss ich natürlich die aussage ganz zurücknehmen. :oops: |
Re: Zwei Fragen zu Komponentenentwicklung
Zitat:
Aber du hast ja zumindest eingesehen, das Tuto neu lesen zu müssen. Deshalb noch ein Hinweis : könnte es sein, daß sich die "Position" einstellen läßt ? Wenn dem so ist, dann gucke dir mal alles damit zusammenhängende neu an. Auch in dem Tuto. |
Re: Zwei Fragen zu Komponentenentwicklung
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich muss mich korrigieren, TComponent hat kein Parent, das gibt's erst bei TControl :oops: . Zitat:
Da Du von TComponent ableitest, hat Deine Komponente keinen Canvas und keine Paint-Mathode zum Überschreiben. Du solltest also von TGraphicControl ableiten, da hast Du einen Canvas und eine Paint-Methode. Ich hab mal Dein Zeug etwas überarbeitet, fehlt aber noch Werteüberprüfung. @Hansa: Natürlich erkennt der OI ein TColor, wenn die Eigenschaft als Published deklariert ist. Gruß xaromz |
Re: Zwei Fragen zu Komponentenentwicklung
@xaromz: der clou des ganzen ist ja, dass die komponente sich nicht selbst zeichnet, sondern auf das parent-canvas gezeichnet wird.
den code werd ich mir aber morgen erst zu gemüte führen. @Hansa: es käme mir wirklich extrem dumm vor, wenn der OI nicht wüsste, wohin er die werte schreiben soll, wenn ich ihm sowohl read als auch write definiert habe. |
Re: Zwei Fragen zu Komponentenentwicklung
Zitat:
(Nur muss es halt nicht mit Canvas passieren, sondern kann auch etwas effizienter sein ;) ) |
Re: Zwei Fragen zu Komponentenentwicklung
Zitat:
|
Re: Zwei Fragen zu Komponentenentwicklung
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: Zwei Fragen zu Komponentenentwicklung
@Ressourcen: ich verweise mal auf den thread
![]() Zitat:
@Hansa: Du meinst also, wenn ich schon (Deiner meinung nach) absoluter Noob bin, darf man mir nicht wohlmeinend ein beispiel zeigen? (Mir fällt auch sonst öfters auf, dass zu, sagen wir mal, ziemlich extreme Meinungen äusserst. vielleicht solltest du dir überlegen, ob du deinen ton nicht manchmal etwas mäßigen willst. Denn ein noob wie ich wird von so etwas wie "das behaupten einige andere auch und scheitern erbärmlich." eher abgeschreckt als wermutigtm, sich richtig reinzuhängen.) Und ausserdem, wenn ich mich schon nicht von der meinung "wenn ich eine property mit read und write zugriff habe, kann der OI immer darauf zugreifen" abbringen lasse, hilft doch eigentlich nur noh quelltext, der das gegenteil beweist. Fakten fakten fakten! :mrgreen: jetz schau ich mir aber erstmal den anhang von xaromz an. EDIT: ich sehe, das ist jetzt von TGraphicControl abgeleitet. muss das denn sein? und auf welches canvas zeichnet es denn jetzt? |
Re: Zwei Fragen zu Komponentenentwicklung
Zitat:
P.S.: ehe ichs vergesse : die Frage wurde gestellt, ohne eine einzige Zeile Code dazu zu liefern ! Als Antwort erwartest du aber kompletten Code ? :shock: |
Re: Zwei Fragen zu Komponentenentwicklung
Hallo,
Zitat:
Als Möglichkeit für Deine Bedürfnisse wäre evtl. eine Komponente (wieder von TGraphicControl) geeignet, die alle Werte aufnehmen und auf einmal anzeigen kann. Für das bisschen Zeitgewinn wäre das aber Overkill. Zitat:
Gruß xaromz |
Re: Zwei Fragen zu Komponentenentwicklung
ja so hatt ich mir das gedacht. werde das ganze dann bei gelegenheit(hoffentlich noch dieses we) fertig proggen.
Hansa: Ein "top tip"? Du wirfst mir den brocken "position" hin, mit verweis auf ein tutorial, und das soll dann ein "top tip" sein? nein danke. im übrigen hab ich nie fertigen code verlangt, sondern zwei grundsätzliche, allgemeine und fast schon abstrakte fragen gestellt: - wie lasse ich das paint-ereignis automatisch auslösen? Antwort: Paint überschreiben, fertig. - wie bringe ich es so hin, dass ich die werte im OI einstellen kann? Antwort: ein wenig rumgedruckse, ein bisschen äusserst hinterfotzige ironie(war es ironie? so etwas sieht man in einem forum leider verdammt schlecht), aber sonst kaum etwas. nimm bitte nochmal alleine hierzu stellung: "wenn ich eine property deklariere und mit read and write zugriff versehe, wie setze ich dann standardwerte? ich hatte das bis jetzt im konstruktor, wo es ja eigentlich auch hingehört, das scheint aber das, was ich im OI setze, zu überschreiben?" mag sein, dass das im tutorial steht, aufgrund eines kleinen missgeschickes meinerseits(ja ich gebs ja zu) hab ich das aber nicht gelesen, obwohl ich selbiges vermeinte. ich werde es jetzt lesen, und vielleicht weiss ich dann schon weiter. ich würde es aber schon gerne noch sehen, dass du eine 1. eindeutige 2. anständige 3. hilfreiche antwort darauf zustande bringst. ansonsten würde es sich bei mir bestätigen, dass du gerne die anderen user ein wenig verarschst und oft postest ohne wirklich nachzudenken was genau du da postest. ([/@hansa]) EDIT: entweder bin ich schon zu müde, oder in dem tut steht wirklich nicht, wie ich standardwerte mache... |
Re: Zwei Fragen zu Komponentenentwicklung
Standartwerte setzt du in dem du sie im Constructor überschreibst. Angenommen du hast eine selbst erstellte property Namens Padding, dann sieht der Code für die Compo so aus:
Delphi-Quellcode:
unit MyControl; interface uses Windows, SysUtils, Classes, Controls, Messages, Graphics; type TMyControl= class(TCustomControl) private { Private-Deklarationen } fPadding: Integer; protected { Protected-Deklarationen } //procedure Paint; override; public { Public-Deklarationen } constructor Create(aOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property Padding: Integer read fPadding write fPadding; // Vererbte Properties property Align; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TMyControl]); end; constructor TMyControl.Create(aOwner: TComponent); begin inherited Create(aOwner); fPadding := 5; //Hier wird der Inhalt der Variable geändert Align := alLeft; //Properties die du nicht selbst erstellt(vererbt) hast //kannst du wie üblich ändern end; destructor TMyControl.Destroy; begin inherited Destroy; fBackground.Free; end; (* procedure TMyControl.Paint; begin inherited Paint; end;*) end. |
Re: Zwei Fragen zu Komponentenentwicklung
das bedeutet also, der konstruktor wird schon ausgeführt, wenn ich die komponente aufs form setze, oder? (alles andere würde ja auch keinen sinn machen)
|
Re: Zwei Fragen zu Komponentenentwicklung
Klar ;) um herauszufinden ob du dich in der "DesignZeit" befindest oder zur Laufzeit musst du überprüfen ob csDesigning im Set von DesignTime ist.
|
Re: Zwei Fragen zu Komponentenentwicklung
hmm... TComponent hat gar keine Methode paint; sprich ich kann gar nichts überschreiben. was mach ich jetzt?
ich will auf jeden fall nicht von etwas anderem ableiten. |
Re: Zwei Fragen zu Komponentenentwicklung
Hallo,
nur visuelle Komponenten haben die Methode Paint (TCustomControl, TGraphicControl). Deshalb hatte ich ja von TGraphicControl abgeleitet. Wenn Du eine Paint-Methode haben willst, musst Du wohl ein WM_PAINT Ereignis abfangen, und zwar von übergeordneten Control. Ansonsten musst Du Dir deinen eigenen DC besorgen. Da Du aber dann im Grunde ein TGraphicControl nachbauen musst ist es eigentlich sinnvoller, gleich das Original zu nehmen. Gruß xaromz |
Re: Zwei Fragen zu Komponentenentwicklung
nein, wenn ich schon nicht von TGraphicControl ableiten will, dann will ich es auch nicht nachbauen.
Wie bringe ich das Parent dann dazu, WM_PAINT an die komponente zu senden? natürlich muss alles komponentenseitig ablaufen. |
Re: Zwei Fragen zu Komponentenentwicklung
Hallo,
Dein Parent wird Dir nie eine WM_PAINT-Botschaft schicken, es kennt Deine Komponente ja nicht und außerdem ist diese nicht visuell. Du musst also beim Zuweisen Deines Parent dessen WindowProc ersetzen (Alte merken, durch neue ersetzen und in dieser die gemerkte am Ende aufrufen<-wichtig!). Beim Zerstören/neu zuweisen von Parent musst Du denn auch die WindowProc zurücksetzen. In Deiner WindowProc kannst Du dann die Message abfangen. Das Ganze sieht dann so aus:
Delphi-Quellcode:
Gruß
private
FParent: TControl; OldWindowProc: TWndMethod; procedure SetParent(Control: TControl); procedure MyWindowProc(var Message: TMessage); public destructor Destroy; override; published property Parent: TControl read FParent write SetParent; end; destructor TMyClass.Destroy; begin // aufräumen ... // Evtl. alte WindowProc wiederherstellen if FParent <> nil then FParent.WindowProc := OdWindowProc; inherited; end; procedure TMyProc.SetParent(Control: TControl); begin // Alte WindowProc wiederherstellen if FParent <> nil then FParent.WindowProc := OldWindowProc; FParent := Control; // Neue WindowProc hooken if Control <> nil then begin OldWindowProc := FParent.WindowProc; FParent.WindowProc := MyWindowProc; end; end; procedure TMyClass.MyWindowProc(var Message: TMessage); begin // Alte WindowProc aufrufen OldWindowProc(Message); if Message.Msg = WM_PAINT then begin // Hier auf WM_PAINT reagieren end; end; xaromz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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