Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   An die Profis nochmal Interface (https://www.delphipraxis.net/159078-die-profis-nochmal-interface.html)

EWeiss 13. Mär 2011 15:11

An die Profis nochmal Interface
 
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

chaosben 13. Mär 2011 16:44

AW: An die Profis nochmal Interface
 
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 :-D)

EWeiss 13. Mär 2011 16:48

AW: An die Profis nochmal Interface
 
Zitat:

Zitat von chaosben (Beitrag 1088140)
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 :-D)

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

chaosben 13. Mär 2011 16:58

AW: An die Profis nochmal Interface
 
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.

xaromz 13. Mär 2011 17:01

AW: An die Profis nochmal Interface
 
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

EWeiss 13. Mär 2011 17:06

AW: An die Profis nochmal Interface
 
Zitat:

Zitat von xaromz (Beitrag 1088148)
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

Blup 14. Mär 2011 08:26

AW: An die Profis nochmal Interface
 
Zitat:

Zitat von EWeiss (Beitrag 1088151)
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
Delphi-Quellcode:
InstrumentList: ISkinListBox
als Member des Formulars deklariert?

EWeiss 14. Mär 2011 11:33

AW: An die Profis nochmal Interface
 
Zitat:

Zitat von Blup (Beitrag 1088276)
Zitat:

Zitat von EWeiss (Beitrag 1088151)
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
Delphi-Quellcode:
InstrumentList: ISkinListBox
als Member des Formulars deklariert?

Ja korrekt.
Nein nur in der Procedure in der die Controls erstellt werden.

gruss

Blup 15. Mär 2011 14:10

AW: An die Profis nochmal Interface
 
Dann ist ja auch klar warum TSkinListBox beim Verlassen der Prozedur freigegeben wird und danach Zugriffsverletzungen auftreten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 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