![]() |
Delphi-Version: 7
Eigenes Visueles Komponent mit zus. Formular
Ich bin dabei eigenes Komponent erstellen , der unteranderen ein Button beinhaltet.
Der button öffnet ein Formular . Auf ersten Blick scheint dass alles funktionieret , aber es gibt ein ABER : In der Form , wo man den Komponent benutzt wird folgendes hinzugefügt :
Delphi-Quellcode:
Der erste object ist richtig , aber der 2te soll gar nicht erscheinen.
object TestColorChange1: TTestColorChange
Left = 332 Top = 108 Width = 143 Height = 43 end object TTestFormColorChange Left = 0 Top = 0 Width = 320 Height = 240 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 end Das ist vereinvachte code von dem komponent : TestColorChange.pas
Delphi-Quellcode:
Das ist der Formular der von den komponent aufgerufen wird :
unit TestColorChange;
interface uses SysUtils, Classes, Controls, ExtCtrls, StdCtrls, uTestFormColorChange ; type TTestColorChange = class(TCustomControl) private { Private-Deklarationen } CCEdit : TEdit ; CCButton : TButton ; CCShape : TShape ; Fenster : TTestFormColorChange ; FOnChange: TNotifyEvent; procedure ButtonClick(Sender: TObject); procedure EditChange(Sender: TObject); protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create( AOwner: TComponent); Override; destructor Destroy; override; published { Published-Deklarationen } property OnChange: TNotifyEvent read FOnChange write FOnChange; end; procedure Register; implementation constructor TTestColorChange.Create(AOwner: TComponent); begin RegisterClass(TTestFormColorChange); inherited Create(AOwner); Fenster := TTestFormColorChange.Create(Owner); CCEdit := TEdit.Create(Self); CCButton := TButton.Create(Self); CCShape := TShape.Create(Self); insertcontrol(CCEdit); insertcontrol(CCButton); insertcontrol(CCShape); CCEdit.Name := name + 'Edit'; CCEdit.Top := 1 ; CCEdit.Left := 1 ; CCEdit.Text := name ; CCEdit.OnChange := EditChange ; CCButton.Name := Name + 'Button' ; CCButton.Left := CCEdit.Width +1 ; CCButton.Top := 1 ; CCButton.Height := CCEdit.Height +1 ; CCButton.Width := CCButton.Height ; CCButton.Caption := '...'; CCButton.OnClick := ButtonClick ; CCShape.Name := Name + 'Shape'; CCShape.Top := CCEdit.Height+3 ; CCShape.Left := 1 ; CCShape.Height := CCEdit.Height ; CCShape.Width :=CCEdit.Width + CCButton.Width; height := ( CCEdit.Height * 2 ) + 5 ; width := CCShape.Width + 2 ; end; destructor TTestColorChange.Destroy; begin CCShape.Free; CCButton.Free; CCEdit.Free; Fenster.Destroy ; inherited Destroy; end; procedure TTestColorChange.EditChange(Sender: TObject); begin if Assigned(FOnChange) then FOnChange(self); end; procedure TTestColorChange.ButtonClick(Sender: TObject); var tmp : string ; begin tmp := CCEdit.text ; if Fenster.Execute( tmp ) then begin CCEdit.text := tmp ; end; end; procedure Register; begin RegisterComponents('MyTools', [TTestColorChange]); end; end. uTestFormColorChange.pas
Delphi-Quellcode:
uTestFormColorChange.dfm
unit uTestFormColorChange;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TTestFormColorChange = class(TForm) BitBtn1: TBitBtn; BitBtn2: TBitBtn; private { Private-Deklarationen } public { Public-Deklarationen } class function Execute(var Farbe : string ):Boolean; end; var TestFormColorChange: TTestFormColorChange; implementation {$R *.dfm} class function TTestFormColorChange.Execute(var Farbe : string ):Boolean; begin with Create(Application) do begin Result := (ShowModal=mrOK); if Result then begin Farbe := '123456'; end; end; end; end.
Delphi-Quellcode:
Probleme macht das erst , wenn man diesen Komponent auf Frames benutzt . bei google habe ich nichts gefunden , was mir weiter helfen konnte . Vielleicht jemand von Euch kann mir helfen.
object TestFormColorChange: TTestFormColorChange
Left = 581 Top = 263 Width = 255 Height = 132 Caption = 'TestFormColorChange' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object BitBtn1: TBitBtn Left = 36 Top = 60 Width = 81 Height = 25 TabOrder = 0 Kind = bkCancel end object BitBtn2: TBitBtn Left = 132 Top = 60 Width = 81 Height = 25 TabOrder = 1 Kind = bkOK end end mfg Arek |
AW: Eigenes Visueles Komponent mit zus. Formular
Zwei Vorschläge:
1) vielleicht hilft "Fenster.SetSubComponent(False);" 2) Erzeuge das Formular erst im ButtonClick. |
AW: Eigenes Visueles Komponent mit zus. Formular
Danke für schnelle Antwort .
2te möglichkeit funktionieret :thumb::
Delphi-Quellcode:
Nochmal Danke.
procedure TTestColorChange.ButtonClick(Sender: TObject);
var tmp : string ; begin Fenster := TTestFormColorChange.Create(Owner); // verschoben von TTestColorChange.Create tmp := CCEdit.text ; if Fenster.Execute( tmp ) then begin CCEdit.text := tmp ; end; Fenster.Destroy ; // verschoben von TTestColorChange.Destroy end; mfg Arek |
AW: Eigenes Visueles Komponent mit zus. Formular
Und wieso verwendest Du kein TFrame?
|
AW: Eigenes Visueles Komponent mit zus. Formular
Zitat:
mfg Arek |
AW: Eigenes Visueles Komponent mit zus. Formular
Zitat:
|
AW: Eigenes Visueles Komponent mit zus. Formular
Noch ein Problem :
Wenn ich in diesen Komponent noch ein ComboBox hünzufüge , klappt das einwandfrei.
Delphi-Quellcode:
Compilieren klappt , aber wenn ich diesen Komponent auf eine Form hinzufüge , bekomme ich folgende meldung :
constructor TTest.Create(AOwner: TComponent);
begin ... CCombo1 := TComboBox.Create(Self); insertcontrol(CCombo1); CCombo1.Name := 'Combo1' + Name ; CCombo1.Items.Add('200'); // diese zeile macht probleme ... end;
Code:
Wenn ich die Zeile mit Items.Add wegnehme , dann ist alles OK , aber ich will das der ComboBox auch items besitzt .
Element '' hat kein übergeordnetes Fenster
mfg Arek |
AW: Eigenes Visueles Komponent mit zus. Formular
Im Create hat Deine TTest noch keinen Parent.
CCombo1.Items benötigt vermutlich einen Parent (ich habe das jetzt aber nicht geprüft). Tipp: Schreibe eine Methode TTest.CreateItems, die Du später nach Bedarf aufrufen kannst bzw. musst. |
AW: Eigenes Visueles Komponent mit zus. Formular
Zitat:
Zitat:
Die CreateItems wird nicht automatisch ausgeführt , aber Idee war schon gut . Das ist meine Lösung : In der Protected-Deklarationen von mein Komponent :
Delphi-Quellcode:
Und die procedur :
protected
{ Protected-Deklarationen } procedure Loaded; override;
Delphi-Quellcode:
mfg
procedure TTest.Loaded;
begin inherited Loaded; CCombo1.Items.Add('1'); CCombo1.Items.Add('2'); CCombo1.Items.Add('3'); CCombo1.Items.Add('4'); CCombo1.Items.Add('...'); end; Arek |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 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