Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigenes Visueles Komponent mit zus. Formular (https://www.delphipraxis.net/179668-eigenes-visueles-komponent-mit-zus-formular.html)

Dr_C 23. Mär 2014 20:11

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:
  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
Der erste object ist richtig , aber der 2te soll gar nicht erscheinen.


Das ist vereinvachte code von dem komponent :
TestColorChange.pas
Delphi-Quellcode:
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.
Das ist der Formular der von den komponent aufgerufen wird :

uTestFormColorChange.pas
Delphi-Quellcode:
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.
uTestFormColorChange.dfm
Delphi-Quellcode:
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
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.

mfg
Arek

stahli 23. Mär 2014 20:33

AW: Eigenes Visueles Komponent mit zus. Formular
 
Zwei Vorschläge:

1) vielleicht hilft "Fenster.SetSubComponent(False);"
2) Erzeuge das Formular erst im ButtonClick.

Dr_C 23. Mär 2014 20:58

AW: Eigenes Visueles Komponent mit zus. Formular
 
Danke für schnelle Antwort .
2te möglichkeit funktionieret :thumb::
Delphi-Quellcode:
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;
Nochmal Danke.

mfg
Arek

Furtbichler 24. Mär 2014 06:29

AW: Eigenes Visueles Komponent mit zus. Formular
 
Und wieso verwendest Du kein TFrame?

Dr_C 24. Mär 2014 17:07

AW: Eigenes Visueles Komponent mit zus. Formular
 
Zitat:

Zitat von Furtbichler (Beitrag 1253192)
Und wieso verwendest Du kein TFrame?

Weil das Komponent kommt bei meinem Projekt mittlererweile mehr als 20 mal zu einsatz , und das ist noch nicht das ende . Und so ist das als Komponent händlicher als TFrame.

mfg
Arek

Furtbichler 24. Mär 2014 20:13

AW: Eigenes Visueles Komponent mit zus. Formular
 
Zitat:

Zitat von Dr_C (Beitrag 1253293)
Weil das Komponent kommt bei meinem Projekt mittlererweile mehr als 20 mal zu einsatz , und das ist noch nicht das ende . Und so ist das als Komponent händlicher als TFrame.

20x Einsetzen geht auch mit einem Frame und es ist leichter zu programmieren, aber es geht auch so. Kein Problem.

Dr_C 30. Mär 2014 20:54

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:
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;
Compilieren klappt , aber wenn ich diesen Komponent auf eine Form hinzufüge , bekomme ich folgende meldung :
Code:
Element '' hat kein übergeordnetes Fenster
Wenn ich die Zeile mit Items.Add wegnehme , dann ist alles OK , aber ich will das der ComboBox auch items besitzt .

mfg
Arek

stahli 30. Mär 2014 21:16

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.

Dr_C 1. Apr 2014 20:35

AW: Eigenes Visueles Komponent mit zus. Formular
 
Zitat:

Zitat von stahli (Beitrag 1254068)
Im Create hat Deine TTest noch keinen Parent.

Ja , du hast recht und habe ich eine lösung gefunden
Zitat:

Zitat von stahli (Beitrag 1254068)
Tipp: Schreibe eine Methode TTest.CreateItems, die Du später nach Bedarf aufrufen kannst bzw. musst.

Jein
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:
 protected
    { Protected-Deklarationen }
     procedure Loaded; override;
Und die procedur :
Delphi-Quellcode:
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;
mfg
Arek


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 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