![]() |
With Test do
Ich möchte meine SkinEngine in eine DLL auslagern.
Ist es möglich
Delphi-Quellcode:
With Test do
begin ... end; aus der DLL zu übergeben so das ich im programm eine Ableitung von der Classe ohne sie selbst im Sample Projekt anlegen zu müssen zur verfügung habe? Die wäre dann in der DLL definiert
Delphi-Quellcode:
TTest = class
private ... public ... end Oder geht das so einfach nicht. Die DLL soll dann auch mit anderen Sprachen funktionsstüchtig sein. Wobei dann natürlich für die Sprachen eine eigene API angelegt wird. Ich möchte es für den Anwender so einfach wie möglich machen ohne unnütze zusätzliche Funktionen die in der DLL vorhanden sind extra noch anlegen zu müssen. Wie ich Functionen exportiere ist klar aber das ist ja eine besondere Ausnahme. gruss |
AW: With Test do
Hallo,
Das was du vor hast, funktioniert mit Interfaces: DLL:
Delphi-Quellcode:
Irgendein (Auch Nicht-Delphi) Programm:
library Demo;
interface type ITest = interface procedure DoSomething; end; TTest = class(TInterfacedObject, ITest) public procedure DoSomething; end; implementation function CreateTest: ITest; begin Result := TTest.Create; end; exports CreateTest;
Delphi-Quellcode:
Es kann allerdings gut sein, dass dein Interface eine GUID braucht.
ITest = interface
procedure DoSomething; end; function CreateTest: ITest; external 'Demo.dll'; var Test: ITest; begin Test := CreateTest; Test.DoSomething; end; Das sähe dann z.B. so aus:
Delphi-Quellcode:
Die GUID muss natürlich in der DLL und im Programm gleich sein.
ITest = interface
['{D4A90A31-4BCC-498E-BA5C-4D868D6F6573}'] procedure DoSomething; end; Generieren kannst du eine GUID indem du in Delphi im Code Strg+Umschalt+G drückst. Gruß Neutral General |
AW: With Test do
Aber with ist halt ein gefährliches Konstrukt.
|
AW: With Test do
Zitat:
GUIDS generieren wollte ich eigentlich nicht.. Soll ne normale keine ActiveX DLL sein. @Neutral General Danke für die Infos das es grundsätzlich möglich ist. gruss |
AW: With Test do
Ja sorry ihr sagtet es geht über Interface
Gibt es keine andere möglichkeit? Weil ich sonst in meinem ganzes projekt alle classen als interface auslegen muss. Das heißt alles neuschreiben. Wie würdet ihr ansonsten die Functionen exportieren. "With Test do" muß nicht unbedingt funktionieren. Hauptsache der andere Kram läuft. Normalerweise sprechen ich meine Controlls ohne DLL so an!
Delphi-Quellcode:
Jetzt befinden sich diese aber innerhalb der DLL und das macht es so schwierig.
BackgoundFrame := TSkinFrameButton.Create(hMain, SK_FOLDER +
'Aero.png', '', 13, 41, XMIN_SIZE - 26, YMIN_SIZE - 55, ID_AEROBUTTON, 0); SetAnchorMode(BackgoundFrame.Handle, ANCHOR_HEIGHT_WIDTH); SetZorder(BackgoundFrame.Handle, HWND_BOTTOM); Kann ich nicht irgendwie auf die Class casten(verbiegen) ohne sie ändern zu müssen? EDIT: Habs jetzt mal versucht.
Delphi-Quellcode:
In meiner Master Unit hab ich jetzt mal addiert..
type
ISkinFrameButton = interface ['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] end; TSkinFrameButton = class(TInterfacedObject, ISkinFrameButton) private HFrameButton: HWND; Img: cardinal; Style: DWORD; public property Handle: HWND Read HFrameButton; constructor Create(hOwner: HWND; FullpathImageName: string; skLabel: PAnsiChar; x, y, xW, yH, ButID, StateMax: integer; Enabled: Boolean); destructor Destroy; override; end;
Delphi-Quellcode:
Jetzt meldet er mir aber das Create nicht genug parameter hat.
function TSkinFrameButtonCreate: ISkinFrameButton;
begin Result := TSkinFrameButton.Create; end; Wenn ich sie addiere sagt er als Beispiel hOwner wäre unbekannt. Sorry hab mit Interface so noch nicht gearbeitet .. Was ist falsch? Ich befinde mich noch in der DLL gruss |
AW: With Test do
Eine Komponenet braucht auch einen Owner (Parameter der Create-Methode)
|
AW: With Test do
Zitat:
Meine Komponente sind NONVCL.. Wer erbarmt sich und kann mir sagen was falsch ist .. so verstehe ich das nicht. welche propertys sollen hier noch addiert werde.. hmm
Delphi-Quellcode:
Damit ich auf meine class von außen zugreifen kann.
ISkinFrameButton = interface
['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] end; Egal was ich eingebe.. die antwort ist! [Pascal Error] uMaster.pas(56): E2003 Undeclared identifier: 'self' oder [Pascal Error] uMaster.pas(56): E2035 Not enough actual parameters gebe ich sie ein werden sie nicht erkannt.
Delphi-Quellcode:
function SkinFrameButtonCreate: ISkinFrameButton;
begin Result := TSkinFrameButton.Create(hOwner, FullpathImageName, skLabel, x, y, xW, yH, ButID, StateMax, Enabled); end; Zitat:
|
AW: With Test do
Und wie ist das Interface deklariert?
|
AW: With Test do
Zitat:
Delphi-Quellcode:
und die classe welche ich ansprechen will
ISkinFrameButton = interface
['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] end;
Delphi-Quellcode:
TSkinFrameButton = class(TInterfacedObject, ISkinFrameButton)
private HFrameButton: HWND; Img: cardinal; Style: DWORD; public property Handle: HWND Read HFrameButton; constructor Create(hOwner: HWND; FullpathImageName: string; skLabel: PAnsiChar; x, y, xW, yH, ButID, StateMax: integer; Enabled: Boolean); destructor Destroy; override; end; gruss |
AW: With Test do
Naja du musst ja der Create-Methode auch tatsächliche Parameter übergeben also ungefähr so:
Delphi-Quellcode:
Es sei denn du baust deine Funktion eben so um:
function SkinFrameButtonCreate: ISkinFrameButton;
begin BackgoundFrame := TSkinFrameButton.Create(hMain, SK_FOLDER + 'Aero.png', '', 13, 41, XMIN_SIZE - 26, YMIN_SIZE - 55, ID_AEROBUTTON, 0); end;
Delphi-Quellcode:
Beachte!
function SkinFrameButtonCreate(hOwner: HWND; FullpathImageName: string; skLabel: PAnsiChar; x, y, xW, yH, ButID, StateMax: integer; Enabled: Boolean): ISkinFrameButton;
begin Result := TSkinFrameButton.Create(hOwner, FullpathImageName, skLabel, x, y, xW, yH, ButID, StateMax, Enabled); end; Du kannst dann im Hauptprogramm NUR auf Methoden der Klasse zugreifen, die auch im Interface deklariert sind. Da dein Interface keine Methoden besitzt, wirst du mit dem zurückgelieferten Interface nichts anfangen können! |
AW: With Test do
Zitat:
Zitat:
So meckert der Compiler jedenfalls nicht mehr. Danke werde mal versuchen diese jetzt von außen anzusprechen. Muss ich da noch was besonderes berücksichtigen? OK! Export ist klar
Delphi-Quellcode:
Und die Funktion muss jetzt in meiner API eingefügt werden.
export
SkinFrameButtonCreate
Delphi-Quellcode:
Sowie..
function SkinFrameButtonCreate(hOwner: HWND; FullpathImageName: string; skLabel:
PAnsiChar; x, y, xW, yH, ButID, StateMax: integer; Enabled: Boolean): ISkinFrameButton;
Delphi-Quellcode:
Das interface selbst.
type
ISkinFrameButton = interface ['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] end; Zitat:
Ich brauche aber das Handle müßte dann quasi nach dem erstellen das Handle zurückgeben
Delphi-Quellcode:
Das will der Compiler wieder nicht.
ISkinFrameButton = interface
['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] property Handle: HWND Read HFrameButton; end; Zitat:
gruss |
AW: With Test do
Zitat:
Du brauchst eine Getter-Methode: GetHandle.
Delphi-Quellcode:
ISkinFrameButton = interface
['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] function GetHandle: hWnd; property Handle: hWnd read GetHandle; end; |
AW: With Test do
Das muss den Namen "GET" vorangesetzt haben?
so geht es nicht?
Delphi-Quellcode:
gruss
ISkinFrameButton = interface
['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] function HFrameButton: hWnd; property Handle: HWND Read HFrameButton; end; |
AW: With Test do
Delphi-Quellcode:
type
ISkinFrameButton = interface ['{810D9186-F618-4EE6-84C3-054CDBAE1496}'] function GetHandle: hWnd; property Handle: hWnd read GetHandle; end; TSkinFrameButton = class(TInterfacedObject, ISkinFrameButton) private HFrameButton: Hwnd; function GetHandle: Hwnd; end; implementation function TSkinFrameButton.GetHandle: Hwnd; begin Result := HFrameButton; end; |
AW: With Test do
Zitat:
Hab doch erst in 2 Tagen Geburtstag.. und werd 53 :cry: Danke an alle. Ich hoffe das ich jetzt damit klarkomme. gruss |
AW: With Test do
tschuldigung wenn ich pusche :duck:
Habe es jetzt soweit das es compiliert aber leider kommt nichts an. Symbole werden eleminiert vom linker.
Delphi-Quellcode:
was sollte da jetzt noch falsch sein.
procedure AddChildControls(hMain: HWND);
var BackgoundFrame : ISkinFrameButton; begin BackgoundFrame := CTRL_FrameButtonCreate(hMain, SKAERO_FOLDER + 'Panel.png', '', 13, 41, XMIN_SIZE - 26, YMIN_SIZE - 55, ID_AEROBUTTON, 0, False); SKAERO_SetAnchorMode(BackgoundFrame.Handle, ANCHOR_HEIGHT_WIDTH); SKAERO_SetZorder(BackgoundFrame.Handle, HWND_BOTTOM); end; Der Skinfolder wird richtig übergeben aber im weiteren verlauf eleminiert. Zitat:
EDIT: Hat sich erledigt habe den Fehler gefunden. Bei der Übergabe in meiner API Unit habe ich den stdcal vergessen.. während er in der DLL vorhanden war. trotzdem frage ich mich was wohl besser wäre für Interface übergaben ist stdcal OK? gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz