AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi self kaputt? Listen-Initialisierung wegoptimiert? sonstiges?
Thema durchsuchen
Ansicht
Themen-Optionen

self kaputt? Listen-Initialisierung wegoptimiert? sonstiges?

Ein Thema von DGL-luke · begonnen am 3. Aug 2006 · letzter Beitrag vom 4. Aug 2006
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

self kaputt? Listen-Initialisierung wegoptimiert? sonstiges?

  Alt 3. Aug 2006, 21:50
Hallo,

ich habe eine Klasse, die eine Komponente wrappt und damit unter anderem eine Chain von Mausereignissen ermöglciht:

Delphi-Quellcode:
function TPanelManager.CreateElement(Parent: TWinControl; Visible: Boolean): Boolean;
begin
  Element := TPanel.Create(Parent);
  Element.Parent := Parent;
  Element.Visible := Visible;

  self.MouseDownEvents := TList.Create;
  self.MouseUpEvents := TList.Create;
  self.MouseMoveEvents := TList.Create; //<-!!

  Element.OnMouseDown := PanelMouseDown;
  Element.OnMouseUp := PanelMouseUp;
  Element.OnMouseMove := PanelMouseMove; //<-!!

  Result := true;
end;

procedure TPanelManager.PanelMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var ListEvent: Pointer;
    xy: TFormPanel;
    c: TControl;
    i: Integer;
begin
  xy := self;

  c := xy.GetElement;

  if xy.MouseMoveEvents.Count > 0 then //(1)
    for i := 0 to xy.MouseMoveEvents.Count-1 do //<-!!
      if Assigned(xy.MouseMoveEvents[i]) then
        TMouseMoveEvent(xy.MouseMoveEvents[i]^)(Sender, Shift, X, Y);
end;
An den markierten ("!!") Stellen sieht man es ja schön - alles initlisiert, es sollte eigentlich nichts schiefgehen.
Aber man sieht ja schon an den etwas wirren Zuweisungen im PanelMouseMove - etwas stimmt doch nicht.

Denn bei "(1)" knallt es - und zwar gewaltig. AV beim Lesen. Warum? Ich zerstöre die Liste nirgends, und vor der Erstellung wird das Event (private-feld in TPanelManager) ja wohl nie ausgelöst. Es knallt schließlich auch, wenn ich mit der Maus über das Control fahre.

TPanelManager ist übrigens von TInterfacedObject abgeleitet und implementiert ein Interface. Er wird auch gerne mal gequeryt, der refcount liegt zur ausführungszeit von PanelMouseMove typischerweise bei 25.

Wo gehen also die Listen verloren?!
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:11
Du weist fügst einen Funktionszeiger in die Liste ein, und willst nachher den Funktionszeiger aufrufen, auf den der ursprüngliche Zeiger zeigt?

Kurz: gehts denn, wenn du das ^ weglässt?
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:12
ähm.. nein... dann meckert der compiler.

EDIT: eigentlcih will ich ja auch nicht auf den zeiger selbst zuggreifen (seine adresse zur basisiadresse eines methodenaufrufs machen, wenn ich da weit genuug informiert bin), soindern auf seinen wert, deshalb dereferenziere ich ihn.

Speicherinhalt an Adresse des Zeigers = Wert des Zeigers = Adresse des Events!

Im übrigen komme ich gar nicht so weit, bei durchsteppen springt der Compiler in die markierte zeile, sobald ich F9 drücke (also die markeirte zeile ausführe), knallts, sprich, es knallt beim zugriff auf TList(irgendwo).Count.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:19
Ich bin mir nicht sicher ob du weist was du da machen möchtest.

Als wichtigste Info schaue in die Hilfe bei "TMethod" und dessem Aufbau als Record mit 2 Zeigern = 8 Bytes. TMethod ist der Prototyp für alle Events wie OnClick() etc.pp.
Nun frage dich mal was für Datentypen in der TList gespeichert werden, ja es sind Zeiger = 4 Bytes.

Somit kann ein EventTyp mit 8 Bytes nicht direkt in einer TList gespeichert werden, also vermute ich mal das du das Event als dynamischen Record alloziert hast und dann in der TList diesen Zeiger gespeichert hast, weswegen du derefernzierst. Leider sieht man in deinem Source eben nicht was du in die TList speicherst.

Alles in allem habe ich schon einige deiner Sourcen hier in der DP gesehen und mir viel dabei auf das du zu oft mit harten TypCast arbeitest statt mit eigenen Datentypen bzw. mit den richtigen Datentypen zu arbeiten.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:20
auf welche Art und weise schreibst du die Events in die TList? Der Teil fehlt irgendwie. Ich hoffe du schreibst das Event nicht direkt auf die in das TList-Item.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#6

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:26
Ähm... noch einmal:

Es knallt bereits BEVOR ich irgendeinen Event aus der Liste hole, geschweige denn ausführe. Es knallt beim Zugriff auf TList.Count, genauer MouseMoveEvents.Count.

@negaH: Harte Casts mach ich in zwei Fällen:

1. Wenn ich in der selben Prozedur bereits einen weichen Cast ausgeführt habe, also weiss, dass ich den richtigen Typen in der Hand habe und mir damit Overhead sparen kann

2. Wenn ich mit TList arbeiten muss, weil ich mir immer noch kein Codeschnipsel für typisierte Listen zurechtgelegt habe *das jetzt gleich mach*

Nur so aus Spaß das Hinzufügen der Methodenzeiger:

Delphi-Quellcode:
function TFormPanel.AddOnMouseMove(Event: TMouseMoveEvent): Integer;
begin
  Result := MouseMoveEvents.Add(@Event);
end;
Falsch oder verkehrt?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:29
Einen Zeiger auf eine lokale Variable sollte man nicht dauerhaft speichern...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#8

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:32
Zitat:
Delphi-Quellcode:
function TFormPanel.AddOnMouseMove(Event: TMouseMoveEvent): Integer;
begin
  Result := MouseMoveEvents.Add(@Event);
end;
Upps erwischt, schau dir in der Hilfe TMethod an, dann vielleicht noch TOnClickEvent, damit du weist was obiges Event als Speicherstuktur bedeutet und dann frage dich worauf der Zeiger der mit @Event referenziert wierd tatsächlich zeigt. (Tipp: was ist ein Stack? und wozu braucht man den ?)

Gruß hagen
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#9

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:33
Wer wo lokal?

Du wirst mir doch wohl nicht weismachen wollen, dass von Event hier eine lokale Kopie erzeugt wird?!

Ich ändere das mal geschwind mit ein paar consts...

@negaH: Warte, da muss ich kurz drüber nachdenken.

EDIT: Aber ändert das irgendwas daran, dass ich auf MouseMoveEvents (die Liste!) offenbar immer noch nicht zugreifen kann bzw. dass ich keinen gütligen Zeiger drauf hab?

EDIT: Aber ein TMouseMoveEvent ist doch nur eine procedure of object... ist das dann = TMethod? und wo kommt dann eigentlich self her, ist das code oder data?

Fragen über Fragen... aber danke, dass ihr euch alle so Mühe gebt mit mir
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: self kaputt? Listen-Initialisierung wegoptimiert? sonsti

  Alt 3. Aug 2006, 22:36
völlig falsch!! Du addest in die Liste die Adresse wo die Variable auf dem Stack liegt. Nach verlassen der Methode liegt die Methode dann aber nicht mehr auf dem Stack und somit zeigt dein Zeiger auf was ganz anderes.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:47 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