Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - aus DLL auf einen Button zugreifen?
fcg - Fr 19.09.03 13:20
Titel: aus DLL auf einen Button zugreifen?
hi q all
ich habe eine DDL Datei, in der ich auf einen Button zugreifen möchte, der auf der Form1 liegt. Wie mache ich das?? (habe die Form als Unit in die DLL eingebunden, und der Code mit:
Delphi-Quelltext
1:
| form1.button1.caption := 'hallo'; |
compiliert wird auch, aber passsieren tut nix später im Programm....) Keine Fehlermeldung kein Gar nichts!
thÄnxX
fcg
//uhh falsche Sparte... MIST!" :oops:
MSCH - Fr 19.09.03 14:22
geh mal davon aus, dass weder die DLL noch das Programm voneinander wissen. Es reicht definitiv nicht, die Uses Deklaration entsprechender Form einzubinden. Eine DLL ist nichts weiter als ein (fast) ausführbares Programm. Wie soll die DLL von deiner Form also etwas wissen, da nur nur die Objektdeklaration importierst (die Unit) aber nicht das Objekt als solches (MyForm=TMyForm.Create(), MyForm ist das Objekt, TMyFOrm die Deklaration)
Entweder übergibst du der DLL deine komplette Form (nach deren Initialisierung) in einer entsprechenden Funktion oder zumindest den Fensterhandle des betreffenden Controls.
grez
msch
fcg - Di 23.09.03 13:34
ich versuche das nun schon seit 2 Tagen, ich komme aber nicht weiter. Hast du zufällig nen Code Beispiel??
thÄnxX
fcg
AndyB - Di 23.09.03 13:45
Mit Packages (Borlands Erweiterung für DLLs) ist das recht einfach zu lösen.
Du erstellst ein neues Package und fügst alle Units der Hauptanwendung hinzu. Im Hauptprogramm stellst du nun unter den Optionen ein, dass diese Package benutzt werden soll. Das selbe machst du auch in den Projektoptionen der DLL. Nun kannst du die Unit in der DLL so benutzen, als ob sie direkt in der DLL wäre.
fcg - Di 23.09.03 14:04
das habe ich schon versucht, dann kommt immer diese Fehlermeldung hier:
Quelltext
1:
| Die Anwendung konnte nicht gestartet werden, weil delphimm.dll nicht gefunden wurde. neuinstallation könnte das Problem behebn. |
:?: :?:
fcg
MSCH - Di 23.09.03 18:59
Ich verstehs nicht. Ob nun die DLL die Form-Deklaration als unit kennt oder nicht - sie weiss immer noch nicht, wo das objekt sich befindet.
Beispiel:
Du hast eine Form mit einem Button und eine DLL die auf den Button zugreifen möchte, bssp. den Caption ändern:
Da ich mir den Quelltext sparen möchte, nur auszusweise:
MyButton ist ein TButton ist in TForm des Programms deklariert und funktioniert.
in der DLL gibts eine Procedure, die den Caption ändern soll:
Quelltext
1: 2: 3: 4: 5:
| procedure DLLProcChangeButtonCaption(TB: TButton); begin TB.Caption:='bla'; ... end; |
Ob nun dynamisch oder statisch, gibts ja eine Referenz auf diese Funktion in der DLL für dein Hauptprogramm:
procedure DLLProcChangeButtonCaption(TB:TButton);external.....
diese Funktion ruft nun dein Hauptprogramm einfach auf und sollte funktionieren.
grez
msch
P.S. oder steh ich aufm Schlauch?
fcg - Mi 24.09.03 12:09
das ist mir soweit klar. Aber da taucht dann nen Problem auf, wenn ich Prozeduren auslagern mächte, das ich ne menge an Parametern übergebn muss. Und zwar alle, auf die ich in der Prozedur zugreifen möchte....
Wenn ich in einer DLL Prozedur die Caption von zum Beispiel 7 Buttons, 15 Panels etc ändern will, is dat ne Menge abreit die zu übergeben!!
Ich dachte einfach es geht ein bissle einfacher, indem ich direkt aus der DLL auf die Form zugreifen. Aber dann muss ich es glaube cih anders lösen...
thÄnxX
fcg
MSCH - Mi 24.09.03 12:45
Leider. Das ist das "System" bei DLLs. Du kannst sie in allen Projekten verwenden, aber nur wenn der Code das auch hergibt. Was bringst, wenn du Funktionen auslagerst, die nur für die eine Anwendung kreierst? Ausser dass die Größe der EXE-Datei etwas kleiner wird, hast du keine Vorteile. Etwas anderes sind Resourcen-Dlls. Die aber keinen Code sondern nur Resourcen enthalten. (Sprachen, Bilder etc)
grez
msch
fcg - Mi 24.09.03 13:07
meine eigentliche Idee, war mit DLL die Updates besser verwalten zu können. So muss immer erst eine neue Anwendungsdatei rutnergeladen werden, sonst hätte man das auf einzelne (kleiner, kb mäßige) DLL's beschränken können!
fcg
MSCH - Mi 24.09.03 14:09
Das ist nicht so einfach zu realisieren. Du müsstest jede Form in eine DLL auslagern, also dein Programm nicht nur auf Klassenebene kapseln, sondern auch noch physikalisch. Das wird aber in den meisten Fällen nicht funktionieren. Form A brauch Funktion B der Form C die Form D brauch u.s.w. oder sämtlichen Code der Forms in DLLs auslagern und in den Rümpfen der Form.Procedure die DLL callen - mit Parameter etc.
Ein Patchprogramm wäre da besser, welches nur geänderte Teile der Exe-Datei runterlädt und das vorhandene Progg patcht. So wie es heut zu tage usus ist. Bei PE- Exe dürfte das auch nicht so schwierig sein, ist ja von Hause aus schon segmentiert.
grez
msch
Steve1024 - Do 25.09.03 10:04
Titel: schon probiert....
Hast du schon einaml das probiert: (in der DLL-Datei)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| uses Forms, StdCtrls;
[...]
procedure DLLSetButton(AForm:TForm); var I :Integer; begin FOR I := 0 TO AForm.ComponentCount-1 do Begin IF AForm.Components[I].ClassName = tButton.ClassName Then Begin IF TButton(AForm.Components[I]).Name = 'Button1' THEN TButton(AForm.Components[I]).Caption := 'Hallo'; [...] //oder je nach dem end; end; end; |
Das sollte doch normaler weise funzen, oder nicht????
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!