AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi seltsamer Fehler bei der Arbeit mit Klassen
Thema durchsuchen
Ansicht
Themen-Optionen

seltsamer Fehler bei der Arbeit mit Klassen

Ein Thema von Niels · begonnen am 31. Aug 2004 · letzter Beitrag vom 31. Aug 2004
Antwort Antwort
Niels

Registriert seit: 25. Okt 2003
192 Beiträge
 
#1

seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 16:48
Hi,

mir ist da vorhin was aufgefallen, was ich mir nicht wirklich erklären kann

Ich habe folgende Typen deklariert:

Delphi-Quellcode:
type
  THKlasse = class
   typ: string;
  end;
  TUKlasseInt = class(THKlasse)
    inhalt: Integer;
  end;
  TUKlasseStr = class(THKlasse)
    inhalt: string;
  end;

var
  test: THKlasse;
Folgende Prozedur funktioniert fehlerfrei (egal welches der 3 Creates ich verwende):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  test := THKlasse.Create;
  // test := TUKlasseInt.Create;
  // test := TUKlasseStr.Create;
  TUklasseInt(test).inhalt := 12;
  Form1.Caption := IntToStr(TUKlasseInt(test).inhalt);
end;
Arbeite ich nun aber mit TUKlasseStr, so funktioniert nur mit beiden folgenden Möglichkeiten:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  test := TUKlasseStr.Create;
  // test := TUKlasseInt.Create;
  TUklasseStr(test).inhalt := '12';
  Form1.Caption := TUKlasseStr(test).inhalt;
end;
Benutze ich test := THKlasse.Create, so gibt's ne Access Violation bei der Ausgabe von inhalt.

Meine Frage ist jetzt, warum es im 1. Fall immer Funktioniert, im 2. jedoch nur wenn test eine Instanz einer Unterklasse von THKlasse ist.
Außerdem wüde mich interessieren, warum die Unterklassen überhaupt miteinander kompatible sind, obwohl sie unterschiedliche Datentypen enthalten.

mfg Niels
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 17:08
Objektfelder sind statisch, d.h. das Feld befindet sich einen zur Compilierzeit bekannten Offset vom Objektanfang entfernt. Deshalb wird eine gültige Speicherposition errechnet. Dass das in ersterem Fall funktioniert und in zweiterem nicht, ist schlicht Zufall. Es könnte genausogut sein, dass an der Speicherstelle etwas steht und das überschrieben wird (was eine AccesVioalation hervorrufen würde).
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 18:02
Was Du da möchtest, geht so einfach leider nicht. Dazu solltest Du Dich entweder mal in das Thema Interfaces und Mehrfachvererbung reinwurschteln (vorsicht - Heftig!), damit könntest Du solche Effekte erzielen, oder Du machst es auf die im Folgenden vorgeschlagene, an TField angelehnte Weise. Beispiel:
Delphi-Quellcode:
TUniClass = class(TObject)
private
  FValue : Variant;
  function GetString : String;
  procedure SetString(Value:String);

  function GetInteger : Integer;
  procedure SetInteger(Value:Integer);

public
  property Value : Variant read FValue write FValue;
  property AsString : String read GetString write SetString;
  property AsInteger : Integer read GetInteger write SetInteger;
end;
implementation

TUniClass.function GetString : String;
begin
  Result := String(FValue);
end;

TUniClass.procedure SetString(Value:String);
begin
  FValue := Value;
end;
//... etc.
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Niels

Registriert seit: 25. Okt 2003
192 Beiträge
 
#4

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 18:55
Hallo,

danke erstmal, aber leider reichen mir die Datentypen integer, real, string, char und boolean nicht, da ich zum Großteil Records, Klassen und Pointer als Datentyp hab. Damit ist variant ungeeignet. Der obige Quellcode war nur ein Beispiel um meine Frage anschaulich zu machen.

