![]() |
Nicht visuelle Komponente instanzieren
Hallo,
ich benutze eine nicht-visuelle Komponente names CPortLib um die serielle Schnittstelle anzusprechen. Diese Komponente zieht man auf ein Formular und kann diese dann mit Name.Methode() ansteuern. Nun schreibe ich eine Klasse die einige Methoden aus meinem Programm sinnvoll kapseln soll und dabei möchte ich auch die angesprochene Komponente verwendet. Meine Frage: Wie kann ich diese Komponente ansprechen, ohne dass ich Sie dafür auf ein Formular ziehen und in der Klasse umständlich ansprechen muss (frmMain.ComPort.* z.B). In Visual Basic ging das mit dem Schlüsselwort "new" in einer Deklarationsanweisung. Ich habe die Suchfunktion genutzt, aber leider nichts für mich verwendbares gefunden. Mir fehlten glaub ich einfach die richtigen Suchbegriffe :wink:. Vielen Dank. Grüße, Stefan |
Re: Nicht visuelle Komponente instanzieren
Hi, nur Halb-Pseudocode:
Delphi-Quellcode:
Freigeben und Initialisieren geht natürlich auch im finalization bzw. initialization.
MyComponent: TCOMPort;
MyComponent := TCOMPort.Create; try MyComponent.Bla(); // ... finally FreeAndNil(MyComponent); end; |
Re: Nicht visuelle Komponente instanzieren
in die uses Klausel mit aufnehmen
Delphi-Quellcode:
Variable für den Pointer auf das Objekt anlegen (global oder lokal in function oder prozedur
uses ... , NameDerUnit;
Delphi-Quellcode:
Objekt instanzieren und dann die Methoden und Variablen des Objekts nutzenvar MyComport : TComport; // oder im private bzw public Teil Deines Objektes (dann ohne var)
Delphi-Quellcode:
MyComport := TComport.Create; // evtl. mit Parametern wie z.Bsp. AOwner : TComponent
MyComport.Methode(); Freigeben wenn nicht mehr benötigt
Delphi-Quellcode:
Hoffe ich konnte helfen.
MyComport.Free;
CU Chris |
Re: Nicht visuelle Komponente instanzieren
Hallo,
vielen Dank an euch Beide! Es funktioniert. Noch eine Frage: Wenn ich dieses Objekt erzeugen will, wenn jemand meine Klasse erzeugt, muss der Code in einen Constructor oder? Wenn ich nun einen eigenen Constructor anlege, erwartet mich dann mehr Verantwortung als wenn ich den Constructor nutze den Delphi standardmäßig anlegt (TSonstwas.Create()). Ich habe in der Delphi-Hilfe etwas von Heap-Speicher-reservierung und co. gelesen? Grüße Stefan |
Re: Nicht visuelle Komponente instanzieren
Richtig, Du musst einen constructor anlegen.
Dort den Comport instanzieren Im destructor wieder freigeben. Denk an override hinter der Deklaration und an inherited im constructor und im destructor. Bsp.:
Delphi-Quellcode:
//Edit : Hab noch mal drüber nachgedacht, ist natürlich gar nicht zwingend erforderlich, kannst Du aber so machen.
//TMyobject Deklaration
private .... MyComport : TComport; public .... constructor Create; (Aowner:TComponent); override; destructor Destroy; override; ... constructor TMyObject.Create(AOwner:TComponent); begin inherited Create(AOwner); //ursprüngliche Instanzierung aufrufen MyComport := TComport.Create; end; destructor TMyObject.Destroy; begin MyComport.Free; inherited; //ursprüngliches Destroy aufrufen end; //Edit : Es geht genauso ohne constructor /destructor, Du musst nur sicherstellen, das du instanzierst, bevor der erste Zugriff auf //Edit : das Objekt erfolgt. |
Re: Nicht visuelle Komponente instanzieren
Hallo,
vielen Dank. Ich erhalte leider folgenden Fehler: "Eine statische Methode kann nicht überschrieben werden". Kann den Quellcode leider nicht hier einfügen, weil ich mit Cygwin im Internet bin :-/. Grüße Stefan |
Re: Nicht visuelle Komponente instanzieren
OK, dann ist constructor oder destructor static deklariert, somit ist überschreiben nicht möglich.
Auf welcher Klasse basiert Deine neue Klasse ? |
Re: Nicht visuelle Komponente instanzieren
Hallo,
einfach auf TObject (die "Basisklasse"). Habe mir die ein oder andere Website zum Thema OOP durchgelesen und TObject gewählt, weil alle anderen Klassen (angeblich) darauf basieren. Grüße Stefan |
Re: Nicht visuelle Komponente instanzieren
Zitat:
//Edit: Wo bleibt der rote Kasten, wenn man ihn braucht? :) Zum Thema: Komponenten solltest du von TComponent ableiten, so dir keine bessere Basisklasse findest. Sonst funktioniert das ganze visuelle Design im Formdesigner nicht. HTH, Uli. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 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