Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem bei Zugriff auf Eigenschaft eines Objektes


yogo - Mo 12.04.10 12:43
Titel: Problem bei Zugriff auf Eigenschaft eines Objektes
Hallo,

Ich wollte aus Jux ein Chatprogramm erstellen, mit dem Ziel, dass man damit irgendwann durch Firewalls hindurch Dateien verschicken kann. Weil es mir irgendwann zu doof wurde stets, wenn ich mein Protokoll geändert habe, den Quelltext aus dem Server in das Clientprojekt zu kopieren, oder umgekehrt, habe ich in einer seperaten Unit ein Klasse erstellt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  Botschaft = class
    gfhrlch: boolean;//true, wenn Trennzeichen falsch benutzt werden
    befehl: string;
    absender: string;
    empfaenger: string;
    nachricht: string;
    parameter: string;
    function MsgToStr: string;//baut aus der Botschaft einen String zum Verschicken + CLRF
    procedure CFromStr(eingabe: string);//füllt die Botschaft mit den Informationen aus dem String mit CLRF am ende
  end;


Dooferweise kommt nun eine Acces-Violation in 00404654 Read of add 00000008.
Die Addressen varieren, je nachdem in welcher Zeile ich eine Eigenschaft der Botschaft verändere.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
procedure Botschaft.CFromStr(eingabe: string);
var laeng, zhlr, i: integer;
    drinnen: boolean;
begin
  {$O-}
  laeng := length(eingabe);
  drinnen := false;
  gfhrlch := false;//<- hier tritt der Fehler auf: nach asm: mov eax,[ebp-$04]
                                                     //mov byte ptr [eax+$04}, $00
  i := 0;
  for zhlr := 1 to laeng do
  begin
    if drinnen = false then
    begin
      if eingabe[zhlr] = '"' then
      begin
        drinnen := true;
        i := i + 1;
      end;
    end
    else
      if ((eingabe[zhlr] = '"'and (eingabe[zhlr+1] = '|'and
        (eingabe[zhlr+2] = '#'and (eingabe[zhlr+3] = '+'and
        (eingabe[zhlr+4] = '|')) or (zhlr = laeng) then
      begin
        if (zhlr = laeng) and (eingabe[zhlr] <> '"'then gfhrlch := true;
        drinnen := false;
      end
      else
        case i of
          1:befehl := befehl + eingabe[zhlr];//wenn ich die Zuweisung oben auskommentiere, bricht er hier ab
          2:absender := absender + eingabe[zhlr];
          3:empfaenger := empfaenger + eingabe[zhlr];
          4:nachricht := nachricht + eingabe[zhlr];
          5:parameter := parameter + eingabe[zhlr];
        else
          gfhrlch := true;
        end;
  end;//for zhlr := 1 to length(tmpstr)
{$O-}
end;


Der Fehler tritt auf, egal ob ich das Handle des Objekts, in dem die Eigenschaft geändert werden soll(Der Aufruf "Botschaft.gfhrlch := true" kommt nicht am Parser vorbei: Method identifier expected) oder die Optimierung aus ist. Die Watch kann mir auch nicht weiterhelfen, das Objekt ist in einer anderen Form deklariert und die Klasse kann ich ja nicht auf die Watch setzen...

Wäre super, wenn mir jemand sagen könnte, warum das nicht geht oder wie es besser geht.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 12.04.2010 um 15:38


Tastaro - Mo 12.04.10 12:49

Ich tippe darauf, dass du keine Instanz der Klasse anlegst. Sprich irgendwas mit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
   Blablub: Botschaft;
begin
   Blablub := Botschaft.create;
   Blablub. ...
   BlaBlub.free;
end;


Beste Grüße


yogo - Mo 12.04.10 12:58

Vielen dank! :D Du hast ins Schwarze getroffen. Ich hab schon Eltern, Lehrer und Bücher befragt ohne eine Lösung zu finden.

tmpmsg: Botschaft; hatte ich bedacht(andere Unit), aber Create und Free hab ich verschlafen.
Da hab ich gleich noch ne Frage im Anschluss: Ist es möglich im Konstruktor die Eigenschaften eines Objektes zu setzen?(Ich will mir das CFromStr sparen)


thepaine91 - Mo 12.04.10 13:12

Im Constructor ist alles möglich wenn ich dich jetzt richtig verstehe. ^^


Gausi - Mo 12.04.10 13:18

Hat zwar nicht direkt was mit dem Thema zu tun, aber es ist üblich, Klassennamen mit einem T vorne zu wählen, hier also TBotschaft. Ist zwar nur eine Kleinigkeit, erleichtert aber hinterher die Fehlersuche, da man dann sofort zwischen Klassennamen und Variable unterscheiden kann. :D

Zur Nachfrage: Du kannst einen Konstruktor mit Parametern schreiben, also ja.