Autor Beitrag
yogo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: Mo 12.04.10 12:43 
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.

ausblenden 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.


ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mo 12.04.10 12:49 
Ich tippe darauf, dass du keine Instanz der Klasse anlegst. Sprich irgendwas mit:

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


Beste Grüße
yogo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 12.04.10 13:12 
Im Constructor ist alles möglich wenn ich dich jetzt richtig verstehe. ^^
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.