![]() |
fehler in meiner unit !?
Code:
ich habe diese unit in mein hauptprogramm geladen und versuche nun getversion aufzurufen(nachdem ich setversion aufgerufen habe). Wenn ich das mache ist alles OK, wenn ich nun aber direkt aus dieser, oben geposteten, unit getversion aufrufen will, kommt in dieser zeile immer ein fehler:
unit uBookmark;
interface uses Sysutils, Forms; type TBookmark = class protected version: string; public constructor create(); function isvalid: boolean; procedure setversion(bm_version: string); function getversion: string; end; implementation var bookmark: TBookmark; constructor TBookmark.create(); begin end; procedure TBookmark.setversion(bm_version: string); begin version:= bm_version; end; function TBookmark.getversion: string; begin result:= version; end; function TBookmark.isvalid: boolean; begin if 'blablabla'= getversion then result:= true; else result:= false; end;
Code:
ich kann die funktion isvalid, die auf getversion zugreift, also nicht fehlerfrei ausführen.
result:= version;
ich hoffe ihr habts verstanden und könnt mir weiterhelfen, bin hier schon kurz vorm verzweifeln :cry: PS: bin neu in der programmierung von units ;-) |
Hallo iaby,
ich machs immer so:
Delphi-Quellcode:
So kann man im Rahmen einer Instanz für TBookmark als Eigenschaft auf Version von außen zugreifen.TBookmark = class(TObject) privat Fversion: string; public constructor create(); function isvalid: boolean; procedure setversion(bm_version: string); property Version : String read FVersion write SetVersion; end;
Delphi-Quellcode:
Ich hoffe das hilft weiter,
DieseVersion := MyBookmark.Version;
Gruß oki PS Dein Problem hat nichts mit Unit's zu tun. |
Ups,
Delphi-Quellcode:
falsch geschrieben.
private
Sorry oki |
ich habe meinen code jetzt mal abgeändert, es funktioniert aber immer noch nicht!
was ich jetzt festgestellt habe: ich habe die gleich unit in ein neues programm integriert, das die isvalid funktion benutzt. hier geht aber alles wunderbar, bei dem programmm, bei dem ich es brauche, geht es nicht. weiß jemand wo zwischen meinen zwei programmen der unterschied liegen kann? ich bin hier grd wirklich am verzweifeln!!! :evil: :evil: :evil: :evil: gruss iaby |
Hi,
das es überhaupt geht ist verwunderlich. Der Code
Delphi-Quellcode:
muss auf alle Fälle nach
constructor TBookmark.create();
begin end;
Delphi-Quellcode:
geändert werden.
constructor TBookmark.create();
begin inherited; end; ...:cat:... |
@sakura
Wieso inherited? @iaby Deine unit ist schon richtig. Das "var bookmark: TBookmark" gehört da aber nicht hin. Deine unit die das nutzen soll müsste dann so aussehen:
Delphi-Quellcode:
Hast bestimmt das Erzeugen einer variablen type TBookmark vergessen.
var
Form1: TForm1; bm: TBookmark; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin bm:= TBookmark.create; bm.setversion('blablabla'); ShowMessage(bm.getversion); if bm.isvalid then beep end; Hab ich auch immer wieder gern gemacht :lol: |
ich hab den fehler jetzt:
habe isvalid in der unit mit bookmark.isvalid gestartet und das geht schief. wieso weiss ich nicht, aber es ist so. Danke für die schnellen antworten! |
@Udo: Wieso inherited? Erstens, weil Create bereits in TObject definiert ist
Delphi-Quellcode:
Es stimmt, das die Implementierung in TObject leer ist,
TObject = class
constructor Create;
Delphi-Quellcode:
, aber Delphi führt intern einige *Magic-Compiler* Routinen aus. Zusätzlich ist es theoretisch möglich (Borland weisst übrigens auch darauf hin), dass TObject in späteren Implementierungen auch Code in die Create-Routine setzt, dann wird die Komponente gar nicht mehr laufen, wenn inherited fehlt. Letztens, es gehört zum sauberen Stil, die Vorgänger-Methoden aufzurufen, sofern diese nicht als abstract definiert sind.
constructor TObject.Create;
begin end; ...:cat:... |
Hallo iaby,
beherzige auf jeden Fall die Hinweise aller anderen. Die sind absolut korrekt (hab ich auf die Schnelle nur übersehen). Zu Deiner abschließenden Erkenntnis folgendes: Greife innerhalb der Methoden Deines Objektes nie mit einer führenden Instanz-Variablen auf eigene Methoden zu. Sicher deklarierst Du in der Regel im Kopfteil Deiner Unit eine Variable vom Typ Deines Objektes. Der Sinn ist aber eher, dass du unterschiedliche Instanzen bilden kannst. Verwendest Du hierbei nicht die in deiner Unit angegebene (ganz normal), so fangen die Probleme an. Außerdem kannst du innerhalb der Methoden Deines Objectes jede andere Mothode deines Objektes ohne führende Instanz aufrufen. Die Bezüge gelten dort immer auf "self". Das heist, dass Deine Methode (Function) IsValid in jeder Methode deines Objektes einfach so aufgerufen werden kann, und es wird die eigene verwendet. Man hab ich mir einen abgebrochen. Ich hoffe es war verständlich. Gruß oki |
danke oki, werde es mit beherzigen ;-)
hab zwar etwas gebraucht, glaube aber deinen text verstanden zu haben! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:45 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