![]() |
Fehlermeldung nach Installation einer neuen Komponente
Hallo nochmal,
bin immer noch mit Problemen beschäftigt, die sich bei der Erstellung einer Komponente ergeben. Kurz für die, die sich die letzten beiden Beiträge nicht angeschaut haben. konstruiere mir gerade eine Composite Komponente. Habe sie auch fertig gestellt und per Package wurde sie in RAD installiert. Wenn ich mir die Komponente aber jetzt auf die Form ziehen möchte, tritt ein Fehler auf: Zitat:
Delphi-Quellcode:
Beim Quellcode wird wie gesagt nichts beanstandet. Ich weiß, dass dieser auch noch nicht bis ins kleinste ausgereift ist, ich wollte erstmal alle Schritte mit diesem Beispiel durch gehen, damit ich Gewissheit habe, dass alles so läuft wie ich will.
unit WinControl1;
interface uses SysUtils, Classes, Controls, ComCtrls, Windows, StdCtrls, Graphics; type TWinControl1 = class(TWinControl) private FLblContainerCaption, FLblTrackBar: TLabel; FEdPositionsEingabe: TEdit; FTrckBarTischposition: TTrackBar; FButtonEditEingabe: TButton; FCombBoxTischauswahl: TComboBox; fdTischposition: double; procedure SetContainerCaption(Value: string); procedure SetTischPosition(Value: double); function GetTischPosition: double; function CreatestaticLabel: TLabel; function CreatedynamicLAbel: TLabel; function CreateTrackBar: TTrackBar; function CreateEdit: TEdit; function CreateButton: TButton; function CreateComboBox: TComboBox; procedure Trackbarbewegung(Sender: TObject); procedure Position_ansteuern(Sender: TObject); procedure Edit_leeren(Sender: TObject); protected procedure CreateWnd; override; public constructor create(AOwner: TComponent); property ContainerCaption : string write SetContainerCaption; property Tischposition: double read GetTischPosition write SetTischposition; published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TWinControl1]); end; constructor TWinControl1.create(AOwner: TComponent); begin inherited create(AOwner); Controlstyle := Controlstyle - [csAcceptsControls]; // Der Componente wird nicht erlaubt // andere Componenten aufzunehmen, // als die, die durch den Programmierer // hier einprogrammiert werden. Visible := true; width := 300; height := 200; // TestLabel initialisieren FLblContainerCaption := CreatestaticLabel; FTrckBarTischposition := CreateTrackBar; FLblTrackBar := CreatedynamicLabel; FEdPositionsEingabe := CreateEdit; FButtonEditEingabe := CreateButton; FCombBoxTischauswahl := CreateComboBox; end; function TWinControl1.CreatestaticLabel: TLabel; begin result := TLabel.Create(Self); result.Parent := Self; result.Left := 18; result.Top := 10; end; function TWinControl1.CreatedynamicLabel: TLabel; begin result := TLabel.Create(Self); result.Parent := Self; result.Left := 10 + round((320000/700000)*200);; result.Top := 85; result.Caption := '0,00 mm'; end; function TWinControl1.CreateTrackBar: TTrackBar; begin result := TTrackbar.Create(Self); result.Parent := Self; result.Left := 10; result.Top := 100; result.Height := 20; result.Width := 200; result.Max := 640000; result.Position := 320000; result.OnChange := TrackBarBewegung; end; function TWinControl1.CreateEdit: TEdit; begin result := TEdit.Create(Self); result.Parent := Self; result.Left := 17; result.Top := 150; result.Height := 20; result.Width := 100; result.Text := 'Wert eingeben'; result.OnEnter := Edit_leeren; end; function TWinControl1.CreateButton; begin result := TButton.Create(Self); result.Parent := Self; result.Left := 130; result.Top := 145; result.Caption := 'Position ansteuern'; result.Height := 30; result.Width := 120; result.OnClick := Position_ansteuern; end; function TWinControl1.CreateComboBox: TComboBox; begin result := TComboBox.Create(Self); result.Left := 17; result.Top := 30; result.Height := 20; result.Width := 200; end; procedure TWinControl1.Trackbarbewegung(Sender: TObject); begin fLblTrackBar.Left := 10 + round((FTrckBarTischposition.Position/700000)*200); fLblTrackBar.Caption := floattostr((FTrckBarTischposition.Position/6400)- 50) + ' mm'; fdTischposition := FTrckBarTischposition.Position/6400; end; procedure TWinControl1.Edit_leeren(Sender: TObject); begin fEdPositionsEingabe.Clear; end; // Procedure fehlerhaft, wenn Edit leer ist procedure TWinControl1.Position_ansteuern(Sender: TObject); begin try fdTischposition := strtofloat(FEdPositionsEingabe.Text)+50; FTrckBarTischposition.Position := round(fdTischposition*6400) except end; end; procedure TWinControl1.SetContainerCaption(Value: string); begin FLblContainerCaption.Caption := Value; end; procedure TWinControl1.SetTischPosition(Value: Double); begin fdTischposition := Value; FTrckBarTischposition.Position := round(fdTischposition*6400); end; function TWinControl1.GetTischPosition: double; begin result := fdTischposition; end; procedure TWinControl1.CreateWnd; begin inherited createWnd; FCombBoxTischauswahl.Parent := self; FCombBoxTischauswahl.Clear; FCombBoxTischauswahl.Items.Add('Verschiebetisch Referenzfaser'); FCombBoxTischauswahl.Items.Add('Verschiebetisch Kamera/ Spleißgerät'); FCombBoxTischauswahl.Items.Add('Piezoverschiebetisch'); FCombBoxTischauswahl.ItemIndex := 0; end; end. Sieht jemand eventuell einen Fehler, der zu dem oben angegebenen Fehler führt? Vielen Dank BAMatze Ps.: hier noch der Link zum vorletzten Beitrag ( ![]() |
Re: Fehlermeldung nach Installation einer neuen Komponente
Hi,
du creierst deine Labels etc. im Constructor. Da darf das nicht hin. Creiere alles in CreateWnd.
Delphi-Quellcode:
Den Owner setzt du auf nil. Wenn du das nicht tust, wird bei jedem Laden des Formulares auf dem du die Komponente platziert hast durch die Serialisierung eine weitere Komponente deiner Labels usw. auf deiner Komponente kreiert. Das ist dann nicht so toll. Ich hab es mir übriegens fast vollständig abgewöhnt auf meinen Komponenten weitere Komponenten zu halten. Nur, wenn es unbedingt sein muss.
constructor TWinControl1.create(AOwner: TComponent);
begin inherited create(AOwner); Controlstyle := Controlstyle - [csAcceptsControls]; // Der Componente wird nicht erlaubt // andere Componenten aufzunehmen, // als die, die durch den Programmierer // hier einprogrammiert werden. Visible := true; width := 300; height := 200; end; procedure TWinControl1.CreateWnd; begin inherited createWnd; // TestLabel initialisieren FLblContainerCaption := CreatestaticLabel; FTrckBarTischposition := CreateTrackBar; FLblTrackBar := CreatedynamicLabel; FEdPositionsEingabe := CreateEdit; FButtonEditEingabe := CreateButton; FCombBoxTischauswahl := CreateComboBox; FCombBoxTischauswahl.Parent := self; FCombBoxTischauswahl.Clear; FCombBoxTischauswahl.Items.Add('Verschiebetisch Referenzfaser'); FCombBoxTischauswahl.Items.Add('Verschiebetisch Kamera/ Spleißgerät'); FCombBoxTischauswahl.Items.Add('Piezoverschiebetisch'); FCombBoxTischauswahl.ItemIndex := 0; end; Hier ein Beispiel, wie du die Komponente kreieren musst.
Delphi-Quellcode:
Gruß oki
function TWinControl1.CreatestaticLabel: TLabel;
begin result := TLabel.Create(nil); result.Parent := Self; result.Left := 18; result.Top := 10; end; |
Re: Fehlermeldung nach Installation einer neuen Komponente
Danke dir oki, hatte auch ebend alles schonmal in den createWnd-Bereich gepackt und es funzte auf einmal. Allerdings bleibt noch eine Frage offen. Im Tutorial von Ray Konopka wird ebenfalls auf die Unterschiede der Initialisierung mit Self, Nil und AOwner hingewiesen. Herr Konopka favourisiert hier die Variante Self, da diese sich automatisch (wenn ich es richtig verstanden hab) um das Destroy und free kümmert (im Video ist dies min 12min00sec - 13min30sec) das Problem mit der mehrfachen Kreierung der Labels und weiterer Elemente wird dort erwähnt, wenn ich als AOwner alles initialiersieren würde.
Was mich aber ebenfalls irritiert, ist dass er alles bei sich im Konstruktor deklariert, also was du mir ja jetzt gesagt hast, was ich ändern soll. Deswegen mal die Frage, wie kann ich das mit der mehrfachen Kreierung der Labels testen? |
Re: Fehlermeldung nach Installation einer neuen Komponente
mit dem mehrfachen creieren testest du am einfachsten, indem du die Komponente auf ein Fenster legst, die Unit schließt und wieder öffnest. Mit jedem Öffnen erhältst du eine neue Instanz. Du kannst den Constructor nutzen, wenn owner nil ist. Den Parent musst du dann aber wieder in CreateWnd zuweisen, da self im Create noch nicht instanciiert ist.
Gib mir mal den Link für das Video. Kenn ich glaub ich noch nicht. Creierst du eine Componente mit einem Owner, so wird die Instanc deiner Componente in der Liste Components der als AOwner angegebenen Komponente aufgenommen. Wird dein Owner frei gegeben, so arbeitet er seine Liste Components (Public Eigenschaft aller Componenten) ab und gibt die darin aufgeführten Componenten ebenfalls frei. Gruß oki |
Re: Fehlermeldung nach Installation einer neuen Komponente
Hier ist der
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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