Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fehler bei der Verwendung von eigener Komponente (https://www.delphipraxis.net/121241-fehler-bei-der-verwendung-von-eigener-komponente.html)

BAMatze 24. Sep 2008 12:44


Fehler bei der Verwendung von eigener Komponente
 
Hallo,

Habe mir eine eigene Komponente aus der TCustomComboBox programmiert. Diese funktioniert auch problemlos (kein Fehler bei der Compilierung). Wenn ich die Komponente in ein Programm einbaue, startet dieses auch problemlos, allerdings erzeuge ich eine Exception direkt nach dem Start.

Hier der Quellcode für die Komponente:

Delphi-Quellcode:
unit StageSelect;

interface

uses
  SysUtils, Classes, Controls, StdCtrls;

const Ext_Lib1 = 'D:\Tischsteuerung\MMC.dll';
//const Ext_Lib2 = 'D:\Tischsteuerung\E816_DLL.dll';

type TTische =(Verschiebetisch1, Verschiebetisch2, PiezoVerschiebetisch);

type
  TStageSelect = class(TCustomComboBox)
  private
    bVerbindungstest: boolean;
    FID1: integer;
    FTisch: TTische;
    FIndex: integer;
    procedure GetID(Value: integer);
    { Private-Deklarationen }
  protected

    { Protected-Deklarationen }
  public
    property ID1:integer read FID1 write GetID;
    function Verbindungstest(Objekt: TTische): integer;
    { Public-Deklarationen }
  published
    property Tisch: TTische read FTisch write FTisch;
    { Published-Deklarationen }
  end;

procedure Register;
function MMC_getReport(pCmd,psRead:PChar):integer; stdcall external Ext_Lib1;
//function E816_IsConnected(ID: integer): boolean; stdcall external Ext_Lib2;

implementation

procedure TStageSelect.GetID(Value: integer);
begin
  if Value <> ID1 then ID1 := Value;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TStageSelect]);
end;

function TStageSelect.Verbindungstest(Objekt: TTische): integer;
var psRead: array[0..500] of Char;
begin
  if Objekt in [Verschiebetisch1,Verschiebetisch2] then result := MMC_getReport('TS',psRead);
end;

end.
Hier die Fehlermeldung, die erscheint, wenn die Komponente in ein Projekt eingebaut wurde:

"Im Projekt Project1.exe ist eine Exception der Klasse EReadError mit der Meldung'Eigenschaft Tisch existiert nicht.' aufgetreten."

Kann mir einer sagen, wie ich die Komponente abändern muss, damit dies nicht mehr vorkommt.

Vielen Dank im Vorraus

BAMatze

grenzgaenger 24. Sep 2008 14:08

Re: Fehler bei der Verwendung von eigener Komponente
 
propiere mal eine "default" eigenschaft hinter der published property anzufügen.

taaktaak 24. Sep 2008 14:18

Re: Fehler bei der Verwendung von eigener Komponente
 
Ich vermisse da ein klitzekleines create()
- oder braucht man das etwa nicht?

grenzgaenger 24. Sep 2008 14:20

Re: Fehler bei der Verwendung von eigener Komponente
 
Zitat:

Zitat von taaktaak
Ich vermisse da ein klitzekleines create()
- oder braucht man das etwa nicht?

wird das nicht vom elternobjekt geerbt? :stupid:

Roachford 24. Sep 2008 14:32

Re: Fehler bei der Verwendung von eigener Komponente
 
Zitat:

Zitat von grenzgaenger
Zitat:

Zitat von taaktaak
Ich vermisse da ein klitzekleines create()
- oder braucht man das etwa nicht?

wird das nicht vom elternobjekt geerbt? :stupid:

Klar, aber initialisiert trotzdem nicht FTisch - schliesslich kennt er den nichtmal persönlich...

Ist Müll da keine Klasse. Der Member wird natürlich initialisert mit dem ersten Typ der Aufzählung.

nahpets 24. Sep 2008 14:51

Re: Fehler bei der Verwendung von eigener Komponente
 
Hallo,

schau mal da --> http://www.google.de/search?hl=de&q=...eadError&meta=
Da hilft Dir eventuell irgend ein Link weiter (z. B. erster Link, dort EReadError suchen - entspricht wohl der Info aus der Delphi-Hilfe).

EReadError tritt meines Wissens auf, wenn beim Erstellen eines Formulares etwas aus der Resource gelesen werden soll, was da nicht drin ist. Vermutlich gibt es in der DFM-Datei zum Formular irgendwo einen Fehler.

DFM mal als Text anschauen und dann wieder als Formular, manchmal werden dann Fehler beseitigt. Anschließend neu kompilieren und nochmal versuchen. Ansonsten ist Delphi eventuell nicht in der Lage, Deinen Nachfahren von TCustomComboBox richtig zu erstellen.

