AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

fehler in meiner unit !?

Ein Thema von iaby · begonnen am 14. Feb 2003 · letzter Beitrag vom 17. Feb 2003
Antwort Antwort
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#1

fehler in meiner unit !?

  Alt 14. Feb 2003, 14:31
Code:
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;
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:
Code:
result:= version;
ich kann die funktion isvalid, die auf getversion zugreift, also nicht fehlerfrei ausführen.
ich hoffe ihr habts verstanden und könnt mir weiterhelfen, bin hier schon kurz vorm verzweifeln

PS: bin neu in der programmierung von units
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2
  Alt 14. Feb 2003, 14:46
Hallo iaby,

ich machs immer so:
Delphi-Quellcode:

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;
So kann man im Rahmen einer Instanz für TBookmark als Eigenschaft auf Version von außen zugreifen.

  DieseVersion := MyBookmark.Version; Ich hoffe das hilft weiter,

Gruß oki

PS Dein Problem hat nichts mit Unit's zu tun.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3
  Alt 14. Feb 2003, 14:47
Ups,
private falsch geschrieben.

Sorry oki
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#4
  Alt 14. Feb 2003, 18:08
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!!!

gruss iaby
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#5
  Alt 14. Feb 2003, 18:19
Hi,

das es überhaupt geht ist verwunderlich. Der Code
Delphi-Quellcode:
constructor TBookmark.create();
begin
end;
muss auf alle Fälle nach
Delphi-Quellcode:
constructor TBookmark.create();
begin
  inherited;
end;
geändert werden.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Udo

Registriert seit: 19. Jan 2003
54 Beiträge
 
Delphi 8 Architect
 
#6
  Alt 14. Feb 2003, 23:16
@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:
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;
Hast bestimmt das Erzeugen einer variablen type TBookmark vergessen.
Hab ich auch immer wieder gern gemacht
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#7
  Alt 15. Feb 2003, 17:56
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!
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#8
  Alt 15. Feb 2003, 22:46
@Udo: Wieso inherited? Erstens, weil Create bereits in TObject definiert ist
Delphi-Quellcode:
  TObject = class
    constructor Create;
Es stimmt, das die Implementierung in TObject leer ist,
Delphi-Quellcode:
constructor TObject.Create;
begin
end;
, 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.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9
  Alt 17. Feb 2003, 11:49
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
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#10
  Alt 17. Feb 2003, 18:55
danke oki, werde es mit beherzigen
hab zwar etwas gebraucht, glaube aber deinen text verstanden zu haben!
  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 09:53 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