![]() |
Neue Komponente erstellen
Hi,
ich versuche gerade eine neue Komponente zu erstellen, die folgenden Anforderungen genügen soll: 1. Hauptfunktionalität soll von DBedit geerbt werden. 2. Im OI soll noch das zu jedem Feld passende Label angegeben werden können. 3. Das Label sollte zumindest immer in derselben Zeile stehen, wie das DBedit. Falls möglich sollte es allerdings unabhängig vom DBedit vergrößert / verkleinert werden können. 4. Die kombinierte Komponente aus Label und DBedit sollte sich nur gemeinsam platzieren / entfernen lassen. Ich habe es so ungefähr versucht :
Code:
Das ist grober Unfug meint der Compiler. Aber wo er Recht hat hat er Recht. :mrgreen: So ähnlich habe ich es jedenfalls hingekriegt, daß die neue Komponente in der Objektablage drin war, aber vom Label war nichts zu sehen. Das mit dem read und write im published Abschnitt ist mir auch noch nicht ganz klar. Meine "neue" Komponente verhielt sich ganz so wie ein DBedit. Kann mir jemand erklären, wo jetzt genau was deklariert werden muß ?
TDBEditLabel = class(TDBEdit)
private FDBeditLabel : TLabel; protected procedure SetLabel; public { Public declarations } published property DBEditLabel write SetDBLabel; { Published declarations } end; Gruß Hansa |
Hallo Hansa,
ich hab' mich bisher immer vor Komponenten gedrückt, aber vielleicht ist ja Deine Komponente eine Möglichkeit in das Thema einzusteigen. Ganz einfach ist ja die Materie nicht. Ich habe schon mal ein bischen angefangen und kann den Text für das Label im OI eingeben. Und schon stecke ich fest! Wie bekomme ich das Ding auch noch gezeichnet? Ich würde zuerst das Label über dem Feld zeichnen wollen also auf den Koordinaten Left und Top-24, später kann man das ja verfeinern.
Delphi-Quellcode:
Hätte also nichts dagegen die Entwicklung dieser Komponente mit Dir und anderen Helfern hier so durchzuziehen, daß man was lernen kann.
unit DBEditLabel;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, DBCtrls; type TDBEditLabel = class(TDBEdit) private { Private-Deklarationen } FLblCaption : TCaption; function RdLblCaption : TCaption; procedure WrLblCaption(val : TCaption); protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property LblCaption : TCaption read FLblCaption write FLblCaption; // property LblFont : TFont; // property LblLeft : Integer; // property LblTop : Integer; // property LblWidth : Integer; end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TDBEditLabel]); end; function TDBEditLabel.RdLblCaption : TCaption; begin Result := FLblCaption; end; procedure TDBEditLabel.WrLblCaption(val : TCaption); begin FLblCaption := val; end; end. mfg eddy |
Hi Eddy,
das geht ja runter wie Öl :bounce2: 1+1 ist dann schon mal drei :!: Der Zeitpunkt ist allerdings schlecht von mir gewählt. Woher soll ich denn wissen, daß die Kerle AGBs veröffentlichen. :wall: @Daniel : Das geht aber wohl nicht anders. Das ist schon richtig so. Nützen werden sie aber nicht. Irgendein Heini bringt Dich trotzdem vor den Kadi. :mrgreen: Zu den Einzelheiten schicke ich Dir per PN noch eine Stellungnahme. Jetzt egal, habe mir das ausgedruckt und zugestimmt. @Eddy: Ja dann gehts halt weiter, Thema ist für mich nicht neu, aber noch nicht intensiv bearbeitet. Kriege die Teile in die Objektablage aber nicht in OI. Deine Source habe ich mir jetzt mal ausgedruckt und lese sie noch durch, Rest dann morgen. Gruß Hansa |
So funzt das doch nie. :mrgreen:
Mal auf die Schnelle zum Weiterbasteln:
Delphi-Quellcode:
Ein Fehler ist drin: Wenn man diese Komponente benutzt und die Appl startet kommt: EClassNotFound (TLabel).
unit DBEditLabel;
interface uses SysUtils, Classes, Controls, StdCtrls, Mask, DBCtrls; type TDBEditLabel = class(TDBEdit) private FCaption: WideString; FLabel: TLabel; procedure SetLabelPosition; procedure SetCaption(Value: WideString); protected procedure SetParent(AParent: TWinControl); override; procedure SetName(const Value: TComponentName); override; public constructor Create(aOwner: TComponent); override; procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override; published property DBEditCaption: WideString read FCaption write SetCaption; end; procedure Register; implementation procedure Register; begin RegisterComponents('Zusätzlich', [TDBEditLabel]); end; { TDBEditLabel } constructor TDBEditLabel.Create(aOwner: TComponent); begin inherited; FLabel := TLabel.Create(aOwner); end; procedure TDBEditLabel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin inherited SetBounds(ALeft, ATop, AWidth, AHeight); SetLabelPosition; end; procedure TDBEditLabel.SetCaption(Value: WideString); begin if Value <> FCaption then begin FCaption := Value; FLabel.Caption := Value; end; end; procedure TDBEditLabel.SetLabelPosition; begin if FLabel <> nil then begin FLabel.Top := Top - FLabel.Height - 5; FLabel.Left := Left + 5; end; end; procedure TDBEditLabel.SetName(const Value: TComponentName); begin if (csDesigning in ComponentState) and ((FLabel.GetTextLen = 0) or (CompareText(FLabel.Caption, Name) = 0)) then FLabel.Caption := Value; inherited SetName(Value); if csDesigning in ComponentState then Text := ''; end; procedure TDBEditLabel.SetParent(AParent: TWinControl); begin inherited; FLabel.Parent := aParent; end; end. Gibts ein Label im Form dieser Kompo gehts. Jemand ne Idee was da flash ist? Prost! :dancer2: |
Zitat:
naja, mal sehen. Gruß Hansa |
Das "F": Namenskonventionen.
Kannste hier nachlesen ![]() Im OI steht der nach property (published) definierte Ausdruck. Zum Bleistift DBEditCaption wenn du meinen Kram als Kompo einbindest. :D Invalid session Wer hat denn den Mist verzapft, kann man nur noch online schreiben? :( |
Zitat:
Zitat:
@Daniel: *neverchangearunningsystem* :mrgreen: :duck: <--- *ratz* :angle: |
Zitat:
|
Hallo Udo,
ich habe Deine Variante probiert und kriege beim Start der Anwendung, die das DBEditLabel verwendet folgende Fehlermeldung: "Klasse: TLabel nicht gefunden" Vermutlich liegt in der Zeile
Delphi-Quellcode:
der Fehler, oder hast Du diese Art der Variablen-Definition schon mal irgendwo erfolgreich, sprich funktionsfähig, verwendet?
private
FLabel: TLabel; mfg eddy |
Hi,
mit soviel Resonanz habe ich gar nicht so schnell gerechnet. 8) Udos Programm bildet eine gute Grundlage. Ich habe jetzt versucht, das Label links anzuordnen und zwar mit diesen Änderungen bei TDBeditLabel:
Code:
published
property DBEditCaption: WideString read FCaption write SetCaption; property DBEditCaptionPos: TLabelPosition read FCaptionPos write SetCaptionPos;
Code:
Dann zeigt er mir im OI auch schön an: lpAbove, lpLeft usw. Aber eine Änderung bewirkt nichts. Im Prinzip würde es zumindest mir fast schon reichen, wäre das Label standardmäßig links. Das Teil sollte sich halt schon so ähnlich verhalten wie TLabeledEdit bei D6. Danach wollte ich dann noch LabelSpacing entsprechend nachbilden. Da hab ich aber im Moment keinen Plan, wo ich da anfangen soll. :shock:
procedure TDBEditLabel.SetCaptionPos(Value: TLabelPosition);
begin if Value <> FCaptionPos then begin FCaptionPos := Value; // FLabel.CaptionPos := Value; end; end; Gruß Hansa |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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