Autor Beitrag
fcg
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 360

WinXP
D3 Prof, D6 Pers
BeitragVerfasst: Fr 19.09.03 13:20 
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:

ausblenden 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:

_________________
.: Wer für alles offen ist, kann nicht ganz dicht sein! :.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
fcg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 360

WinXP
D3 Prof, D6 Pers
BeitragVerfasst: 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

_________________
.: Wer für alles offen ist, kann nicht ganz dicht sein! :.
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.

_________________
Ist Zeit wirklich Geld?
fcg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 360

WinXP
D3 Prof, D6 Pers
BeitragVerfasst: Di 23.09.03 14:04 
das habe ich schon versucht, dann kommt immer diese Fehlermeldung hier:

ausblenden Quelltext
1:
Die Anwendung konnte nicht gestartet werden, weil delphimm.dll nicht gefunden wurde. neuinstallation könnte das Problem behebn.					


:?: :?:

fcg

_________________
.: Wer für alles offen ist, kann nicht ganz dicht sein! :.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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:

ausblenden 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?

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
fcg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 360

WinXP
D3 Prof, D6 Pers
BeitragVerfasst: 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

_________________
.: Wer für alles offen ist, kann nicht ganz dicht sein! :.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
fcg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 360

WinXP
D3 Prof, D6 Pers
BeitragVerfasst: 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

_________________
.: Wer für alles offen ist, kann nicht ganz dicht sein! :.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Steve1024
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: Do 25.09.03 10:04 
Titel: schon probiert....
Hast du schon einaml das probiert: (in der DLL-Datei)
ausblenden 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????