![]() |
csSetCaption wo hinschreiben?
Hallo und Guten Tag an alle DP´ler,
Ich hab wieder mal eine Frage zu den Control´s. Also ich hab jetzt schon so einige Positionen in meinem Quelltext versucht, damit meine Komponente (Name ist LabEdit) beim ziehen auf die Form auch den Text "LabEdit1" im angezeigten Label bekommt. Leider ohne Erfolg. Haber die Eigenschaft:
Delphi-Quellcode:
sowohl im Constructor, der Komponente als auch in der Create-Funktion des Labels eingebaut. Leider bleibt, obwohl ich keinen anderen Wert mehr zuweise meine Komponente leer, wenn sie auf die Form gezogen wird. Habe auch hier im Forum schon geschaut, meist schien es im Constructor der eigenen Komponente gut zu funktionieren, deswegen verstehe ich auch gerade nicht, warum meine so zickt :-D
ControlStyle :=[csSetCaption];
hier mal mein Quellcode nochmal, denke damit geht es besser, sind auch alle Stellen mal gekennzeichnet, wo ich es teilweise mehrfach versucht habe:
Delphi-Quellcode:
Vielen Dank
unit LabEdit;
interface uses Windows, Controls, Graphics, Classes, StdCtrls, Dialogs, Messages, Math, SysUtils; const MouseClick = WM_LBUTTONDOWN; MouseOver = CM_MOUSEENTER; MouseLeave = CM_MOUSELEAVE; type TOnChangeEvent = procedure of Object; type TLabEdit = Class(TWinControl) private // Eigenschaftsvariablen FbEnabled, FbVisible: boolean; FiTextLength, FiMaxTextLength: integer; // Komponenten FsTextWert: string; FLblAnzeige: TLabel; FEdEingabe: TEdit; // Eventvariablen FOnClick: TNotifyEvent; FOnChange: TOnChangeEvent; // create-Funktionen für das Label und das Edit function CreateLabel(PosX, PosY, Textgroesse: integer; visible: boolean): TLabel; function CreateEdit(PosX, PosY, Width, Height, Textgroesse: integer; Caption: string; visible: boolean): TEdit; // Interaktions-Prozeduren procedure FLblOnClick(Sender: TObject); procedure FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); // Änderungs-Prozeduren procedure ChangeEmbeddedEdit; // Setter- und Getter procedure SetKomponenteEnabled(bWert: boolean); function GetKomponenteEnabled: boolean; procedure SetText(sWert: string); function GetText: string; procedure SetVisible(bWert: boolean); function GetVisible: boolean; function GetTextLength: integer; procedure SetMaxTextLength(iWert: integer); function GetMaxTextLength: integer; // Event-Prozeduren procedure WMMouseClick(var Msn: TMessage); message MouseClick; procedure CMMouseOver(var Msn: TMessage); message MouseOver; procedure CMMouseLeave(var Msn: TMessage); message MouseLeave; protected procedure createWnd; override; published property OnChange: TOnChangeEvent read FOnChange write FOnChange; property Enabled: boolean read GetKomponenteEnabled write SetKomponenteEnabled; property Visible: boolean read GetVisible write SetVisible; property Text: string read GetText write SetText; property Font; property MaxLength: integer read GetMaxTextLength write SetMaxTextLength; public constructor create(AOwner: TComponent); override; destructor destroy; override; property Length: integer read GetTextLength; End; implementation constructor TLabEdit.create(AOwner: TComponent); begin inherited create(AOwner); // Habe auch im folgenden Controlstyle das csSetCaption mit Komma getrennt ergänzt, ebenfalls ohne Erfolg Controlstyle := Controlstyle - [csAcceptsControls]; // Der Componente wird nicht erlaubt // andere Componenten aufzunehmen, // als die, die durch den Programmierer // hier einprogrammiert werden. Visible := true; Enabled := true; //ControlStyle :=[csSetCaption]; <--- ohne Erfolg // Eventzeiger zurücksetzen FOnClick := nil; FOnChange := nil; // Defaultwerte setzen FbEnabled := true; FbVisible := true; FiMaxTextLength := 100000; end; destructor TLabEdit.Destroy; begin FLblAnzeige.Free; FEdEingabe.Free; inherited destroy; end; {////////////////////////////////////////////////////////////////////////////////////} {/ Create-Funktionen /} {////////////////////////////////////////////////////////////////////////////////////} function TLabEdit.CreateLabel(PosX: Integer; PosY: Integer; Textgroesse: Integer; visible: Boolean): TLabel; begin result := TLabel.Create(nil); result.Parent := Self; result.Left := PosX; result.Top := PosY; result.Font.Assign(Font); //result.ControlStyle := [csSetCaption]; <--- ohne Erfolg result.Visible := visible; end; function TLabEdit.CreateEdit(PosX, PosY, Width, Height, Textgroesse: integer; Caption: string; visible: boolean): TEdit; begin result := TEdit.Create(nil); result.Parent := Self; result.Left := PosX; result.Top := PosY; result.Width := Width; result.Text := Caption; result.Font.Assign(Font); result.Visible := visible; end; {////////////////////////////////////////////////////////////////////////////////////} {/ Setter und Getter /} {////////////////////////////////////////////////////////////////////////////////////} function TLabEdit.GetText: string; begin result := FLblAnzeige.Caption; end; procedure TLabEdit.SetText(sWert: string); begin FsTextWert := sWert; FLblAnzeige.Caption := sWert; FEdEingabe.Text := FLblAnzeige.Caption; end; procedure TLabEdit.SetKomponenteEnabled(bWert: Boolean); begin FbEnabled := bWert; end; function TLabEdit.GetKomponenteEnabled; begin result := FbEnabled; end; procedure TLabEdit.SetVisible(bWert: boolean); begin FbVisible := bWert; end; function TLabEdit.GetVisible:boolean; begin result := FbVisible; end; function TLabEdit.GetTextLength: integer; begin FiTextLength := strLen(PAnsiChar(FsTextWert)); result := strLen(PAnsiChar(FsTextWert)); end; procedure TLabEdit.SetMaxTextLength(iWert: integer); begin FiMaxTextLength := iWert; //FEdEingabe.MaxLength := FiMaxTextLength; end; function TLabEdit.GetMaxTextLength: integer; begin result := FiMaxTextLength; end; {////////////////////////////////////////////////////////////////////////////////////} {/ Änderungs-Prozeduren /} {////////////////////////////////////////////////////////////////////////////////////} procedure TLabEdit.ChangeEmbeddedEdit; begin Height := FEdEingabe.Height; FEdEingabe.Width := FLblAnzeige.Width + 20; Width := FEdEingabe.Width; end; {////////////////////////////////////////////////////////////////////////////////////} {/ Funktionen für die Interaktion /} {////////////////////////////////////////////////////////////////////////////////////} procedure TLabEdit.FLblOnClick(Sender: TObject); begin FLblAnzeige.Visible := false; FEdEingabe.Visible := true; end; procedure TLabEdit.FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin // Die Änderung hier an dieser Prozedur sehen wie folgt aus: OnChange wird nur // aktiviert, wenn eine Eingabe getätigt wurde, die verschieden von der vorherigen // ist. // Bei Esc wird alles wieder zurückgesetzt und das OnChangeEvent wird nicht aktiviert. if key in [13, 27] then begin FEdEingabe.Visible := false; FLblAnzeige.Visible := true; case key of 13: begin FLblAnzeige.Caption := FEdEingabe.Text; if FsTextWert <> FEdEingabe.Text then if assigned(FOnChange) then FOnchange; FsTextWert := FEdEingabe.Text; end; 27: FEdEingabe.Text := FsTextWert; end; end else begin inherited; FLblAnzeige.Caption := FEdEingabe.Text; ChangeEmbeddedEdit; end; end; {////////////////////////////////////////////////////////////////////////////////////} {/ Events /} {////////////////////////////////////////////////////////////////////////////////////} procedure TLabEdit.WMMouseClick(var Msn: TMessage); begin inherited; if assigned(FOnClick) then FOnClick(Self); FEdEingabe.Visible := true; FLblAnzeige.Visible := false; end; // Wenn die Maus über dem Label ist, ändert sich der Cursor, damit erkannt werden // kann, dass man hier eine Eingabe tätigen kann. procedure TLabEdit.CMMouseOver(var Msn: TMessage); begin Cursor := crHandPoint; end; // Cursor wird auf den normalen Default-Cursor zurück gesetzt. procedure TLabEdit.CMMouseLeave(var Msn: TMessage); begin Cursor := crDefault; end; {////////////////////////////////////////////////////////////////////////////////////} {/ CreateWnd-Funktion /} {////////////////////////////////////////////////////////////////////////////////////} procedure TLabEdit.CreateWnd; begin inherited createwnd; FLblAnzeige := CreateLabel(3, 3, 18, true); FLblAnzeige.OnClick := FLblOnClick; FEdEingabe := CreateEdit(0,0, FLblAnzeige.Width + 20, FLblAnzeige.Height, FLblAnzeige.Font.Height, FLblAnzeige.Caption, false); FEdEingabe.OnKeyDown := FEdKeyDown; ChangeEmbeddedEdit; end; end. BAMatze |
Re: csSetCaption wo hinschreiben?
Obwohl ich nicht glaube, dass es daran liegt, ändere mal den Konstruktor.
Delphi-Quellcode:
Übrigens gibt es in TControl bereits GetText und SetText als private Methoden.
Controlstyle := Controlstyle - [csAcceptsControls] + [csSetCaption];
|
Re: csSetCaption wo hinschreiben?
wie wäre es mit
Delphi-Quellcode:
und wenn ich mich so umseh, wird sowas bei den Komponenten der VCL auch fast immer im Constructor gemacht.
Controlstyle := Controlstyle - [csAcceptsControls] + [csSetCaption];
// bzw. Exclude(Controlstyle, csAcceptsControls); Include(Controlstyle, csSetCaption); Zitat:
|
Re: csSetCaption wo hinschreiben?
Zitat:
Delphi-Quellcode:
Jetzt gibt es den Text und in der Eigenschaft des Textes im Objektinspektor steht auch "LabEdit1", so wie ich wollte. Allerdings in meiner Komponente steht es noch nicht. Muss ich da auch die privaten Setter und Getter noch implementieren oder woran könnte das liegen?
property Text;
|
Re: csSetCaption wo hinschreiben?
Und wenn Du auf CM_TEXTCHANGED reagierst?
|
Re: csSetCaption wo hinschreiben?
Hallo und guten Morgen an alle DP´ler,
Also hab mich heute mit frischem Mut wieder an das Problem gemacht und eine relativ "ungewöhnlich" (zumindest für mich unverständlicher) Lösung gefunden. Ich habe in meine CreateLabel-Funktion folgende Zeile ergänzt und ab da stand, wie gewohnt "LabEdit1" auch in der Entwicklungszeit in der Komponente. Hier der geänderte Quellcode:
Delphi-Quellcode:
Es funktioniert und ich denke mal, dass ich damit auf eine vererbte Variable (so wie Enabled) zugreifen, denn ich selber habe keine Variable deklariert, die Caption heißt.
function TLabEdit.CreateLabel(PosX: Integer; PosY: Integer; Textgroesse: Integer; visible: Boolean): TLabel;
begin result := TLabel.Create(nil); result.Parent := Self; result.Left := PosX; result.Top := PosY; result.Font.Assign(Font); result.Caption := caption; //<--- diese Zeile hat mir das gewünschte Resultat gebracht result.Visible := visible; end; Vielen Dank an meine Helfer BAMatze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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 by Thomas Breitkreuz