AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Eigenes Visueles Komponent mit zus. Formular
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenes Visueles Komponent mit zus. Formular

Ein Thema von Dr_C · begonnen am 23. Mär 2014 · letzter Beitrag vom 1. Apr 2014
Antwort Antwort
Dr_C

Registriert seit: 13. Jul 2003
6 Beiträge
 
#1

Eigenes Visueles Komponent mit zus. Formular

  Alt 23. Mär 2014, 20:11
Delphi-Version: 7
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

Geändert von Dr_C (23. Mär 2014 um 20:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 23. Mär 2014, 20:33
Zwei Vorschläge:

1) vielleicht hilft "Fenster.SetSubComponent(False);"
2) Erzeuge das Formular erst im ButtonClick.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Dr_C

Registriert seit: 13. Jul 2003
6 Beiträge
 
#3

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 23. Mär 2014, 20:58
Danke für schnelle Antwort .
2te möglichkeit funktionieret :
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

Geändert von Dr_C (24. Mär 2014 um 17:11 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 24. Mär 2014, 06:29
Und wieso verwendest Du kein TFrame?
  Mit Zitat antworten Zitat
Dr_C

Registriert seit: 13. Jul 2003
6 Beiträge
 
#5

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 24. Mär 2014, 17:07
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

Geändert von Dr_C (24. Mär 2014 um 17:12 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 24. Mär 2014, 20:13
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.
  Mit Zitat antworten Zitat
Dr_C

Registriert seit: 13. Jul 2003
6 Beiträge
 
#7

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 30. Mär 2014, 20:54
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

Geändert von Dr_C (30. Mär 2014 um 20:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 30. Mär 2014, 21:16
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Dr_C

Registriert seit: 13. Jul 2003
6 Beiträge
 
#9

AW: Eigenes Visueles Komponent mit zus. Formular

  Alt 1. Apr 2014, 20:35
Im Create hat Deine TTest noch keinen Parent.
Ja , du hast recht und habe ich eine lösung gefunden
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
  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 23:17 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