Zitat von Leuselator:
Was Du da möchtest, geht so einfach leider nicht. Dazu solltest Du Dich entweder mal in das Thema Interfaces und Mehrfachvererbung reinwurschteln (vorsicht - Heftig!), damit könntest Du solche Effekte erzielen, ...:
Wo liegt das Problem, wenn ich einfach immer eine Instanz der Unterklasse erzeuge mit der ich arbeite? Das müsste doch funktionieren (tut's bis jetzt auch). Wenn es aber etwas gibt, was Variant ähnelt und auch mit Records / Klassen / Pointern funktioniert, dann würde ich das nehmen.

mfg niels
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#5

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 19:14
wenn ich Dich richtig verstanden habe, möchtest Du über ein Klassen-Typecast auf Eigenschaften einer Allgemeinen Klasse zugreifen und über den TypeCast bestimmen, was Dir zurückgeliefert wird.
Ich denke, das wird so nicht gehen, wenn Du die Klasse als allgemeine Klasse erzeugst und anschliessend als Nachkommensklasse Typecastest, da ja dann die Internen Felder und Funktionen der Nachkommensklasse beim Erzeugen der allgemeinen Klasse nicht angelegt wurden.
Bleibt Dir also noch der Weg, eine Art Mehrfachvererbung über Interfaces zu realisieren, wobei das seine Tücken (insbesondere bei der automatischen Referenzzählung und Objektfreigabe) hat.
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Niels

Registriert seit: 25. Okt 2003
192 Beiträge
 
#6

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 19:39
Hallo,

ich versuch nochmal zu erklären was ich mach. Ich hab beispielsweise folgenden Typ:

Delphi-Quellcode:
  TFaktorTyp = class
    GesamtWert: Real;
  end;
// mögliche Faktortypen
  TFTTerm = class(TFaktorTyp)
    Wert: PTerm;
  end;
  TFTVariable = class(TFaktortyp)
    Wert: Integer; // id
  end;
  TFTZahl = class(TFaktorTyp)
    Wert: Real;
  end;
Mein Faktor kann also von einem der 3 Typen sein. Wenn ich dich richtig verstanden hab, soll also folgendes nicht funktionieren?:

Delphi-Quellcode:
procedure bla(typ: Integer; var Faktor: TFaktorTyp);
begin
  case typ of
    1: Faktor := TFTTerm.Create;
    2: Faktor := TFTVariable.Create;
    3: Faktor := TFTZahl.Create;
  end
end;
Es treten dabei jedoch keine Fehler auf und ich kann sowohl auf Gesamtwert als auch auf Wert zugreifen. Will ich Wert auslesen / verändern muss ich dementsprechend dann natürlich auch TFTTerm(Faktor) / TFTVariable(Faktor) oder TFTZahl(Faktor) schreiben. Ich dachte eigentlich, dass das so funktioniert. Aber ich lass mich gern eines Besseren belehren .
Ich find den Weg über die Mutter- / Tochterklassen ehrlich gesagt auch nicht so toll, aber einen besseren hab ich noch nicht gefunden. Wenn du mir ne bessere (nicht so speicherintensive) Möglichkeit sagen kannst dann poste sie bitte.

Den Thread hab ich ja eigentlich gar nicht gestartet weil ich ein Problem hab, sondern weil mich gewundert hat, dass beim Createn der falschen Klassen trotzdem Zuweisungen (teilweise) funktionieren. Aber Chewie hat ja geschrieben warum das manchmal geht und dass es dann Zufall ist.

mfg Niels
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#7

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 19:50
Doch das, was Du zuletzt gepostet hast, geht schon.
Du müsstest dann nur vor dem Casten sichergehen, das Dein Objekt auc vom entsprechenden Typ ist:
Delphi-Quellcode:
procedure Machwas(MitDemDing : TFactorTyp);
begin
  if (MitDemDing is TFTTerm) then TFTTerm (MitDemDing).Machwas;
  if (MitDemDing is TFTVariable) then TFTVariable(MitDemDing).Machwas;
end;
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Niels

Registriert seit: 25. Okt 2003
192 Beiträge
 
#8

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 20:04
Das ist mir schon klar, dass das von dem Typ sein muss. Ok, dann hast du meinen ersten Post also falsch verstanden
Naja macht ja nix. Wie gesagt der Thread war ja nur, weil mich gewundert hatte, dass das überhaupt so funktioniert, wie ich's im 1. Post dargestellt hab. Dass es eigentlich nicht gehen dürfte war mir auch klar.

mfg Niels
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#9

Re: seltsamer Fehler bei der Arbeit mit Klassen

  Alt 31. Aug 2004, 20:07
so ist das eben bei alten Männern - die verstehen die Jugend schonmal falsch
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  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 00:07 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