Autor Beitrag
byoean
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Mo 08.01.07 12:28 
Guten Morgen =)

Ich würde gerne in D7 eine Dll schreiben, die einige Komponenten, wie z.B. TPanel, auf meinem Formular erzeugt. Parent soll eine scrollbox sein.
So weit bin ich schon:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
library objects;

uses
  windows,
  SysUtils,
  Classes,
  ExtCtrls,
  StdCtrls,
  Unit1;

{$R *.res}

function create_object(name:PChar):boolean; stdcall;
  var panel : Tpanel;
begin
  panel := TPanel.Create(Form1);
  panel.Parent := form1.scrollbox1; //Wenn ich diese Zeile rausnehme bekomme ich keinen 
                                    //Fehler, doch das Panel erscheint trotzdem nicht
  panel.Caption := name;
  panel.Refresh;
  result := true;

end;

exports
  create_object;

begin
end.


Leider bekomme ich immer einen Fehler, wenn ich Parent zuweisen will, doch ganz ohne Parent erscheint auf meinem Formular auch kein Panel! :-/

Habe irgendwo gelesen, dass man da mit Laufzeitpackages arbeiten sollte. Leider habe ich dazu nichts weiteres gefunden. Hat jemand eine Lösung für mich?
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Di 09.01.07 10:03 
Titel: Nochmal was probiert...
Habe nochwas probiert. Leider klappt das auch nicht... :roll:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
library objects;

uses
  windows,
  SysUtils,
  Classes,
  ExtCtrls,
  StdCtrls,
  Unit1,
  Controls;

  type
    TPanel1  = class(TPanel)
  end;


var Panel : TPanel;
{$R *.res}

function create_object(name:PChar):boolean; stdcall;
begin

  panel := TPanel.Create(Form1);

  with panel do
  begin
    Show;
    Parent := form1.scrollbox1;
    Align := alTop;
    Caption := name;
    Refresh;
  end;

  result := true;

end;

exports
  create_object;

begin
end.


Wo liegt der fehler? :?



Freundliche Grüße =)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.01.07 10:18 
Oh je! Eine Exe hat ihren eigenen "Objektraum" gegenüber der DLL. Wenn du einfach die Unit in die DLL einbindest und die dortige Variable Form1 nutzt, dann ist dies eine uninitialisierte variable, denn du hast Form1 ja in der DLL gar nicht erzeugt. (Willst du ja auch nicht... ;-))

Jedenfalls musst du der DLL schon Form1 übergeben, wenn du aus der DLL darauf zugreifen willst.

Generell kann es aber auch dann Probleme anderer Art geben, aber du kannst ja ausprobieren, ob bei dir so alles geht.
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Di 09.01.07 11:12 
Titel: okaayy...
Hmmmm, also das klingt schonmal logisch :idea: ... danke! =)

Jetzt muss ich also mein Formular an die DLL übergeben. Dazu müsste ich dann also meine Funktion in der DLL mit dem Objekt TForm1 aufrufen... :?:

Also ich versuche das mal. Wenn mir jemand ein bischen Code posten mag, darf das gerne tun :wink:
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Di 09.01.07 12:17 
Titel: Ich bin unfähig
Irgendwie bekomme ich das nicht hin. Scheint komplizierter zu sein als ich dachte. Könnte mir jemand Code-mäßig auf die sprünge helfen? Das wäre sehr nett =)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.01.07 16:38 
Du übergibst das Formular einfach z.B. als Parameter an die Funktion. Denn die rufst du ja aus der Exe heraus auf. Dort hast du ja die Variable Form1 zur Verfügung.
ausblenden Delphi-Quelltext
1:
2:
3:
function create_object(MainForm: TForm1; name:PChar):boolean; stdcall;

create_object(Form1, 'xyz');


BTW: Eigentlich musst du die Unit1 gar nicht in deine DLL einbinden. Du könntest auch mit TForm statt TForm1 arbeiten und die Komponenten mit FindComponent suchen und ansprechen...
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Di 09.01.07 21:21 
So das geht jetzt soweit, aber ich kann mein Parent immer noch nicht zuweisen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
library objects;

uses
  windows,
  SysUtils,
  Classes,
  ExtCtrls,
  StdCtrls,
  Forms,
