AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Fehlermeldung nach Installation einer neuen Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung nach Installation einer neuen Komponente

Ein Thema von BAMatze · begonnen am 19. Mär 2009 · letzter Beitrag vom 19. Mär 2009
Antwort Antwort
BAMatze

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

Fehlermeldung nach Installation einer neuen Komponente

  Alt 19. Mär 2009, 09:01
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:
Zugriffsverletzung bei Adresse 0F6B1CE6 in Modul 'Package1.bpl'. Lesen von Adresse 00000000.
Hier mal der Quellcode für meine Komponente:
Delphi-Quellcode:
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.
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.

Sieht jemand eventuell einen Fehler, der zu dem oben angegebenen Fehler führt?

Vielen Dank
BAMatze

Ps.: hier noch der Link zum vorletzten Beitrag (http://www.delphipraxis.net/internal...t.php?t=154378)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Fehlermeldung nach Installation einer neuen Komponente

  Alt 19. Mär 2009, 09:40
Hi,

du creierst deine Labels etc. im Constructor. Da darf das nicht hin. Creiere alles in CreateWnd.

Delphi-Quellcode:
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;
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.

Hier ein Beispiel, wie du die Komponente kreieren musst.
Delphi-Quellcode:
function TWinControl1.CreatestaticLabel: TLabel;
begin
  result := TLabel.Create(nil);
  result.Parent := Self;
  result.Left := 18;
  result.Top := 10;
end;
Gruß oki
42
  Mit Zitat antworten Zitat
BAMatze

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

Re: Fehlermeldung nach Installation einer neuen Komponente

  Alt 19. Mär 2009, 09:55
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?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Fehlermeldung nach Installation einer neuen Komponente

  Alt 19. Mär 2009, 10:05
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
42
  Mit Zitat antworten Zitat
BAMatze

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

Re: Fehlermeldung nach Installation einer neuen Komponente

  Alt 19. Mär 2009, 10:15
Hier ist der Link, den ich damals auch bekommen hab. Ca. Mittig siehst du die zip für Composite VCL Controls von Ray Konopka. Diese musst du öffnen und dann starte ich immer die Composites.swf Datei mit Firefox. Dann bist du schon auf der Tutorial-Seite. 45min Video auf Englisch
  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 12:28 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