![]() |
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:
Er zerstört mein Interface bzw .. springt in 'Destroy'
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; und das hier geht ?
Delphi-Quellcode:
ohne das die Classe oder das interface zerstört wird.
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; 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 |
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) |
AW: An die Profis nochmal Interface
Zitat:
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 |
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. |
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 |
AW: An die Profis nochmal Interface
Zitat:
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:
und caste quasi in meiner DLL "TSkinListBox" und bekomme als Rückgabe wert das Handle.
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);
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 |
AW: An die Profis nochmal Interface
Zitat:
Sobald die Variable InstrumentList ihre Gültigkeit verliert und keine andere Referenz auf dieses Interface besteht, wird das Objekt automatisch freigegeben. Ist
Delphi-Quellcode:
als Member des Formulars deklariert?
InstrumentList: ISkinListBox
|
AW: An die Profis nochmal Interface
Zitat:
Nein nur in der Procedure in der die Controls erstellt werden. gruss |
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 23:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz