AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

csSetCaption wo hinschreiben?

Ein Thema von BAMatze · begonnen am 15. Mai 2009 · letzter Beitrag vom 18. Mai 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

csSetCaption wo hinschreiben?

  Alt 15. Mai 2009, 12:29
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:

ControlStyle :=[csSetCaption]; 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

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:
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.
Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: csSetCaption wo hinschreiben?

  Alt 15. Mai 2009, 12:55
Obwohl ich nicht glaube, dass es daran liegt, ändere mal den Konstruktor.Controlstyle := Controlstyle - [csAcceptsControls] + [csSetCaption]; Übrigens gibt es in TControl bereits GetText und SetText als private Methoden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#3

Re: csSetCaption wo hinschreiben?

  Alt 15. Mai 2009, 12:57
wie wäre es mit
Delphi-Quellcode:
Controlstyle := Controlstyle - [csAcceptsControls] + [csSetCaption];

// bzw.
Exclude(Controlstyle, csAcceptsControls);
Include(Controlstyle, csSetCaption);
und wenn ich mich so umseh, wird sowas bei den Komponenten der VCL auch fast immer im Constructor gemacht.
Zitat:
Delphi-Quellcode:
constructor TScrollBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csSetCaption, csCaptureMouse, csClickEvents,
    csSetCaption, csDoubleClicks, csPannable];
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: csSetCaption wo hinschreiben?

  Alt 15. Mai 2009, 13:03
Zitat von DeddyH:
Obwohl ich nicht glaube, dass es daran liegt, ändere mal den Konstruktor.Controlstyle := Controlstyle - [csAcceptsControls] + [csSetCaption]; Übrigens gibt es in TControl bereits GetText und SetText als private Methoden.
Also folgendes hat sich durch deinen Hinweis positiv verändert: GetText und SetText als Funktionen raus genommen und als Property so gesetzt:

property Text; 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?
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: csSetCaption wo hinschreiben?

  Alt 15. Mai 2009, 13:07
Und wenn Du auf CM_TEXTCHANGED reagierst?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: csSetCaption wo hinschreiben?

  Alt 18. Mai 2009, 07:08
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:
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;
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.

Vielen Dank an meine Helfer
BAMatze
2. Account Sero
  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 03:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz