AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

An die Profis nochmal Interface

Ein Thema von EWeiss · begonnen am 13. Mär 2011 · letzter Beitrag vom 15. Mär 2011
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

An die Profis nochmal Interface

  Alt 13. Mär 2011, 16:11
Habe das problem mit meinem Interface der listBox gelößt.
Habe zwar noch beim beenden der anwendung ein Problem .. aber das erstmal bei seite.

Meine Frage..

Warum funktioniert dieser aufruf nicht..

Delphi-Quellcode:
  ISkinListBox = interface
    ['{38EF3B4F-86A1-45D0-A7F3-4E45E125979D}']
    function GetHandle: hWnd;
    property Handle: hWnd read GetHandle;
    procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF;
      InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF);
    procedure InitTrackbar;
  end;
Er zerstört mein Interface bzw .. springt in 'Destroy'

und das hier geht ?

Delphi-Quellcode:
  ISkinListBox = interface
    ['{38EF3B4F-86A1-45D0-A7F3-4E45E125979D}']
    procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF;
      InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF);
    procedure InitTrackbar;
    function GetHandle: hWnd;
    property Handle: hWnd read GetHandle;
  end;
ohne das die Classe oder das interface zerstört wird.

Jemand eine gute Erklärung für mich damit ich den Fehler in zukunft nicht noch einmal mache?
Warum so und nicht anders?

Das hat mich ein paar Tage gekostet dahinter zu kommen.

gruss

Geändert von EWeiss (13. Mär 2011 um 16:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

AW: An die Profis nochmal Interface

  Alt 13. Mär 2011, 17:44
Wo ist denn der Unterschied zwischen den beiden Deklarationen? Nur die Reihenfolge?
Wenn ja, bezweifle ich, das das eine Auswirkung hat. (Obwohl ich mich manchmal täusche )
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: An die Profis nochmal Interface

  Alt 13. Mär 2011, 17:48
Wo ist denn der Unterschied zwischen den beiden Deklarationen? Nur die Reihenfolge?
Wenn ja, bezweifle ich, das das eine Auswirkung hat. (Obwohl ich mich manchmal täusche )
Du wirst es nicht glauben aber es hat eine auswirkung.
Und zwar die das wenn das Handle oben steht mein Interface zerstört wird.

Denn das Handle wird übergeben und steht dieses an erster Stelle dann zerstört es sich
wenn der Font aufgerufen wird.

Ich nehme an das dass Interface mit dem handle steht bzw, fällt.

Ich denke das ist sehr Interessant warum es nicht geht wenn es an oberster stelle steht.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#4

AW: An die Profis nochmal Interface

  Alt 13. Mär 2011, 17:58
Also ich habs jetzt mal ausprobiert und die Variante 1 funzt bei mir ohne Probleme.

Delphi-Quellcode:
unit Unit29;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  ISkinListBox = interface
    ['{38EF3B4F-86A1-45D0-A7F3-4E45E125979D}']
    function GetHandle: hWnd;
    property Handle: hWnd read GetHandle;
    procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF;
      InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF);
    procedure InitTrackbar;
  end;

  TMyTest = class(TinterfacedObject, ISkinListBox)
  private
    function GetHandle: hWnd;
    property Handle: hWnd read GetHandle;
    procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF;
      InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF);
    procedure InitTrackbar;
  public
    destructor Destroy; override;
  end;

  TForm29 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form29: TForm29;

implementation

{$R *.dfm}

procedure TForm29.FormCreate(Sender: TObject);
var
  slb : ISkinListBox;
begin
  slb := tMYTest.Create;
  slb := nil;
end;

{ TMyTest }

destructor TMyTest.Destroy;
begin
  asm int 3; end;
  inherited;
end;

function TMyTest.GetHandle: hWnd;
begin

end;

procedure TMyTest.InitTrackbar;
begin

end;

procedure TMyTest.SetFont(nPointSize: Integer; FontName: PAnsiChar;
  AktForecolor, InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer;
  ShadowColor: COLORREF);
begin

end;

end.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#5

AW: An die Profis nochmal Interface

  Alt 13. Mär 2011, 18:01
Hallo,

ich kann Dir versichern: Die Reihenfolge hat keine Auswirkungen auf das Interface. Du musst einen anderen Fehler haben, der sich zufällig zeigt, je nach Speicherlayout.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: An die Profis nochmal Interface

  Alt 13. Mär 2011, 18:06
Hallo,

ich kann Dir versichern: Die Reihenfolge hat keine Auswirkungen auf das Interface. Du musst einen anderen Fehler haben, der sich zufällig zeigt, je nach Speicherlayout.

Gruß
xaromz
Ok Danke..
Ich glaube euch ja.
Dann wird es wohl so sein wie du sagst.
Muss dann wohl noch was tiefer suchen.

@chaosben
Gutes Anschauungs Material.
Nur ich habe keine Proceduren..

Ich rufe sie so auf
Delphi-Quellcode:
    InstrumentList := CTRL_ListBoxCreate(hMain, PAnsiChar(SKAERO_FOLDER + 'Sound.png'),
      145, 62, 610, 268, ID_INSTRUMENTLIST, False, 18, SKAERO_INACTIVECAPTION);
    InstrumentList.SetFont(SKAERO_CAPTIONFONTHEIGHT, PAnsiChar(SKAERO_TEXTFONT),
      SKAERO_ACTIVECAPTION, SKAERO_INACTIVECAPTION, TRUE, 2, 0);
    SKAERO_SetAnchorMode(InstrumentList.Handle, ANCHOR_RIGHT);
    SKAERO_SetZorder(InstrumentList.Handle, ANCHOR_RIGHT);
und caste quasi in meiner DLL "TSkinListBox" und bekomme als Rückgabe wert das Handle.
Delphi-Quellcode:
function CTRL_ListBoxCreate(hOwner: HWND; FullpathImageName: string; x, y, xW, yH,
  ListID: integer; Visible: Boolean; ItemHeight: Integer; BackColor: COLORREF): ISkinListBox; stdcall;
begin

  result := TSkinListBox.Create(hOwner, FullpathImageName, x, y, xW, yH,
    ListID, Visible, ItemHeight, BackColor);
end;

Ich denke das ist der große Unterschied.

Danke.

gruss

Geändert von EWeiss (13. Mär 2011 um 18:13 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: An die Profis nochmal Interface

  Alt 14. Mär 2011, 09:26
und caste quasi in meiner DLL "TSkinListBox" und bekomme als Rückgabe wert das Handle.
Der Rückgabewert ist kein Handle sondern ein Interface.
Sobald die Variable InstrumentList ihre Gültigkeit verliert und keine andere Referenz auf dieses Interface besteht, wird das Objekt automatisch freigegeben.
Ist InstrumentList: ISkinListBox als Member des Formulars deklariert?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: An die Profis nochmal Interface

  Alt 14. Mär 2011, 12:33
und caste quasi in meiner DLL "TSkinListBox" und bekomme als Rückgabe wert das Handle.
Der Rückgabewert ist kein Handle sondern ein Interface.
Sobald die Variable InstrumentList ihre Gültigkeit verliert und keine andere Referenz auf dieses Interface besteht, wird das Objekt automatisch freigegeben.
Ist InstrumentList: ISkinListBox als Member des Formulars deklariert?
Ja korrekt.
Nein nur in der Procedure in der die Controls erstellt werden.

gruss
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: An die Profis nochmal Interface

  Alt 15. Mär 2011, 15:10
Dann ist ja auch klar warum TSkinListBox beim Verlassen der Prozedur freigegeben wird und danach Zugriffsverletzungen auftreten.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:21 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