Stephan

Bernhard Geyer 24. Sep 2008 14:53

Re: Fehler bei der Verwendung von eigener Komponente
 
***

Vergesst den Post. Irgendwie war ich von einer Klasse bei TTische ausgegangen :gruebel:

nahpets 24. Sep 2008 15:07

Re: Fehler bei der Verwendung von eigener Komponente
 
Hallo,

Delphi-Quellcode:
type TTische =(Verschiebetisch1, Verschiebetisch2, PiezoVerschiebetisch);
.
.
.
  FTisch: TTische;
FTisch müsste meiner Meinung nach ein Set Of TTische sein.

Delphi-Quellcode:
type TTisch =(Verschiebetisch1, Verschiebetisch2, PiezoVerschiebetisch);
     TTische = set of TTisch;
.
.
.
  FTisch: TTische;
Stephan

DeddyH 24. Sep 2008 15:16

Re: Fehler bei der Verwendung von eigener Komponente
 
Wieso? Ein Set müsste es IMHO sein, wenn verschiedene Kombinationen möglich sind.

nahpets 24. Sep 2008 15:22

Re: Fehler bei der Verwendung von eigener Komponente
 
Hallo,
Zitat:

Zitat von DeddyH
Wieso? Ein Set müsste es IMHO sein, wenn verschiedene Kombinationen möglich sind.

die Plausibilität muss in den Gettern und Settern geprüft werden.
Mir ist die Umsetzung eines Konstrukts, wie hier beschrieben, noch nicht in der Form geglückt, dass die Eigenschaft auch im Objektinspektor zu sehen ist und (korrekt) in der Formulardatei abgespeichert wurde, sprich ohne den EReadError (Das heißt jetzt aber nicht, das es nicht vielleicht doch irgendwie ginge :wink:)

Stephan

DeddyH 24. Sep 2008 15:25

Re: Fehler bei der Verwendung von eigener Komponente
 
Das sollte schon gehen. Ich würde mir einen Konstruktor bauen, in dem FTisch initialisiert wird und das 2. "type" mal weglassen.

nahpets 24. Sep 2008 15:32

Re: Fehler bei der Verwendung von eigener Komponente
 
Hallo,
Zitat:

Zitat von DeddyH
Das sollte schon gehen. Ich würde mir einen Konstruktor bauen, in dem FTisch initialisiert wird und das 2. "type" mal weglassen.

Ja, irgendwie schon, nur der EReadError tritt auf, bevor Du durch Constructor, Setter und Getter kommst. Der Fehler muss mit der Art, wie die Komponente von Delphi in de DFM gelegt wird, zusammenhängen.

Da dürfte grenzgaenger mit seinem Vorschlag zur Defaultangabe schon richtig liegen, so ist es auch für entsprechende Attribute in den Sourcen von Delphi zu finden.

Stephan

DeddyH 24. Sep 2008 15:36

Re: Fehler bei der Verwendung von eigener Komponente
 
Oder stored definieren, wenn ich das richtig im Kopf habe.

nahpets 24. Sep 2008 15:46

Re: Fehler bei der Verwendung von eigener Komponente
 
Zitat:

Zitat von DeddyH
Oder stored definieren, wenn ich das richtig im Kopf habe.

Das könnte sogar die bessere Alternative sein, denn dann steht's definitiv in der DMF.

Stephan

Uwe Raabe 24. Sep 2008 19:29

Re: Fehler bei der Verwendung von eigener Komponente
 
Die Komponente kann eigentlich so bleiben und sollte auch funktionieren. Dein Problem liegt vermutlich doch in einer defekten DFM-Datei. Also entweder diese als Text-Datei mal ansehen (oder hier posten) oder das Formular ganz wegschmeißen und neu aufbauen.

Ein anderes Problem ist allerdings, daß du die ganzen Eigenschaften, die eine ComboBox eigentlich ausmachen, nicht als published deklarierst. Schau dir mal die Definition von TComboBox an, wie das da gemacht ist (einschließlich der Kommentare). Ich kann mir nicht vorstellen, daß du auf diese ganzen Eigenschaften im Objekt-Inspektor verzichten willst.

Alternativ kann man auch statt von TCustomComboBox direkt von TComboBox ableiten. Bietet sich aber nur an, wenn du alle diese Eigenschaften auch veröffentlichen willst.

SirThornberry 24. Sep 2008 19:58

Re: Fehler bei der Verwendung von eigener Komponente
 
Könntest du deinem Beitrage bitte einen Titel geben der das Problem wenigstens andeutungsweise beschreibt? :-) Danke


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