// Unit1,
  Controls;

  type
    TPanel1  = class(TPanel)
  end;


var Panel : TPanel;
{$R *.res}

function create_object(Form:TForm;name:PChar):boolean; stdcall;
begin

  panel := TPanel.Create(Form);

  with panel do
  begin
    Show;
    Parent := form.FindComponent('ScrollBox1'as TScrollBox; //Verursacht Fehler!
    Align := alTop;
    Caption := name;
    Refresh;
  end;

  result := true;

end;

exports
  create_object;

begin
end.


Der Fehler lautet: "EInvalidCast 'Ungültige Typumwandlung'"

Wie kann ich das denn jetzt lösen?? :(
Aber bisher klappt das ja! Schonmal daaaaaaaaaannkkeeeee :wink:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.01.07 22:39 
Nimm Parent := TScrollBox(form.FindComponent('ScrollBox1'));...
Glaub mir: Es ist nicht dasselbe... ;-)

Ich habe gerade die Erklärung gesucht, die wurde nämlich von ein paar Wochen hier in einem anderen Thread gepostet. Und ich hab sie auch gefunden:
www.delphi-forum.de/...t&start=0#402288

Das zu verlinken ist einfacher, als es selbst zu erklären ;-).

Noch etwas zur Ergänzung: Der Unterschied ist neben der genannten Sachen auch (hängt ja damit zusammen), dass mit as vorher geprüft wird, ob der Cast überhaupt funktioniert. Wenn nicht, dann kommt die von dir beobachtete Fehlermeldung.
Beim direkten Cast, wie ich es hier geschrieben habe, würde eine Zugriffsverletzung kommen, weil der Cast einfach durchgeführt würde, auch wenn das gar nicht geht. Dadurch, dass keine Prüfung durchgeführt wird, funktioniert es aber. Denn der Cast geht, nur die vorherige Prüfung schlägt aus dem im verlinkten Topic erklärten Grund fehl...
Da as aber "sich" auf diese Prüfung verlässt, wird der Cast natürlich gar nicht gemacht und die Exception wird geworfen.
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Do 11.01.07 08:55 
Titel: Interessant!
Das finde ich ja mal interessant! So ein hintergrundwissen finde ich echt mal richtig hilfreich. Darauf wäre ich im Leben nicht gekommen =) danke!

Ich werde das jetzt sofort mal austesten. Bin mal gespannt ob das jetzt alles hinhaut =)

Schöne Grüße
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Do 11.01.07 09:28 
Titel: Never Ending Story
Voller vorfreude kompilierte ich meine DLL und führte dann mein Programm aus. Der Mauszeiger schob sich langsam auf den Button, der die Problemfunktion starten soll. Mein Finger übt immer mehr Kraft auf die Maustaste aus... - "KLICK"... stille. Eine Fehlermeldung auf meinem Desktop :cry:

"TFont kann nicht zu TFont zugewiesen werden" :?:

Das finde ich recht komisch. Habe meinem Panel dann ein paar Font-Eigenschaften gegeben. Leider hat das nichts gebracht. In meiner Scrollbox1 steht ParentFont auch auf true, also sollte mein Panel so und so den Font erben.

Hast du nocheinmal einen Tipp für mich? :wink:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function create_object(Form:TForm;name:PChar;pFont:TFont):boolean; stdcall;
begin

  panel := TPanel.Create(Form);

  with panel do
  begin
    Show;

    Parent := TScrollBox(form.FindComponent('ScrollBox1'));

    font := pFont; //Egal ob ich versuche Font zu zuweisen oder nicht, die Fehlermeldung bleibt

    Align := alTop;
    Caption := name;
    form.Refresh;
  end;

  result := true;

end;
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Do 11.01.07 11:24 
Titel: Google
Habe mal gegoogelt und sogar was gefunden. Leider werde ich daraus nicht so 100%ig schlau. Ist das wirklich die Lösung? Wie setze ich das in meinem Programm um, also wie sieht jetzt letztendlich meine DLL aus und was muss in meiner EXE stehen?

www.swissdelphicente.../topic,449/index.php
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 11.01.07 11:44 
Aber das Panel wird korrekt erzeugt? Also, was passiert, wenn du die Schriftartzuweisung weglässt?

Jedenfalls solltest du TFont auch nicht so zuweisen... Du solltest nur die Eigenschaften übernehmen:
ausblenden Delphi-Quelltext
1:
font.Assign(pFont);					


Wenn es wirklich auch daran nicht liegt, dann übergib doch einfach nur den Namen und die Größe der Schriftart und weise die einzeln zu.

Ach so: Und zu dem verlinkten Beitrag: Du meinst das mit COM? Das halte ich nicht für so sinnvoll... Jedenfalls habe ich das immer nur benutzt, aber nie selbst "eingebaut", insofern könnte ich dazu nicht viel sagen, wie man das macht, wenn du es tatsächlich nutzen wollen würdest.
byoean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Do 11.01.07 11:58 
Also die meldung kommt so und so - egal ob ich einzelne Werte zuweise, oder gleich, wie im zuletzt gepostetem Code, das ganze TFont. Das mit font.assign hat auch keine auswirkung.
Selbst wenn ich das ganze so mache...:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function create_object(Form:TForm;name:PChar;pFont:TFont):boolean; stdcall;
var i:integer;
begin

  panel := TPanel.Create(Form);

  with panel do
  begin
    Parent := TScrollBox(form.FindComponent('ScrollBox1'));
    form.Refresh;
  end;

  result := true;

end;


...erscheint kein Panel. Das mit COM möchte ich nicht unbedingt nutzen. Das wird mir zu aufwändig. Ich will ja eigentlich nur, dass ich das erstellen der Komponenten aus einer DLL steuern kann, damit ich die Übersicht besser bewahren kann. Außerdem ist es dann auch einfacher schnell ein Update zu schreiben (das Programm soll sich nämlich einfach ganz schnell neue DLLs aus dem Inet ziehen).

Ich bin ganz schön hilflos. Leuchtet mit alles nicht so ein :-/
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Mi 14.02.07 09:52 
Hi,
also ich versuche auch gerade (etwas verzweifelt) Komponenten ueber ein Dll zu erstellen. Aber!
Diesen Fehler mit der TFont hatte ich auch. Ich glaube, wenn du folgendes machst, kriegst du den Fehler nichtmehr:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function create_object(Form:TForm;name:PChar;pFont:TFont):boolean; stdcall;  
var i:integer;  
begin   
  panel := TPanel.Create(Form);   
  with panel do  
  begin  
    Parent := TScrollBox(form.FindComponent('ScrollBox1')).Parent;
    form.Refresh;  
  end;   
  result := true;   
end;


Allerdings erscheint immer noch nichts - ich will nen SpeedButton erzeugen. Werd aber nicht aufgeben!

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Mi 14.02.07 14:25 
Ich bin mir nicht sicher, weil ich den Fehler vor jahren mal hatte, aber ich glaube, es könnte was mit den statischen Laufzeit-Packages zu tun haben, wobei dann die Erklärung so aussehen würde : Beim Erstellen des TForm1 in deiner exe wird im VCL-Package (welches im Moment in deiner exe und in deiner DLL seperat existiert) werden Variablen initialisiert. Rufst Du nun deine exe auf um dort visuelle Komponenten auf dein Formular zu legen, benutzen beide ja nicht die gleiche VCL (also DLL und EXE haben je eine eigene Kopie mit allen initialisierten Variablen etc.).
Benutzt Du da allerdings dynamisch hinzugelinkte VCL/RTL, beuzten DLL und EXE die gleiche Kopie, da die bpl eine DLL ist und diese nur einmal in deinem Adressraum liegt und deswegen für DLL und EXE die Variablen gemeinsam hat.

Wie gesagt, ich hatte das mal vor Jahren, und wenn das so ist, dann wäre das obige eine logische Erklärung für das Verhalten.

Ich benutze übrigends nur MDIChild-Fenster aus der DLL, mein Hauptprogramm hat nur 1 Fenster und ich lade aus DLLs auch Teilbereiche von Fenstern aus anderen DLLs und habe das problem nicht, allerdings benutze ich auch dynamisch zugelinkte BPLs. Versuch es also mal in Deinem Compiler-Settings.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw