Autor Beitrag
P-A-L
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mi 10.09.08 17:47 
Hallo zusammen,

ich werd noch irre mit diesem Problem! Seit gestern abend funktioniert das Memo.Lines.Clear in meiner Prozedur nicht mehr, obwohl ich daran gar nix geändert hab! Ich seh einfach den Fehler nicht, wahrscheinlich bin ich "betriebsblind", also bitte helft mir!!!

Zum Testen: Das funktioniert ganz normal
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TGrafikForm.FormCreate(Sender: TObject);
begin
  self.Memo_BtnDetail.Lines.Clear;
end;


In einer Unit hab ich ein ListView, welches beim OnSelect-Ereignis ein Memo-Feld mit den Inhalten des ausgewählten Objekts befüllen soll. Hier der Aufruf in der OnSelect-Prozedur:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TGrafikForm.ListView_UnitsSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  _unit:MWW2_Unit;
begin
  _unit:=MWW2_Unit(MWW2_Game.Instance.getUnit(Item.SubItems[0]));
  IF _unit=NIL Then Label1.Caption:='Unit '+Item.SubItems[0]+' could not be found!'
  ELSE BEGIN
    Label1.Caption:=_unit.ID;
    GrafikForm.ShowUnitData(_unit);
  END;
end;


Die Logik darin funktioniert super, hab ich mit F7 getestet.

Nun die Prozedur, die den Text anzeigen soll - Das Problem: Gleich in der ersten Zeile bricht sie ab mit dem Fehler:
Zitat:
Im Projekt WW2.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 004720A0 in Modul 'WW2.exe'. Lesen von Adresse 00000360' aufgetreten.

Daraufhin markiert er die Zeile 'Lines.Clear'... Ich raff's nicht! :(

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  self.Memo_BtnDetail.Lines.Clear;
  ...
end;


Bitte helft mir! *Fleh*
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 10.09.08 17:58 
Moin und :welcome: im Forum!

user profile iconP-A-L hat folgendes geschrieben:
Seit gestern abend funktioniert das Memo.Lines.Clear in meiner Prozedur nicht mehr, obwohl ich daran gar nix geändert hab!
Wann tritt der Fehler auf, beim Programmstart oder erst beim Anklicken eines Items im Listview?

Probier das mal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  if Assigned(_unit) then begin
    Memo_BtnDetail.Lines.Clear; // Self ist normalerweise überflüssig
    // dein restlicher Code
  end
  else
    ShowMessage('_unit ist NIL!');
end;
Was passiert?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
fanspiraphi
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.09.08 18:02 
Hmm schon mal ohne
self .memo...
versucht?

Könntest du mal mehr Zeilen von
ShowUnitData
Zeigen bitte?
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mi 10.09.08 18:06 
Hallo,

häufig wird eine falsche Zeile als die Fehlerverursachende angezeigt. Es handelt sich dann um die Zeile oben drüber, in deinem Fall:

ausblenden Delphi-Quelltext
1:
Label1.Caption:=_unit.ID;					


schau mal nach, ob "_unit:=MWW2_Unit(MWW2_Game.Instance.getUnit(Item.SubItems[0]));" funktioniert hat. vlt ist da was schief gelaufen und dann beim Zugriff auf "_unit.ID" gibts dann nen Fehler...
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mi 10.09.08 18:15 
Das Problem tritt erst auf, wenn ich etwas im ListView auswähle. Das "self" hab ich hinzugefügt, als ich die Fehlermeldung das erste Mal gesehen hatte...

Das Problem ist ja eher, dass der Parameter korrekt übergeben wird (hab's mit F7 gecheckt).

ausblenden 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:
procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  self.Memo_BtnDetail.Lines.Clear;
  max:=_unit.subUnits.Count;
  If max>0 Then
  For i:=0 to (max-1Do
  Begin
    itemX:=_unit.subUnits[i];
    If (itemX is MWW2_Bataillon) Then
    Begin
      bataillon:=MWW2_Bataillon(_unit.subUnits[i]);
      Str(i+1,t);
      Memo_BtnDetail.Lines.Add(t+'.: Bataillon '+bataillon.ID);
    End Else
    If (itemX is MWW2_Unit) THEN
    Begin
      subUnit:=MWW2_Unit(_unit.subUnits[i]);
      Str(i+1,t);
      Memo_BtnDetail.Lines.Add(t+'.: Unit '+subUnit.ID);
    End;
  End Else
  Memo_BtnDetail.Lines.Add('No Sub-Units');
end;


Lines.Add funktioniert übrigens auch nicht mehr...

EDIT: Ich hab in der aufrufenden Prozedur direkt vor dm Aufruf ein Memo_BtnDetail.Lines.Add('TEST') eingefügt, es hat einwandfrei funktioniert... Aber der Parameter wird korrekt übergeben. Wenn ich die Memo-Zeilen rauskommentiere, funktioniert alles ganz normal... Mal davon abgesehen, dass "OnSelect" doppelt ausgeführt wird (ab dem zweiten click).


Zuletzt bearbeitet von P-A-L am Mi 10.09.08 18:24, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 10.09.08 18:21 
Moin!

Probier das mal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  ShowMessage(_unit.ClassName);
  self.Memo_BtnDetail.Lines.Clear;
  max:=_unit.subUnits.Count;
//...
Was wird angezeigt?

Wenn "MWW2_Unit" ausgegeben wird, dann zeig mal die Deklaration der Klasse.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mi 10.09.08 18:26 
user profile iconNarses hat folgendes geschrieben:
Moin!

Probier das mal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  ShowMessage(_unit.ClassName);
  self.Memo_BtnDetail.Lines.Clear;
  max:=_unit.subUnits.Count;
//...
Was wird angezeigt?

Wenn "MWW2_Unit" ausgegeben wird, dann zeig mal die Deklaration der Klasse.

cu
Narses

Ja, dann bekomm ich zwei Messageboxes mit "MWW2_Unit".

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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
unit WW2_Unit;

interface

uses types, classes, WW2_Bataillon;

type MWW2_Unit = class

  strict private
    class var
      pNextID : integer;

  private
    pID : string;
    pUnitLevel : byte;
    pVersion : byte;
    pName : string;
    pDescription : string;
    pPicture : string;

  public
    subUnits : TList;
    belongsToUnit : MWW2_Unit;
    constructor Create (); virtual;
    class property nextID : integer read pNextID write pNextID;
    property ID : String read pID write pID;
    property UnitLevel : byte read pUnitLevel write pUnitLevel;
    property Version : byte read pVersion write pVersion;
    property name : String read pName write pName;
    property description : string read pDescription write pDescription;
    property picture : string read pPicture;
    procedure write(var txt:TStringList);
end;

implementation

{ MDivision }


constructor MWW2_Unit.Create();
var s:string;
begin
  Str(MWW2_Unit.nextID,s);
  ID:='Unit_'+s;
  Inc(MWW2_Unit.nextID);
  Name:=ID+' (Defaultname)';
  belongsToUnit:=NIL;
  subUnits:=TList.Create;
end;

procedure MWW2_Unit.write(var txt: TStringList);
begin

end;

end.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 10.09.08 18:38 
Moin!

Was wird hier angezeigt?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  ShowMessage(Format('%p',[Pointer(Self)]));
  ShowMessage(Self.ClassName);
  self.Memo_BtnDetail.Lines.Clear;
  max:=_unit.subUnits.Count;
//...
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mi 10.09.08 18:44 
user profile iconNarses hat folgendes geschrieben:
Moin!

Was wird hier angezeigt?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  ShowMessage(Format('%p',[Pointer(Self)]));
  ShowMessage(Self.ClassName);
  self.Memo_BtnDetail.Lines.Clear;
  max:=_unit.subUnits.Count;
//...
cu
Narses


Die erste Message sagt '00000000'.
Die zweite sorgt für eine AccessViolation mit der Adresse '00000000'.

Das scheint der Fehler zu sein, danke schonmal! Woran kann das liegen? Und noch wichtiger: Wie behebe ich das???
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 10.09.08 18:49 
Moin!

user profile iconP-A-L hat folgendes geschrieben:
Die erste Message sagt '00000000'.
Dachte ich´s mir doch. ;)

user profile iconP-A-L hat folgendes geschrieben:
Das scheint der Fehler zu sein, danke schonmal! Woran kann das liegen?
Du schreibst irgendwo in Speicher, der dir nicht gehört (bzw. machst eine Bereichsüberschreitung, z.B. bei einem Array; wenn es sich dabei um ein lokales Array handelt, dann kann dabei auch schonmal die eigene Klassenreferenz betroffen sein, hatte ich auch schonmal).

user profile iconP-A-L hat folgendes geschrieben:
Und noch wichtiger: Wie behebe ich das???
Such den fehlerhaften Zugriff. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mi 10.09.08 18:55 
user profile iconNarses hat folgendes geschrieben:
user profile iconP-A-L hat folgendes geschrieben:
Und noch wichtiger: Wie behebe ich das???
Such den fehlerhaften Zugriff. ;)

cu
Narses


Dank Dir erstmal! Also da der Zugriff auf das Memo in den vorhergehenden Prozeduren noch funktioniert, muss der Fehler in einer dieser beiden liegen:

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:
42:
43:
procedure TGrafikForm.ListView_UnitsSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  _unit:MWW2_Unit;
begin
  _unit:=MWW2_Unit(MWW2_Game.Instance.getUnit(Item.SubItems[0]));
  IF _unit=NIL Then Label1.Caption:='Unit '+Item.SubItems[0]+' could not be found!'
  ELSE BEGIN
    Label1.Caption:=_unit.ID;
    Memo_BtnDetail.Lines.Add('Versuche Text hinzuzufügen');
    GrafikForm.ShowUnitData(_unit);
  END;
end;

procedure TGrafikForm.ShowUnitData(_unit: MWW2_Unit);
var
  itemX:TObject;
  bataillon:MWW2_Bataillon;
  subUnit:MWW2_Unit;
  i, max : integer;
  t:string;
begin
  Memo_BtnDetail.Lines.Clear;
  max:=_unit.subUnits.Count;
  If max>0 Then
  For i:=0 to (max-1Do
  Begin
    itemX:=_unit.subUnits[i];
    If (itemX is MWW2_Bataillon) Then
    Begin
      bataillon:=MWW2_Bataillon(_unit.subUnits[i]);
      Str(i+1,t);
      Memo_BtnDetail.Lines.Add(t+'.: Bataillon '+bataillon.ID);
    End Else
    If (itemX is MWW2_Unit) THEN
    Begin
      subUnit:=MWW2_Unit(_unit.subUnits[i]);
      Str(i+1,t);
      Memo_BtnDetail.Lines.Add(t+'.: Unit '+subUnit.ID);
    End;
  End Else
  Memo_BtnDetail.Lines.Add('No Sub-Units');
end;


---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ok, ich hab den kompletten Inhalt der Methode "ShowUnitData" in die Select-Routine gesteckt, alles funktioniert perfekt. Warum ergibt es einen Fehler, wenn ich diese Dinge auslagere?

EDIT:
Selbst wenn die ShowUnitData nur eine einzige Anweisung "Memo.Lines.Clear" enthält, kommt der Fehler... Aber der Parameter '_unit' wird korrekt übergeben. Ich hab auch schon den Parametertyp auf String geändert und einen solchen übergeben, der Fehler passiert trotzdem... :(
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 11.09.08 01:02 
Moin!

user profile iconP-A-L hat folgendes geschrieben:
Ok, ich hab den kompletten Inhalt der Methode "ShowUnitData" in die Select-Routine gesteckt, alles funktioniert perfekt. Warum ergibt es einen Fehler, wenn ich diese Dinge auslagere?
Der Fehler könnte schon wesentlicher früher an einer anderen Stelle auftreten und wird erst da "sichtbar". :nixweiss:

user profile iconP-A-L hat folgendes geschrieben:
Selbst wenn die ShowUnitData nur eine einzige Anweisung "Memo.Lines.Clear" enthält, kommt der Fehler... Aber der Parameter '_unit' wird korrekt übergeben. Ich hab auch schon den Parametertyp auf String geändert und einen solchen übergeben, der Fehler passiert trotzdem... :(
Was passiert denn hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TGrafikForm.ListView_UnitsSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  _unit:MWW2_Unit;
begin
  ShowMessage(Format('%p',[Pointer(Self)]));
  ShowMessage(Self.ClassName);

  _unit:=MWW2_Unit(MWW2_Game.Instance.getUnit(Item.SubItems[0]));
  IF _unit=NIL Then Label1.Caption:='Unit '+Item.SubItems[0]+' could not be found!'
  ELSE BEGIN
    Label1.Caption:=_unit.ID;
    Memo_BtnDetail.Lines.Add('Versuche Text hinzuzufügen');
    GrafikForm.ShowUnitData(_unit);
  END;

  ShowMessage(Format('%p',[Pointer(Self)]));
  ShowMessage(Self.ClassName);
end;
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 11.09.08 11:20 
Benutzt du dynamische Arrays? Wenn ja, oder wenn du nicht sicher bist ob die irgendwo verwendet werden, schalte einfach mal die Bereichsüberprüfung unter Projekt --> Optionen --> Compiler (rechts oben) an und schau, ob dann bevor das Programm zum fraglichen Code kommt ein Fehler auftritt.
Aus Performancegründen solltest du nach dem Test die Prüfung wieder abschalten ;-).
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 11.09.08 13:49 
@Narses: Teste ich, sobald ich wieder zu Hause bin. Vielen Dank schon mal! (Da hätte ich natürlich nach den vorherigen Vorschlägen selbst drauf kommen können...)

user profile iconjaenicke hat folgendes geschrieben:
Benutzt du dynamische Arrays? Wenn ja, oder wenn du nicht sicher bist ob die irgendwo verwendet werden, schalte einfach mal die Bereichsüberprüfung unter Projekt --> Optionen --> Compiler (rechts oben) an und schau, ob dann bevor das Programm zum fraglichen Code kommt ein Fehler auftritt.
Aus Performancegründen solltest du nach dem Test die Prüfung wieder abschalten ;-).

Nein, mit arrays arbeite ich überhaupt nicht. Es ist wirklich nur das was ich hier gepostet hab. Ich kann heut abend gern die ganze Unit hier reinstellen, ich wollte euch nur nicht mit quelltext überschütten...

Ich werde den Test von Narses mal durchlaufen, wenn da auch eine ungültige Speicheradresse steht, müsste ich dieselbe Anweisung in alle vorherigen Prozeduren packen, richtig? Und wenn der Test eine plausible Adresse zeigt? Was dann?

Und wie kann sowas überhaupt passieren? Ich mach doch nix exotisches... Nur ein paar Pointer werden übergeben. Könnte es u.U. daran liegen, dass ich die temporären Objekte nicht neu erstelle (kein Create) sondern nur einen Pointer deklariere und diesem ein bestehendes Objekt zuweise? Vielleicht muss ich dann die Parameter mit irgendeinem Zusatz kennzeichnen? Oder nicht?

*verwirrt ist*
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 11.09.08 18:37 
Die erste Message zeigt 00AD7530,
die zweite TGrafikForm,
dann stürzt das Programm wieder ab.

Wenn ich den Inhalt von ShowUnitDetails auskommentiere, zeigen die beiden letzten Messages dasselbe wie die ersten beiden.

Ich versteh das einfach nicht... :(
jome
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29

Win 2000, XP, VISTA, WIN 7
Delphi 4,5, 2006 Pro., 2007 Pro., Delphi XE
BeitragVerfasst: Do 11.09.08 19:47 
Hallo,

ich vermute, dass das Form nicht korrekt initialisiert wurde. Ist in der folgenden Prozedur das Objekt "Grafikform" überhaupt erzeugt? Ich verstehe nicht, warum hier "Grafikform" explizit angegeben wird. Wenn es nicht "self" entspricht, dann handelt es sich wohl um eine 2. Instanz! Damit wäre auch der 2fache Aufruf der Prozeduren erklärbar.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TGrafikForm.ListView_UnitsSelectItem(Sender: TObject; Item: TListItem;  
  Selected: Boolean);  
var  
  _unit:MWW2_Unit;  
begin  
  _unit:=MWW2_Unit(MWW2_Game.Instance.getUnit(Item.SubItems[0]));  
  IF _unit=NIL Then Label1.Caption:='Unit '+Item.SubItems[0]+' could not be found!'  
  ELSE BEGIN  
    Label1.Caption:=_unit.ID;  
    Memo_BtnDetail.Lines.Add('Versuche Text hinzuzufügen');  
    GrafikForm.ShowUnitData(_unit);
  END;  
end;
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 11.09.08 20:28 
user profile iconjome hat folgendes geschrieben:
Hallo,

ich vermute, dass das Form nicht korrekt initialisiert wurde. Ist in der folgenden Prozedur das Objekt "Grafikform" überhaupt erzeugt? Ich verstehe nicht, warum hier "Grafikform" explizit angegeben wird. Wenn es nicht "self" entspricht, dann handelt es sich wohl um eine 2. Instanz! Damit wäre auch der 2fache Aufruf der Prozeduren erklärbar.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TGrafikForm.ListView_UnitsSelectItem(Sender: TObject; Item: TListItem;  
  Selected: Boolean);  
var  
  _unit:MWW2_Unit;  
begin  
  _unit:=MWW2_Unit(MWW2_Game.Instance.getUnit(Item.SubItems[0]));  
  IF _unit=NIL Then Label1.Caption:='Unit '+Item.SubItems[0]+' could not be found!'  
  ELSE BEGIN  
    Label1.Caption:=_unit.ID;  
    Memo_BtnDetail.Lines.Add('Versuche Text hinzuzufügen');  
    GrafikForm.ShowUnitData(_unit);
  END;  
end;

Du, Jome, bist der größte Delphologe der ganzen Welt!!! Das war tatsächlich der Fehler!!! Wie konnte ich das übersehen???
Zur Erklärung: Ich hatte den Objektnamen geschrieben, um das Prozeduren-Auswahlfenster zu bekommen... *rot werd*

:D

Tausend Dank!!!

Jetzt hab ich noch ne andere Frage, aber dafür mach ich nen neuen Thread auf!!!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 11.09.08 21:47 
Moin!

Ähm, nochmal ganz langsam: :?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TGrafikForm.ListView_UnitsSelectItem(Sender: TObject; Item: TListItem;  
  Selected: Boolean);  
var  
  _unit:MWW2_Unit;  
begin  
  _unit:=MWW2_Unit(MWW2_Game.Instance.getUnit(Item.SubItems[0]));  
  IF _unit=NIL Then Label1.Caption:='Unit '+Item.SubItems[0]+' could not be found!'  
  ELSE BEGIN  
    Label1.Caption:=_unit.ID;  
    Memo_BtnDetail.Lines.Add('Versuche Text hinzuzufügen');  
    GrafikForm.ShowUnitData(_unit);
  END;  
end;
Du möchtest also sagen, dass die markierte Objektreferenz nicht eine - und zwar in diesem Fall die einzige Instanz - von dieser Klasse hier ist: :hair:
ausblenden Delphi-Quelltext
1:
2:
procedure TGrafikForm.ListView_UnitsSelectItem(Sender: TObject; Item: TListItem;  
  Selected: Boolean);
Wenn ja, dann machst du da ziemlich sicher immer noch was ziemlich falsch... :? weil, (normalerweise) sollte das identisch zu:
ausblenden Delphi-Quelltext
1:
2:
3:
    Memo_BtnDetail.Lines.Add('Versuche Text hinzuzufügen');  
    Self.ShowUnitData(_unit);
  END;
sein. Ist das tatsächlich nicht so? Und wenn ja, warum? :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
P-A-L Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Fr 12.09.08 00:35 
Doch, es war tatsächlich die einzige Instanz dieser Klasse. :) Wie gesagt, die Prozedur wurde ja auch aufgerufen, nur eben hat das Objekt sich gleichzeitig im Speicher verlaufen...
Als ich GrafikForm gelöscht hab, lief die ganze Sache fehlerfrei...

Ich hab ja gesagt, dass ich den Fehler nicht verstehe. Aber jetzt weiß ich wenigstens, was es war.

Moderiert von user profile iconNarses: Komplettzitat des letzten Beitrags entfernt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 12.09.08 00:49 
Moin!

user profile iconP-A-L hat folgendes geschrieben:
Doch, es war tatsächlich die einzige Instanz dieser Klasse.
OK, hatte ich vermutet.

user profile iconP-A-L hat folgendes geschrieben:
Wie gesagt, die Prozedur wurde ja auch aufgerufen, nur eben hat das Objekt sich gleichzeitig im Speicher verlaufen...
Prozeduren (und Methoden) verlaufen sich nicht im Speicher... :lol: :|

user profile iconP-A-L hat folgendes geschrieben:
Als ich GrafikForm gelöscht hab, lief die ganze Sache fehlerfrei...
Du sagst damit, dass dieses Konstrukt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Button2Click(Self);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(Format('%p %p',[Pointer(Self),Pointer(Sender)]));
end;
nicht funktioniert, wenn da Form1 steht. Der Code beweist aber das Gegenteil! :?

user profile iconP-A-L hat folgendes geschrieben:
Ich hab ja gesagt, dass ich den Fehler nicht verstehe. Aber jetzt weiß ich wenigstens, was es war.
IMHO hast du da immer noch einen fetten Bug drin, aber OK, du weißt halt nicht wo. 8) Ich würde ihn suchen, denn das wird früher oder später wieder komische Effekte geben, die du dir nicht erklären kannst... :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.